QT 学习 - R70727

我不会入门。
这是 QT 的主页面。
创建 Qt Widgets Application
如果你想创建一个项目,那么先点【创建项目】,然后跟着它的步骤走。注意到当前你想创建的是一个窗口 APP,所以选择 Application (Qt) → Qt Widgets Application。
之后就分成七步:
- Location:确定你的项目的名称和路径。可以设置默认项目路径。
- 构建系统:用的什么东西来构建系统。如 qmake、CMake、Qbs。这里我用的是 qmake。
- Details:设置你的类的种类和类名称。类种类分为 QMainWindow、QWidget、QDialog。QMainWindow 和 QWidget 的区别就是前者是那种类似于大型窗口,拥有「文件(F)、编辑(E)」等的菜单,而 QWidget 就是类似于 Win+R 呼唤出来的运行的小窗口一样。QDialog 则是对话框,很少用。
- Translation:目前没有做外语翻译的打算。
- 构建套件(Kit):构建套件。我使用的是 MinGW 64-bit。毕竟对我来说比较友好嘛。
- 汇总:这里我啥都没选。最下面可以看见你这个项目要添加的文件。
项目编辑界面
对于一个新创建的一个项目,你拥有 {name}.pro
文件,即你这个项目的工程文件。以及你的 main.cpp
和 widget.cpp
(这里使用 QWidget),以及一个界面文件 widget.ui
。整个窗口的 UI 设计就在 widget.ui 里面改。
当然,人家是 Qt,不是一个死记事本。点进这个 widget.ui
可以可视化编辑你的窗口 UI。
我钦定这些,以及 Vertical Layout 和 Horizontal Layout 的是入门所必会的对象。你可以在右下角来看某一个对象的所有属性,以便后面执行程序的时候访问。
假如说某个对象发出指令,你欲接收,可以右键发指令的对象然后点击【转到槽】来看具体发出的是什么指令。
非常重要的一点
如果你不知道某一个类,或者是某一个指令等等该怎么用,一定要点左侧菜单栏的【帮助】去搜!!!帮助里面的文档是最全的!!!
示例:超级弱化版执行 sys32 目录下子任务
首先设计 UI。
点一下 PressButton 和 Label 的文字部分可以修改文字。更换字体则是在右下角的属性里的 QWidget 里的 Font 处修改。
为了排版美观,我将最下面的三个 Button 给整合起来做了一个 Horizontal Layout。不过目前不知道 Horizontal Spacer 干什么用的。
注意如果你要调用某一个对象请给这个对象赋一个好一点的名字,这样写代码的时候你就不容易死。
【确定】部分
你要实现的功能是点击【确定】后系统就会自动给你打开你输入框内的东西。那么首先需要了解信号和槽是个什么东西。
信号的话就是你对这个 UI 做了些什么操作,而槽函数就是这个程序,为了响应你的某些信号,而调用的函数。就比如说,你点了个按钮,就是发出信号。你欲点击按钮后弹出一个框框,那么你就先写一个弹出框框的函数,作为槽函数,然后再将这两个东西连接在一起,就可以正常运行了。
那么如何写一个关于按下【确定】按钮后关联的槽函数呢?首先右击【确定】,然后点击转到槽。
这时你可以看到一车的函数。因为你欲的是单击后反应,所以选择 clicked()
后点击确定。这时,你回去查看源代码可以发现,widget.h
里面多了一个 on_commitButton_clicked
的函数的声明,widget.cpp
里面多了一个该函数的主体。
然后先编写 void Widget::on_commitButton_clicked()
函数主体:
1 | void Widget::on_commitButton_clicked(){ |
槽函数写好了,于是你编译运行一下,就能实现效果了。
但是你现在想实现回车就可以跳出窗口怎么做?目前已知在 LineEdit 内回车发出的信号是 SIGNAL(returnPressed())
。
你欲连接这个新信号和之前写的槽函数。此时你就可以在最上面 Widget::Widget(QWidget *parent)
函数里面创建连接了。
连接的基本格式是这样的,让我们看看声明:
1 | connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::Auto Connection) -> QMetaObject::Connection |
从简而说,就是【谁发出信号?发出什么信号?谁处理?如何处理?】四大问题。第五个参数可以不填。
那么你就可以在 Widget
函数内这样做:
1 | Widget::Widget(QWidget *parent) |
写好了之后,再编译运行一下,就能实现回车后跳出的效果了!
【取消】部分
欲实现的功能是点击【取消】后该窗口关闭。这里再讲解另一种方法:
先在 widget.h
的 private slots:
里面加一个 void on_cancelButton_clicked()
的声明。
然后去 Widget.cpp
里面编写该函数。
1 | void Widget::on_cancelButton_clicked(){ |
写完了之后,编译运行后就可以过了。不过如果你这个函数名字改了怎么办?这个时候可以使用地址连接法。即为:
1 | connect(ui->cancelButton, &QPushButton::clicked, this, &Widget::on_cancelButton_clicked); |
亦可过。
【我要打舞萌】部分
欲实现按下【我要打舞萌】弹出一个自定义标题、内容、按钮说明的信息框,实现这种函数内写的东西比较少的就没必要再写一个函数了。可以使用 lambda 表达式来做。
回忆一下,写排序的时候,你的 lambda 是怎么写的?[&](auto x, auto y){...}
。[]
是捕获列表,()
是参数列表,{}
内就是函数主体了。
那么这里也很相似,捕获列表就变成了第三个参数,表达式的函数体就变成了第四个参数。稍微修改一下 lambda 表达式:
1 | connect(ui->browseButton, &QPushButton::clicked, [this](){ |
编译运行,可过之。
最终,你得到了一个神人程序!同时,你也学会了 4 种连接信号、槽的方式:
- 在
widget.h
中声明规范名字的函数(可以在 UI 界面自动声明),然后在widget.cpp
中编写该函数。 - 使用
connect(ui->x, SIGNAL(signal()), receiver, SLOT(function()))
实现。 - 使用
connect(ui->x, &ClassName::signal, receiver, &ClassName::slot)
实现。 - 使用
lambda
表达式替换第三、四个参数,即receiver
和method
参数。
今日源码:点击此处
- Title: QT 学习 - R70727
- Author: 11490DX
- Created at : 2025-07-28 07:48:35
- Updated at : 2025-07-29 20:45:32
- Link: https://11490dx.net/2025/07/28/QT-R70727/
- License: This work is licensed under CC BY-NC-SA 4.0.