优化文件结构

到目前为止我们界面设计的代码已经写的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);
};

当然这是我所设计的文件结构,你也可以根据自己的需要自行设计结构。

相关推荐
星栈几秒前
Dioxus 多页面怎么做:`dioxus-router`、嵌套路由、`Outlet` 和页面组织,一篇给你讲顺
前端·rust·前端框架
zzzzzz310几秒前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
用户987409238875 分钟前
用 Remotion + edge-tts 打造中文教学视频全自动流水线
前端
风骏时光牛马5 分钟前
Less前端工程化实战:变量混合器与项目样式分层落地
前端
xcyxiner7 分钟前
DicomViewer (dcmtk读取dcm文件)5
qt
假如让我当三天老蒯9 分钟前
Options API(选项式 API) 和 Composition API(组合式 API)
前端·vue.js·面试
SameX10 分钟前
iOS 独立开发实践:用 MapKit + 像素渲染实现 Citywalk 轨迹地图 App「雁过留痕」
前端
skyey27 分钟前
页面加载时,深色模式闪白的问题解决
前端
IT_陈寒38 分钟前
Java 并行流把我坑惨了,这6小时加班值了
前端·人工智能·后端
anOnion10 小时前
构建无障碍组件之Menu Button pattern
前端·html·交互设计