Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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++ 如何在QDialog中显示QMainWindow_C++_Qt - Fatal编程技术网

C++ 如何在QDialog中显示QMainWindow

C++ 如何在QDialog中显示QMainWindow,c++,qt,C++,Qt,我试图在QDialog中显示一个Qmain窗口,但前者没有出现 我已经对QDialog进行了子类化,我们称之为myDialog 一个小例子: myDialog(QWidget *p_parent) : QDialog(p_parent) { QGridLayout *p_dialogLayout = new QGridLayout(this); QMainWindow *p_MainWindow = new QMainWindow(this); QLabel *p_la

我试图在QDialog中显示一个Qmain窗口,但前者没有出现

我已经对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);
}
如果执行该对话框,我只会看到按钮,而不会看到嵌入的qmain窗口。
如果我强制显示qmainwindow,主窗口将显示在另一个窗口中。

我认为Qt框架不支持这一点,根据他们的文档,它只打算在应用程序中使用一次


我的建议是将所有的主窗口实现以单独的形式(继承
QWidget
)实现,并使用类似
p_MainWindow->setCentralWidget(p_YourNewForm)的方法将该形式添加到构造函数中的主窗口中

我认为Qt框架不支持这一点,根据他们的文档,它只打算在应用程序中使用一次


我的建议是将所有的主窗口实现以单独的形式(继承
QWidget
)实现,并使用类似
p_MainWindow->setCentralWidget(p_YourNewForm)的方法将该形式添加到构造函数中的主窗口中

我已经能够做到了

诀窍是构造没有父级的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.
}

我已经做到了

诀窍是构造没有父级的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.
}
用于将工具栏添加到对话框中

#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"
#包括
类对话框:公共QDialog
{
Q_对象
公众:
对话框(QWidget*parent=nullptr):QDialog(parent)
{
调整大小(600400);
setLayout(新的QHBoxLayout);
QToolBar*工具栏=新的QToolBar;
工具栏->添加操作(“操作一”);
工具栏->添加操作(“操作二”);
布局()->setMenuBar(工具栏);
layout()->addWidget(新的QLabel(“标签一”);
layout()->addWidget(新的QLabel(“标签二”);
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
对话w;
w、 show();
返回a.exec();
}
#包括“main.moc”
用于将工具栏添加到对话框中

#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"
#包括
类对话框:公共QDialog
{
Q_对象
公众:
对话框(QWidget*parent=nullptr):QDialog(parent)
{
调整大小(600400);
setLayout(新的QHBoxLayout);
QToolBar*工具栏=新的QToolBar;
工具栏->添加操作(“操作一”);
工具栏->添加操作(“操作二”);
布局()->setMenuBar(工具栏);
layout()->addWidget(新的QLabel(“标签一”);
layout()->addWidget(新的QLabel(“标签二”);
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
对话w;
w、 show();
返回a.exec();
}
#包括“main.moc”

QMainWindow
是应用程序主窗口的一个类,为什么要将其放置在对话框中?@pablo_worker了解他们如何在Qt设计器中执行此操作。我想放置QMainWindow以添加工具栏@SingerOfTheFall
QMainWindow
是应用程序主窗口的一个类,为什么要将其放置在对话框中?@pablo_worker了解他们如何在Qt Designer中执行此操作。我想放置QMainWindow以添加工具栏@谢谢大家!我不知道这个选择。一点不,不应该是新的QToolBar(这个)?自动删除它。setMenuBar()没有声明它拥有所有权。@pablo\u您可以将
this
作为父级传递,但是
setMenuBar
将自动执行此操作。我知道,因为我查过了。谢谢!我不知道这个选择。一点不,不应该是新的QToolBar(这个)?自动删除它。setMenuBar()没有声明它拥有所有权。@pablo\u您可以将
this
作为父级传递,但是
setMenuBar
将自动执行此操作。我知道,因为我查过了。