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/>