到目前为止我们界面设计的代码已经写的86行了
#include "MyFirstQt6.h"
#include <iostream>
#include <QtWidgets>
MyFirstQt6::MyFirstQt6(QWidget* parent)
: QMainWindow(parent)
{
setWindowTitle("第一个Qt6窗口");
resize(1200, 600);
QLabel* label = new QLabel(this);
label->setText("这是一个标签控件");
label->setGeometry(10, 30, 200, 50);
QPushButton* button = new QPushButton(this);
button->setText("这是一个按钮控件");
button->setGeometry(10, 80, 200, 50);
connect(button, &QPushButton::clicked, this, &MyFirstQt6::onButtonClicked);
lineEdit = new QLineEdit(this);
lineEdit->setGeometry(10, 130, 200, 50);
TextEdit = new QTextEdit(this);
TextEdit->setGeometry(10, 180, 300, 100);
PlainTextEdit = new QPlainTextEdit(this);
PlainTextEdit->setGeometry(10, 280, 300, 100);
radioButton1 = new QRadioButton(this);
radioButton1->setText("单选按钮1");
radioButton1->setGeometry(200, 20, 100, 30);
connect(radioButton1, &QRadioButton::toggled, this, [=](bool checked) {
if (checked) {
QMessageBox::information(this, "信息", "单选按钮1被选中");
}
});
radioButton2 = new QRadioButton(this);
radioButton2->setText("单选按钮2");
radioButton2->setGeometry(200, 50, 100, 30);
connect(radioButton2, &QRadioButton::toggled, this, [=](bool checked) {
if (checked) {
QMessageBox::information(this, "信息", "单选按钮2被选中");
}
});
radioButton3 = new QRadioButton(this);
radioButton3->setText("单选按钮3");
radioButton3->setGeometry(300, 20, 100, 30);
radioButton4 = new QRadioButton(this);
radioButton4->setText("单选按钮4");
radioButton4->setGeometry(300, 50, 100, 30);
radioGroup = new QButtonGroup(this);
radioGroup->addButton(radioButton3, 3);
radioGroup->addButton(radioButton4, 4);
connect(radioGroup, &QButtonGroup::idClicked, this, &MyFirstQt6::onRadioButtonToggled);
checkBox = new QCheckBox(this);
checkBox->setText("这是一个复选框");
checkBox->setGeometry(230, 100, 200, 30);
connect(checkBox, &QCheckBox::stateChanged, this, [=](int state) {
if (state == Qt::Checked) {
QMessageBox::information(this, "信息", "复选框被选中");
}
else {
QMessageBox::information(this, "信息", "复选框被取消选中");
}
});
}
MyFirstQt6::~MyFirstQt6()
{}
void MyFirstQt6::onButtonClicked()
{
QString text = TextEdit->to PlainText();
QMessageBox::information(this, "信息", "你输入的内容是: " + text);
}
void MyFirstQt6::onRadioButtonToggled(int id)
{
QMessageBox::information(this, "信息", "选项" + QString::number(id) + "被选中");
}
是时候优化一下我们的文件结构了
我们现在是把所有的函数都写在了这个cpp文件中,我们可以把一些相同功能的写进一个cpp文件内,方便管理。
在右边找到解决方案资源管理器,然后在右上方点击 显示所有文件

这时就会显示我们项目的文件结构

我们单击根目录,右键添加 新建文件夹
将文件夹命名为 fun

在fun文件夹内新建一个cpp文件命名为 slots.cpp

这个文件将存放所有控件绑定对应的函数
我们将下面函数剪切过去
void MyFirstQt6::onButtonClicked()
{
QString text = TextEdit->toPlainText();
QMessageBox::information(this, "信息", "你输入的内容是: " + text);
}
void MyFirstQt6::onRadioButtonToggled(int id)
{
QMessageBox::information(this, "信息", "选项" + QString::number(id) + "被选中");
}
别忘记加上头文件
#include "MyFirstQt6.h"
#include <QtWidgets>
此时运行时可能会报错,我们需要将下面的代码修改
connect(checkBox, &QCheckBox::stateChanged, this, [=](int state) {
if (state == Qt::Checked) {
QMessageBox::information(this, "信息", "复选框被选中");
}
else {
QMessageBox::information(this, "信息", "复选框被取消选中");
}
});
改为
connect(checkBox, &QCheckBox::checkStateChanged, this, [=](int state) {
if (state == Qt::Checked) {
QMessageBox::information(this, "信息", "复选框被选中");
}
else {
QMessageBox::information(this, "信息", "复选框被取消选中");
}
});
再次运行就能成功
但是当点击单选按钮3和4的时候就显示乱码了,只需要修改一下slots.cpp文件的编码即可。这就不用多说了吧。
然后继续在这个目录下创建bind.cpp

将所有的绑定事件剪切到这个文件内
#include "MyFirstQt6.h"
#include <QtWidgets>
void MyFirstQt6::bindEvent()
{
connect(button, &QPushButton::clicked, this , &MyFirstQt6::onButtonClicked);
connect(radioButton1, &QRadioButton::toggled, this , [=](bool checked) {
if (checked) {
QMessageBox::information(this, "信息", "单选按钮1被选中");
}
});
connect(radioButton2, &QRadioButton::toggled, this , [=](bool checked) {
if (checked) {
QMessageBox::information(this, "信息", "单选按钮2被选中");
}
});
connect(radioGroup, &QButtonGroup::idClicked, this , &MyFirstQt6::onRadioButtonToggled);
}
然后回到头文件为按钮定义变量,其次定义我们的函数
QPushButton* button;
private :
void bindEvent ();
因为我们之前使用的是局部变量
最后在最后一行添加
bindEvent();
再创建一个文件夹命名为ui

