Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt设计器:更改窗口的基类_C++_Qt_User Interface - Fatal编程技术网

C++ Qt设计器:更改窗口的基类

C++ Qt设计器:更改窗口的基类,c++,qt,user-interface,C++,Qt,User Interface,我已经在Qt设计器中为我的应用程序创建了第二个窗口。 我读到QMainWindow对于第二个窗口(基本上应该只是某种对话框)来说是错误的类,所以我想更改基类 我的问题是: 有没有一种方法可以在不创建新窗口和将代码复制到新文件的情况下更改基类 有人能解释一下什么时候使用QMainWindow、QDialog和QWidget吗?对于Qt中这三个基类之间的差异,我没有找到很好的解释 要更改基类,您只能将头文件中的:public QMainWindow更改为:public QWidget(反之亦然),当

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

我的问题是:

  • 有没有一种方法可以在不创建新窗口和将代码复制到新文件的情况下更改基类
  • 有人能解释一下什么时候使用QMainWindow、QDialog和QWidget吗?对于Qt中这三个基类之间的差异,我没有找到很好的解释
  • 要更改基类,您只能将头文件中的
    :public QMainWindow
    更改为
    :public QWidget
    (反之亦然),当然也可以更改*.cpp

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

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

    
    

    
    
    并删除所有与QMainWindows相关的部分(菜单栏、工具栏等)以及中心小部件的封闭标记


    多亏了alexisdm的提示。

    我创建了一个新的Designer表单类,一次作为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/>
    
    diff--git a/mydialog.cpp b/mydialog.cpp
    索引e4f30f2..ccf8831 100644
    ---a/mydialog.cpp
    +++b/mydialog.cpp
    @@ -2,7 +2,7 @@
    #包括“ui_mydialog.h”
    MyDialog::MyDialog(QWidget*父项):
    -QMainWindow(父级),
    +QDialog(父级),
    ui(新建ui::MyDialog)
    {
    用户界面->设置用户界面(此);
    diff——git a/mydialog.h b/mydialog.h
    索引8d12675..3a16393 100644
    ---a/mydialog.h
    +++b/mydialog.h
    @@ -1,13 +1,13 @@
    #ifndef MYDIALOG\u H
    #定义MYDIALOG\u H
    -#包括
    +#包括
    名称空间用户界面{
    类MyDialog;
    }
    -类MyDialog:公共QMainWindow
    +类MyDialog:公共QDialog
    {
    Q_对象
    diff——git a/mydialog.ui b/mydialog.ui
    索引6e95365..8d09b98 100644
    ---a/mydialog.ui
    +++b/mydialog.ui
    @@ -3,7 +3,7 @@
    我的对话
    - 
    + 
    0
    @@ -15,9 +15,6 @@
    主窗口
    -  
    -  
    -  
    
    您可以采用@Robert的方法,但最简单的方法是在Qt Designer中创建一个新的表单类,然后在Qt Designer中复制原始小部件的内容并将其粘贴到新的小部件中


    请参阅。

    仅更改基类是不够的:ui文件是为
    QMainWindow
    创建的(设计器中树顶部的小部件),因此生成的
    setupUi
    函数仍然需要指向
    QMainWindow
    的指针。如果我错了,请告诉我,UI文件是基于类的.h自动生成的,因此通过更改基类,.UI-和UI-文件也会被更新。不,UI\uxxx.h文件仅基于.UI文件生成。而设计器不需要low选择顶部小部件后,更改其基类,从那时起,唯一的方法是在设计器中,将所有小部件复制/粘贴到另一个ui表单,该表单将以
    QWidget
    作为其根,并将新布局重新应用到该根(因为根布局似乎不会与其余部分一起复制)。也可以通过删除所有
    QMainWindow
    相关部分(菜单栏、工具栏等),手动编辑.ui xml文件Thx@Alexism,希望你不介意我在我的回答中添加了你的观点我不知道为什么被否决,答案是正确的。正如Robert所说:在文本编辑器中更改.ui,重新生成生成的文件,并更改代码中的基类。我做了很多次。它只是起作用。:)这个关系ed的问题帮助了我:
    <widget class="QWidget" name"YourClassName">
    
    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/>