Qt Designer:更改窗口的基类

时间:2013-07-11 23:10:06

标签: c++ qt user-interface

我已经在Qt Designer中为我的应用程序创建了第二个窗口。 我读到QMainWindow将是第二个窗口的错误类(基本上应该只是某种对话框),所以我想改变基类。

我的问题是:

  1. 有没有办法在不创建新窗口的情况下更改基类并将我的代码复制到新文件中?
  2. 有人可以解释何时使用QMainWindow,QDialog和QWidget?我没有找到关于Qt中这三个基类之间差异的良好解释。

3 个答案:

答案 0 :(得分:5)

  1. 要更改基类,您只能在标题文件中更改: public QMainWindow: public QWidget(反之亦然),当然还有* .cpp。

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

  3. 编辑: 我忘了提到还必须更改UI文件,即使用文本编辑器,更改行(我认为第4行)

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

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

    并删除所有与QMainWindows相关的部分(菜单栏,工具栏,...)以及中央窗口小部件的封闭标记。

    感谢alexisdm的提示。

答案 1 :(得分:1)

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

also

答案 2 :(得分:0)

我创建了一个新的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/>