新建一个项命名为setupUI.cpp

在头文件中定义函数
void setupUI ();
将所有关于界面布局的代码写入
#include "MyFirstQt6.h"
#include <QtWidgets>
void MyFirstQt6::setupUI()
{
QLabel* label = new QLabel(this);
label->setText("这是一个标签控件");
label->setGeometry(10, 30, 200, 50);
button = new QPushButton(this);
button->setText("这是一个按钮控件");
button->setGeometry(10, 80, 200, 50);
lineEdit = new QLineEdit(this);
lineEdit->setGeometry(10, 130, 200, 50);
TextEdit = new QTextEdit(this);
TextEdit->setGeometry(10, 180, 300, 100);
PlainTextEdit = new QPlainTextEdit(this);
PlainTextEdit->setGeometry(10, 280, 300, 100);
radioButton1 = new QRadioButton(this);
radioButton1->setText("单选按钮1");
radioButton1->setGeometry(200, 20, 100, 30);
radioButton2 = new QRadioButton(this);
radioButton2->setText("单选按钮2");
radioButton2->setGeometry(200, 50, 100, 30);
radioButton3 = new QRadioButton(this);
radioButton3->setText("单选按钮3");
radioButton3->setGeometry(300, 20, 100, 30);
radioButton4 = new QRadioButton(this);
radioButton4->setText("单选按钮4");
radioButton4->setGeometry(300, 50, 100, 30);
radioGroup = new QButtonGroup(this);
radioGroup->addButton(radioButton3, 3);
radioGroup->addButton(radioButton4, 4);
checkBox = new QCheckBox(this);
checkBox->setText("这是一个复选框");
checkBox->setGeometry(230, 100, 200, 30);
};
最后在绑定事件的函数上方调用
setupUI();
优化后的文件结构及代码
MyfirstQt6.cpp
#include "MyFirstQt6.h"
#include <iostream>
#include <QtWidgets>
MyFirstQt6::MyFirstQt6(QWidget* parent)
: QMainWindow(parent)
{
setWindowTitle("第一个Qt6窗口");
resize(1200, 600);
setupUI();
bindEvent();
}
MyFirstQt6::~MyFirstQt6()
{}
MyfirstQt6.h
#pragma once
#include <QtWidgets/QMainWindow>
#include <QtWidgets>
class MyFirstQt6 : public QMainWindow
{
Q_OBJECT
public :
MyFirstQt6(QWidget *parent = nullptr);
~MyFirstQt6();
private :
void bindEvent ();
void setupUI ();
private slots:
void onButtonClicked ();
void onRadioButtonToggled (int id);
private :
QPushButton* button;
QLineEdit* lineEdit;
QTextEdit* TextEdit;
QPlainTextEdit* PlainTextEdit;
QRadioButton *radioButton1, *radioButton2, *radioButton3, *radioButton4;
QButtonGroup* radioGroup;
QCheckBox* checkBox;
};
slots.cpp
用于定义槽函数
#include "MyFirstQt6.h"
#include <QtWidgets>
void MyFirstQt6::onButtonClicked()
{
QString text = TextEdit->toPlainText();
QMessageBox::information(this, "信息", "你输入的内容是: " + text);
}
void MyFirstQt6::onRadioButtonToggled(int id)
{
QMessageBox::information(this, "信息", "选项" + QString::number(id) + "被选中");
}
bind.cpp
用于绑定事件
#include "MyFirstQt6.h"
#include <QtWidgets>
void MyFirstQt6::bindEvent()
{
connect(button, &QPushButton::clicked, this , &MyFirstQt6::onButtonClicked);
connect(radioButton1, &QRadioButton::toggled, this , [=](bool checked) {
if (checked) {
QMessageBox::information(this, "信息", "单选按钮1被选中");
}
});
connect(radioButton2, &QRadioButton::toggled, this , [=](bool checked) {
if (checked) {
QMessageBox::information(this, "信息", "单选按钮2被选中");
}
});
connect(radioGroup, &QButtonGroup::idClicked, this , &MyFirstQt6::onRadioButtonToggled);
}
setupUI.cpp
用于初始化界面
#include "MyFirstQt6.h"
#include <QtWidgets>
void MyFirstQt6::setupUI()
{
QLabel* label = new QLabel(this);
label->setText("这是一个标签控件");
label->setGeometry(10, 30, 200, 50);
button = new QPushButton(this);
button->setText("这是一个按钮控件");
button->setGeometry(10, 80, 200, 50);
lineEdit = new QLineEdit(this);
lineEdit->setGeometry(10, 130, 200, 50);
TextEdit = new QTextEdit(this);
TextEdit->setGeometry(10, 180, 300, 100);
PlainTextEdit = new QPlainTextEdit(this);
PlainTextEdit->setGeometry(10, 280, 300, 100);
radioButton1 = new QRadioButton(this);
radioButton1->setText("单选按钮1");
radioButton1->setGeometry(200, 20, 100, 30);
radioButton2 = new QRadioButton(this);
radioButton2->setText("单选按钮2");
radioButton2->setGeometry(200, 50, 100, 30);
radioButton3 = new QRadioButton(this);
radioButton3->setText("单选按钮3");
radioButton3->setGeometry(300, 20, 100, 30);
radioButton4 = new QRadioButton(this);
radioButton4->setText("单选按钮4");
radioButton4->setGeometry(300, 50, 100, 30);
radioGroup = new QButtonGroup(this);
radioGroup->addButton(radioButton3, 3);
radioGroup->addButton(radioButton4, 4);
checkBox = new QCheckBox(this);
checkBox->setText("这是一个复选框");
checkBox->setGeometry(230, 100, 200, 30);
};
当然这是我所设计的文件结构,你也可以根据自己的需要自行设计结构。