Qt Designer: изменение базового класса окна

Я уже создал второе окно для моего приложения в Qt Designer. Я прочитал, что QMainWindow будет неправильным классом для второго окна (в основном это должен быть только какой-то диалог), поэтому я хотел бы изменить базовый класс.

Мой вопрос (ы):

  • Есть ли способ изменить базовый класс без создания нового окна и копирования моего кода в новые файлы?
  • Может кто-нибудь объяснить, когда использовать QMainWindow, QDialog и QWidget? Я не нашел хороших объяснений различий между этими тремя базовыми классами в Qt.

Ответ 1

  • Чтобы изменить базовый класс, вы можете изменить только : public QMainWindow на : public QWidget (или наоборот) в файле заголовка и, конечно же, *.cpp.

  • В основном все три являются QWidgets, каждый со специальной функциональностью или для определенных целей. Насколько я знаю, QMainWindow имеет панели инструментов, меню и доки, QDialog всегда будет отображаться как отдельное окно (например, блокирование, неблокирование и т.д.), А сам QWidget является базовым классом. То есть QPushButton, QCombobox также получены из QWidget. На мой взгляд, было бы лучше использовать только один QMainWindow, поскольку он должен быть центральной точкой взаимодействия/навигации для пользователя.

EDIT: Я забыл упомянуть, что также нужно изменить UI файл, т.е. С помощью текстового редактора, изменить строку (я думаю, 4-я строка)

<widget class="QMainWindow" name="YourClassName">

к

<widget class="QWidget" name"YourClassName">

и удалите все связанные с QMainWindows части (меню, панель инструментов,...) и закрывающий тег для центрального виджета.

Благодаря alexisdm для наконечника.

Ответ 2

Вы можете использовать подход @Robert, но самый простой способ - создать новый класс формы в Qt Designer, а затем в Qt Designer скопировать содержимое исходного виджета и вставить его в новый.

См. .

Ответ 3

Я создал новый класс Former Form, один раз в качестве QMainWindow и один раз в качестве QDialog, и сравнил их в Git, чтобы увидеть различия.

Просто следуйте файлу патча и замените строки по мере необходимости:

diff --git a/mydialog.cpp b/mydialog.cpp
index e4f30f2..ccf8831 100644
--- a/mydialog.cpp
+++ b/mydialog.cpp
@@ -2,7 +2,7 @@
 #include "ui_mydialog.h"

 MyDialog::MyDialog(QWidget *parent) :
-    QMainWindow(parent),
+    QDialog(parent),
     ui(new Ui::MyDialog)
 {
     ui->setupUi(this);
diff --git a/mydialog.h b/mydialog.h
index 8d12675..3a16393 100644
--- a/mydialog.h
+++ b/mydialog.h
@@ -1,13 +1,13 @@
 #ifndef MYDIALOG_H
 #define MYDIALOG_H

-#include <QMainWindow>
+#include <QDialog>

 namespace Ui {
 class MyDialog;
 }

-class MyDialog : public QMainWindow
+class MyDialog : public QDialog
 {
     Q_OBJECT

diff --git a/mydialog.ui b/mydialog.ui
index 6e95365..8d09b98 100644
--- a/mydialog.ui
+++ b/mydialog.ui
@@ -3,7 +3,7 @@
  <comment/>
  <exportmacro/>
  <class>MyDialog</class>
- <widget name="MyDialog" class="QMainWindow">
+ <widget name="MyDialog" class="QDialog">
   <property name="geometry">
    <rect>
     <x>0</x>
@@ -15,9 +15,6 @@
   <property name="windowTitle">
    <string>MainWindow</string>
   </property>
-  <widget name="menubar" class="QMenuBar"/>
-  <widget name="centralwidget" class="QWidget"/>
-  <widget name="statusbar" class="QStatusBar"/>
  </widget>
  <pixmapfunction/>
  <connections/>