.h文件内容如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;private slots:void onButtonClicked();private:QPushButton *button;QLabel *label;};
#endif // MAINWINDOW_H
.cpp 文件内容如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow),button(new QPushButton("Click Me", this)),label(new QLabel("Hello, World!", this))
{ui->setupUi(this);QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(button);layout->addWidget(label);QWidget *centralWidget = new QWidget(this);centralWidget->setLayout(layout);setCentralWidget(centralWidget);connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::onButtonClicked()
{label->setText("Button Clicked!");
}
在C++的Qt框架中,MainWindow::MainWindow(QWidget *parent)
是MainWindow
类的构造函数,它负责初始化这个类的对象。在这个构造函数中,有几个关键的部分需要详细解释,特别是button(new QPushButton("Click Me", this)), label(new QLabel("Hello, World!", this))
这一部分。
成员变量初始化列表
首先,构造函数使用了一个称为“成员变量初始化列表”的特性来初始化类的成员变量。这是C++推荐的做法,因为它通常比在构造函数体内赋值更高效,特别是对于大型对象或需要复杂构造的对象来说。
button
和label
的初始化
button(new QPushButton("Click Me", this)),
label(new QLabel("Hello, World!", this))
这两行代码做了以下几件事:
-
动态分配内存:
new
关键字用于在堆上动态分配内存。这意味着QPushButton
和QLabel
对象不会在栈上自动销毁,而是需要手动管理它们的生命周期(通常是通过智能指针或确保在适当的时候调用delete
)。 -
创建对象:
QPushButton("Click Me", this)
创建了一个按钮对象,其上的文本为“Click Me”。第二个参数this
是指向当前MainWindow
对象的指针,它将按钮的父对象设置为MainWindow
。在Qt中,设置父对象意味着子对象(如按钮)的生命周期将由父对象管理,当父对象被销毁时,子对象也会被自动销毁。类似地,
QLabel("Hello, World!", this)
创建了一个标签对象,其上的文本为“Hello, World!”,并将其父对象设置为MainWindow
。 -
初始化成员变量:这些对象被赋值给
MainWindow
类的成员变量button
和label
。这意味着在MainWindow
类的其他部分可以访问这些控件,以修改它们的属性或连接信号和槽。
注意点
-
ui成员变量:在构造函数中,
ui(new Ui::MainWindow)
也使用了类似的语法来初始化ui
成员变量。然而,这里ui
是一个指向由Qt Designer生成的UI类的指针,它通常包含了界面上所有控件的引用和布局信息。setupUi(this)
函数被调用以设置这些控件的实际界面。 -
布局管理:在构造函数中,还创建了一个
QVBoxLayout
布局,并将按钮和标签添加到这个布局中。然后,这个布局被设置为一个新创建的QWidget
(作为中央部件)的布局。这确保了按钮和标签将按照垂直布局排列在MainWindow
中。 -
信号和槽的连接:最后,使用
connect
函数将按钮的clicked
信号连接到MainWindow
类的onButtonClicked
槽。这意味着当按钮被点击时,onButtonClicked
函数将被调用。
效果:
button(new QPushButton("Click Me", this)), label(new QLabel("Hello, World!", this))
这两行代码在MainWindow
的构造函数中动态创建了按钮和标签控件,并将它们分别初始化为类的成员变量。这些控件被添加到布局中,并最终显示在MainWindow
界面中。