Qt Designer:更改窗口的基类

26

我已经在Qt Designer中为我的应用程序创建了第二个窗口。

我发现QMainWindow不适合作为第二个窗口的基类(第二个窗口应该只是某种对话框),因此我想改变基类。

我的问题是:

  1. 是否有一种方法可以更改基类,而无需创建新窗口并将代码复制到新文件中?
  2. 请问有人能够解释何时使用QMainWindow、QDialog和QWidget吗?我没有找到关于这三个主要类之间区别的好的解释。

这个相关的问题帮助了我:https://dev59.com/HFjUa4cB1Zd3GeqPUcfR - azalea
3个回答

10
  1. 要更改基类,你只需要在头文件中将: public QMainWindow更改为: public QWidget(或者反过来),当然还要更改*.cpp文件。

  2. 从根本上说,这三个都是QWidgets,每个都有特殊的功能或专门用于特定目的。据我所知,QMainWindow具有工具栏、菜单栏和停靠窗口,QDialog将始终显示为单独的窗口(例如,阻塞、非阻塞等),QWidget本身是基类。也就是说,QPushButton、QCombobox也是从QWidget派生出来的。我认为最好只使用一个QMainWindow,因为它应该是用户交互/导航的中心点。

编辑:我忘了提到还必须更改UI文件,即使用文本编辑器更改行(我想是第4行)。

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

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

删除所有与QMainWindows相关的部分(菜单栏、工具栏等),以及中央控件的包含标签。

感谢alexisdm的提示。


1
仅更改基类是不够的:ui文件是为QMainWindow(设计师中树形结构顶部的窗口小部件)创建的,因此生成的setupUi函数仍然期望指向QMainWindow的指针。 - alexisdm
告诉我如果我错了,UI文件是根据类的.h自动生成的,因此通过更改基类也会更新.ui和ui_文件。 - Robert
3
不,ui_xxx.h文件只是基于.ui文件生成的。而且设计师不允许在选择了顶部小部件的基类后更改它,此时唯一的方法是在设计师中将所有小部件复制/粘贴到另一个具有QWidget作为其根的UI表单中,并重新应用新的布局到该根上(因为根布局似乎不会随其他内容一起被复制)。还可以手动编辑.ui xml文件,通过删除所有与QMainWindow相关的部分(菜单栏、工具栏等)和中央小部件的封闭的<widget>标签来实现。 - alexisdm
谢谢@alexisdm,希望你不介意我把你的观点加入到我的回答中。 - Robert
我不知道为什么它被投下了票,这个答案是正确的。正如Robert所说:在文本编辑器中更改.ui文件,重新生成生成的文件,并在代码中更改基类。我做过很多次了。它就是有效的。 :) - AMA

6
您可以采用@Robert的方法,但最简单的方法是在Qt Designer中创建一个新表单类,然后将原始小部件的内容复制并粘贴到新表单类中。
请参见此链接

0

我创建了一个新的设计师表单类,一次作为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/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接