我已经在 Qt Designer 中为我的应用程序创建了第二个窗口。我读到 QMainWindow 将是第二个窗口的错误类(基本上应该只是某种对话框),所以我想更改基类。
我的问题是:
- 有没有办法在不创建新窗口并将我的代码复制到新文件中的情况下更改基类?
- 有人可以解释一下何时使用 QMainWindow、QDialog 和 QWidget 吗?对于 Qt 中这三个基类之间的差异,我没有找到很好的解释。
我已经在 Qt Designer 中为我的应用程序创建了第二个窗口。我读到 QMainWindow 将是第二个窗口的错误类(基本上应该只是某种对话框),所以我想更改基类。
我的问题是:
要更改基类,您只能更改头文件中的: public QMainWindow
to : public QWidget
(反之亦然),当然还有 *.cpp。
基本上这三个都是 QWidget,每个都有特殊功能或用于特定目的。据我所知,QMainWindow 具有工具栏、菜单栏和停靠栏,QDialog 将始终显示为单独的窗口(例如阻塞、非阻塞等),而 QWidget 本身是基类。即QPushButton、QCombobox 也是从QWidget 派生的。在我看来,最好只使用一个 QMainWindow 因为它应该是用户交互/导航的中心点
编辑:我忘了提到 UI 文件也必须更改,即使用文本编辑器更改行(我认为是第 4 行)
<widget class="QMainWindow" name="YourClassName">
至
<widget class="QWidget" name"YourClassName">
并删除所有与 QMainWindows 相关的部分(菜单栏、工具栏……),以及中央小部件的封闭标签。
感谢 alexisdm 的提示。
您可以采用@Robert 的方法,但最简单的方法是在 Qt Designer 中创建一个新的表单类,然后在 Qt Designer 中复制原始小部件的内容并将它们粘贴到新的小部件中。
另请参阅。
我创建了一个新的 Designer 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/>