c++ Qt:在main.cpp中显示MainWindow而不使用QT设计器

g6ll5ycj  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(155)

我正在使用QT Creator完成一项任务,作为一项要求,我必须在不使用QT Designer的情况下创建GUI。我有一个头文件,基本上只有一个构造函数。我想在main.cpp文件中调用show my MainWindow(并且包含了我的mainwindow.h文件),我的main函数中有以下代码:

QApplication a(argc, argv);
MainWindow w;

w.show();

return a.exec();

我在主window.cpp文件中设置了整个gui,如下所示:

QMainWindow window;
QWidget *widget = new QWidget(&window);
QVBoxLayout *layout = new QVBoxLayout(widget);

...

window.show();

我尝试过在main.cpp文件中使用不同的MainWindow构造函数,但是GUI似乎只在我将GUI代码放在main.cpp文件中时才显示。我想分离GUI,这样就不必使用独石

zf9nrax1

zf9nrax11#

QT设计器是一个创建小部件代码的工具。如果您使用QT设计器,请创建mainwindow.ui。mainwindow.ui稍后将被转换为ui_mainwindow. h,这是一个普通的C++头文件。您需要做的额外事情是在没有QT Designer时自己实现这个头文件。
这是从mainwindow.ui自动创建的ui_mainwindow. h的示例。
ui_mainwindow.h

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QMenuBar *menubar;
    QStatusBar *statusbar;
    QToolBar *mainToolBar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(800, 600);
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
        MainWindow->setCentralWidget(centralwidget);
        menubar = new QMenuBar(MainWindow);
        menubar->setObjectName(QString::fromUtf8("menubar"));
        menubar->setGeometry(QRect(0, 0, 800, 22));
        MainWindow->setMenuBar(menubar);
        statusbar = new QStatusBar(MainWindow);
        statusbar->setObjectName(QString::fromUtf8("statusbar"));
        MainWindow->setStatusBar(statusbar);
        mainToolBar = new QToolBar(MainWindow);
        mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
        MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
        mainToolBar->setWindowTitle(QCoreApplication::translate("MainWindow", "toolBar", nullptr));
    } // retranslateUi

};

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

可以发现,您可以自己改进mainwindow类,以使用QT设计器实现相同的效果。
main.cpp

#include "mainwindow.h"
#include <QApplication>

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

    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
class QWiddget;
class QHBoxLayout;
class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    QHBoxLayout *verticalLayout;
    QWidget* _widget1;
    QWidget* _widget2;

};

mainwindow.cpp

#include "mainwindow.h"
#include <QWidget>
#include <QHBoxLayout>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    verticalLayout = new QHBoxLayout(this);
    _widget1 = new QWidget(this);
    _widget2 = new QWidget(this);
    verticalLayout->addWidget(_widget1);
    verticalLayout->addWidget(_widget2);
}

MainWindow::~MainWindow(){
}

相关问题