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