我想将QMainWindow实例放在另一个QWidget中(例如另一个QMainWindow的centralWidget)。
我想知道它为什么不起作用? QMainWindow直接从QWidget继承。将QWidget放在另一个QWidget中可以正常工作。
我经常将QMainWindow实例放在QTabBar中而没有任何问题。
ps您可能会问为什么我需要使用QMainWindow?我想使用垂直布局在1个表单中放置2个小部件。我希望这两个小部件直接在它们上面分别使用工具栏。
也许有其他方法可以使用QtCreator将工具栏放在普通的QWidgets中?
修改
第一个例子(正常工作)
我基于QWidget创建新的类/表单。 (QtCreator根据标准模板创建3个文件* .cpp,* .h和* .ui。)
类声明看起来像这样
class NotesEditor : public QWidget
{
Q_OBJECT
public:
explicit NotesEditor(QWidget *parent = 0);
~NotesEditor();
private:
Ui::NotesEditor *ui;
};
当我尝试使用此小部件并将其放在另一个小部件中时,它可以正常工作。 我使用了qtcreator的“promote to ...”功能 - 这里没有问题。
第二个例子(不起作用)
我基于QMainWindow创建新的类/表单。 (QtCreator根据标准模板创建3个文件* .cpp,* .h和* .ui。)
类声明如下所示:
class Notes : public QMainWindow
{
Q_OBJECT
public:
explicit Notes(QWidget *parent = 0);
~Notes();
private:
Ui::Notes *ui;
};
现在,当我尝试将此小部件放在另一个小部件中时,它不可见。 和之前一样,我使用了qtcreator的“promote to ...”功能。
两个小部件(首先基于QWidget,第二个基于QMainWindow)具有基于标准qtcreator代码模板的相同默认结构。我在这里没有太大变化 - 只是在表单设计器中添加了一些按钮。
在第二个例子中,我尝试在类实例上使用setEnabled(true)和setVisible(true)。第一个没有结果。第二个在单独的窗口中打开这个小部件。
我认为最大的问题是QMainWindow是否会嵌套在另一个QWidget中。正如我在QMainWindow之前写的那样,实例可以毫无问题地放在QTabWidgets中。
答案 0 :(得分:12)
遇到同样的问题,我找到了解决方案here。
QMainWindow将其窗口类型设置为Qt :: Window,即使它有一个父窗口它也会在一个独立的窗口中(你可以通过调用QMainWindow上的show()来确认它,你会看到它自己的窗口)。尝试添加行
window->setWindowFlags(Qt::Widget);
构建QMainWindow之后。
答案 1 :(得分:3)
centralwidget = new QMainWindow(this);
centralwidget->setWindowFlags(Qt::Widget);
setCentralWidget(centralwidget);
这应该有所帮助。
答案 2 :(得分:-3)
QMainWindow
以平台无关的方式提供工具栏,状态栏和菜单栏等预定义的东西(它“做正确的事情”,无需人工干预)。如果你需要的只是布局中的一堆按钮,请使用QWidget
。
你需要确保每个QMainWindow has central
QWidget`,除此之外,你应该没事。