2017-02-21 94 views
0

我想在QDialog中顯示QMainWindow,但前者不顯示。如何在QDialog中顯示QMainWindow

我有子類QDialog的,我們稱之爲myDialog

一個小例子:

myDialog(QWidget *p_parent) : QDialog(p_parent) 
{ 
    QGridLayout *p_dialogLayout = new QGridLayout(this); 

    QMainWindow *p_MainWindow = new QMainWindow(this); 
    QLabel *p_label = new QLabel(this); 
    p_MainWindow->setCentralWidget(p_label); 

    QPushButton *p_cancel = new QPushButton("Cancel", this); 

    p_dialogLayout ->addWidget(p_MainWindow, 0, 0); 
    p_dialogLayout ->addWidget(p_cancel, 1, 0); 
} 

如果我執行的對話框中,我只看到按鈕,而不是嵌入式的QMainWindow。 如果我強制顯示qmainwindow,主窗口會顯示在另一個窗口中。

+1

'QMainWindow'是您的應用程序主窗口的類,您爲什麼要將它放在對話框中? – SingerOfTheFall

+0

@pablo_worker瞭解他們如何在Qt Designer中做到這一點。 – LogicStuff

+0

我想放置一個qmainwindow來添加一個工具欄。 @SingerOfTheFall –

回答

0

我已經能夠做到這一點。

關鍵是要構建的QMainWindow沒有父母,然後應用.setParent

方法如下:

myDialog(QWidget *p_parent) : QDialog(p_parent) 
{ 
    QGridLayout *p_dialogLayout = new QGridLayout(this); 

    QMainWindow *p_MainWindow = new QMainWindow(); //Without a parent 
    QLabel *p_label = new QLabel(this); 
    p_MainWindow->setCentralWidget(p_label); 

    QPushButton *p_cancel = new QPushButton("Cancel", this); 

    p_dialogLayout ->addWidget(p_MainWindow, 0, 0); 
    p_dialogLayout ->addWidget(p_cancel, 1, 0); 

    p_MainWindow->setParent(this); //Set the parent, to delete the MainWindow when the dialog is deleted. 
} 
0

根據他們的文檔here,我不認爲這是Qt框架支持的,它只能在應用程序中使用一次。

我的建議是採取在一個單獨的形式所有的主窗口實現(繼承QWidget),只是添加表格到你的主窗口中使用的東西構造類似p_MainWindow->setCentralWidget(p_YourNewForm);

3

使用QLayout::setMenuBar工具欄添加到您的對話框。

#include <QtWidgets> 

class Dialog : public QDialog 
{ 
    Q_OBJECT 
public: 
    Dialog(QWidget *parent = nullptr) : QDialog(parent) 
    { 
     resize(600, 400); 
     setLayout(new QHBoxLayout); 
     QToolBar *toolbar = new QToolBar; 
     toolbar->addAction("Action one"); 
     toolbar->addAction("Action two"); 
     layout()->setMenuBar(toolbar); 

     layout()->addWidget(new QLabel("Label one")); 
     layout()->addWidget(new QLabel("Label two")); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Dialog w; 
    w.show(); 

    return a.exec(); 
} 

#include "main.moc" 
+0

謝謝!我不知道這個選擇。有一點不是,不應該是新的QToolBar(這個)?自動刪除它。 setMenuBar()不聲明它擁有所有權。 –

+1

@pablo_worker您可以將'this'作爲父項,但'setMenuBar'會自動完成。我知道,因爲我檢查了[源代碼](https://code.woboq.org/qt5/qtbase/src/widgets/kernel/qlayout.cpp.html#_ZN7QLayout10setMenuBarEP7QWidget)。 – thuga