Qt 的开发有两种模式,一种是纯代码写 ui,另一种是拖过拖拉拽的方式写 ui
本文更加偏向后者。
因此,在“设计模式”界面中的 每一块工作区是干嘛的,有必要先搞清楚。
一、Qt 基础知识
1、Qt 是什么?
答:Qt 是一个跨平台的 C++ 图形用户界面库。用于桌面、移动设备和嵌入式开发。
2、如何上手 Qt ?
答:(1)超详细 Qt 6.5 安装和使用教程丨小白专用丨零基础丨C++ QT开发环境丨IDE_哔哩哔哩
(2)QT学习笔记1(创建第一个QT工程)- 优快云博客
3、Qt 中有哪些控件?哪些是常用的?常用控件有哪些属性?对控件的如何做布局管理?
答:所有的控件:见“设计模式”下的“控件盒子”。
常用的控件、及其属性:可参考:Qt 常用控件-优快云博客
4、如何设置控件的外观?
答:(1)依旧参考:Qt 常用控件-优快云博客
(2)setStyleSheet 函数,可以参考:setStyleSheet 的用法-优快云博客
包括:背景颜色和图片、文本颜色和字体、边框、阴影、圆角、鼠标悬停效果。
(3)调色板 QPalette
包括:控件在不同状态下的颜色。例如正常状态、禁用状态等。
QPalette palette = ui->pushButton->palette();
palette.setColor(QPalette::Button, QColor(255, 0, 0)); // 设置按钮背景色为红色 palette.setColor(QPalette::ButtonText, Qt::white); // 设置按钮文本颜色为白色
ui->pushButton->setPalette(palette);
(4)直接设置属性
ui->pushButton->setIcon(QIcon(":/path/to/icon.png")); // 设置按钮图标
ui->pushButton->setText("按钮文本"); // 设置按钮文本
5、如何查看控件有哪些信号?
答:以 QLineEdit 控件为例,先选中控件,再鼠标右键,最后点击“转到槽”,即可查看
6、如何连接信号与槽?
答:(1)使用 connect() 函数:Qt 5 及以上推荐
a、函数指针写法:connect(sender, &Sender::signal, receiver, &Receiver::slot);
sender: 发出信号的指针对象。 signal(): 发出的信号函数。
receiver: 接收信号的指针对象。 slot(): 用于处理信号的槽函数。
b、Lambda 表达式写法:connect(sender, &Sender::signal, this, [=](){
// 处理信号的代码,相当于 槽函数的实现部分 });
(2)直接从信号,转到槽
结合第四点,选择信号后,将会自动跳转并在 widget.cpp 中生成“空的槽函数”。
7、如何实现槽函数?
答:槽函数里面,具体写什么东西?取决于你的项目中想要实现什么功能。
在 widget.h 文件中,添加项目中用到的:宏定义、头文件
在 widget.h 中的 public: 中,添加:事件方法
在 widget.h 中的 private slots: 中,添加:自定义的槽函数(非自动生成的)
在 widget.h 中的 private: 中,添加:指针、变量
在 widget.cpp 中的构造函数中,做一些初始化操作:初始化变量、初始化操作
ui(new Ui::Widget){ ui->setupUi(this); // 在这里添加 }
在 widget.cpp 中,编写自动生成的、自定义的槽函数、以及事件方法的实现逻辑。
比如我想要:点击取消按钮后,关闭窗口,那你可以这么写:
void Widget::on_cancelButton_clicked(){
this->close();
}
8、在槽函数中,正确使用 ui 指针和 this 指针
ui :操作界面上的控件(如按钮、标签、文本框等)时,使用 ui 指针。
作用:
(1)访问和操作界面上的控件:ui->controlName
(2)设置控件属性:ui->controlName->setProperty("propertyName", value)
(3)连接控件的信号和槽:
connect(ui->controlName, &ControlType::signalName, this, &MyWidget::slotName);
this:操作窗口自身属性(如标题、大小、位置等)或调用窗口自身方法时,使用 this 指针。
作用:
(1)访问当前对象的成员变量:this->variableName
(2)调用当前对象的成员函数:this->functionName()
(3)在构造函数中初始化成员变量:this->variableName = value
(4)作为函数参数传递当前对象:someFunction(this)
二、做个计算器?
1、先用拖拉拽的方式,建好 ui 界面。注意:要对控件重命名。
2、对每个按键,实现槽函数(注意添加 头文件和变量)
(1)清除键,内容:
currentInput.clear(); // 清空字符串内容(currentInput 的定义见下图)
ui->lineEdit->clear(); // 清空显示框
(2)数字键,以数字“1”为例:
QString digit = ui->one->text(); // 获取按钮对象的内容,存入digit
if (clearOnNextInput) { // 判断是否清空,默认不清空
ui->lineEdit->clear(); // 那就先把显示框中的第一个数,清空
clearOnNextInput = false; // 不请空(clearOnNextInput 的定义见上图)
}
// 更新当前输入
ui->lineEdit->setText(currentInput); // 其它数字键,同理
当然,我们也可以尝试另一种做法:
多个数字按钮共享逻辑,统一为一个槽函数,再将所有的数字按钮使用 connect() 语句连接。
(3)加法键,内容:
QString displayValue = ui->lineEdit->text(); // 获取显示屏上的数值
// 将显示屏的数值转为double型,并保存到operand1中(operand 的定义见上图)
operand1 = displayValue.toDouble();
currentOperator = "+"; // 将当前操作符设置为"+"(currentOperator 的定义见上图)
clearOnNextInput = true; // 指示下一次输入时,需要清空输入框
(4)等于键,内容:
QString displayValue = ui->lineEdit->text(); // 获取显示屏上的数值
// 将显示屏上的数值转换为double类型,并保存到operand2中
double operand2 = displayValue.toDouble();
double result = 0; // 初始化计算结果
if (currentOperator == "+") { // 如果当前操作符是"+"
result = operand1 + operand2; // 执行加法运算,其它运算同理
}
...
ui->lineEdit->setText(QString::number(result)); // 将计算结果转为字符串,并显示
至此,一个简易的计算器已经编写完成。其中还有部分知识暂未提到,将在后文继续介绍。