Qt - 编译器在调用我的MainWindow的setLayout()时报错

5
我想学习如何手动创建GUI而不使用设计工具。我尝试将布局添加到我的MainWindow,但在运行时它显示:

QWidget::setLayout: 尝试在MainWindow""上设置QLayout"",该窗口已经有了一个布局

这是我的代码:

//Header
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    QHBoxLayout *layout;
};

//Constructor in my *.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    layout = new QHBoxLayout;
    this->setLayout(layout);
}

//The usual main function
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

出了什么问题?我按照书上的做法,甚至在网上查找了一些非常难找到的代码,但仍然无法添加布局到我的窗口。


1
可能是重复的问题:Qt GUI应用程序问题 - Mat
1个回答

19

有一个类似的问题帮助我找出了问题所在。感谢Mat提供的问题链接。

每个 QMainWindow 都需要一个 QWidget 作为中央窗口部件。我还使用设计师创建了一个新项目,编译并查看了 ui_*.h 文件。

因此,每个 QMainWindow 应该类似于这样:

//Header
class MainWindow : public QMainWindow
{
    Q_OBJECT
    QWidget *centralWidget;
    QGridLayout* gridLayout;

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:

};

//*.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    centralWidget = new QWidget(this);
    this->setCentralWidget( centralWidget );
    gridLayout = new QGridLayout( centralWidget );
}

现在你不需要将布局添加/设置到MainWindow中,而是需要将其添加/设置到centralWidget中。


注意:QMainWindow有一个centralWidget()方法。你的字段centralWidget与它重名了。我建议你要么重新命名该字段,要么完全删除它以避免可能的未来问题。 - Андрей Беньковский

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接