2013-07-11 2 views
12

Я уже создал второе окно для своего приложения в Qt Designer. Я читал, что QMainWindow будет неправильным классом для второго окна (в основном это должен быть только какой-то диалог), поэтому я хотел бы изменить базовый класс.Qt Designer: изменение базового класса окна

Мой вопрос (ы):

  1. Есть ли способ, чтобы изменить базовый класс без создания нового окна и скопировать мой код в новые файлы?
  2. Может кто-нибудь объяснить, когда использовать QMainWindow, QDialog и QWidget? Я не нашел хороших объяснений различий между этими тремя базовыми классами в Qt.
+0

Этот связанный с этим вопрос помог мне: http://stackoverflow.com/questions/6533329/what-is-the-use-of-morph-into-in-qt – azalea

ответ

4
  1. Чтобы изменить базовый класс можно изменить только : public QMainWindow к : public QWidget (или наоборот) в заголовке-файл и, конечно, также в * .cpp.

  2. В основном все три являются QWidgets, каждый со специальной функциональностью или для определенных целей. Насколько я знаю, QMainWindow имеет панели инструментов, меню и доки, QDialog всегда будет отображаться как отдельное окно (например, блокирование, неблокирование и т. Д.), А сам QWidget является базовым классом. То есть QPushButton, QCombobox также получены из QWidget. На мой взгляд, было бы лучше использовать только один QMainWindow, так как она должна быть центральной точкой взаимодействия/навигации для пользователя

EDIT: Я забыл упомянуть, что также UI-файл должен быть изменен , то есть, используя текстовый редактор, измените строки (4-й строки я думаю)

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

в

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

и удалить все QMainWindows соответствующие части (MenuBar, toolba r, ...) и прилагаемый тег для центрального виджета.

Благодаря alexisdm для наконечника.

+1

Изменение только базового класса недостаточно: Файл ui был создан для 'QMainWindow' (виджет в верхней части дерева в конструкторе), поэтому сгенерированная функция' setupUi' по-прежнему ожидает указателя на 'QMainWindow'. – alexisdm

+0

Скажите, если я ошибаюсь, но файл UI автогенерируется на основе .h класса, поэтому, изменяя базовый класс, также обновляется .ui- И обновляется ui_-файл. – Robert

+3

Нет, ui_xxx.h файл создается только на основе файла .ui. И конструктор не позволяет изменять базовый класс верхнего виджета после его выбора, с этого момента единственным способом было бы в рамках конструктора копировать/вставлять все виджеты в другую форму ui, которая имела бы ' QWidget' в качестве своего корня и повторно применить новый макет к этому корню (поскольку корневой макет, похоже, не копируется с остальными). Также можно вручную отредактировать файл .ui xml, удалив все связанные с ним элементы 'QMainWindow' (меню, панель инструментов ...) и тег' 'для центрального виджета. – alexisdm

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

Вы можете принять подход @Robert «s, но самый простой способ создать новый класс формы в Qt Designer, а затем в Qt Designer скопируйте содержимое исходного виджета и вставьте его в новый.

См. also.

Смежные вопросы