QT 学习 - R70727

11490DX Re: Master Lv.15

我不会入门。

这是 QT 的主页面。

创建 Qt Widgets Application

如果你想创建一个项目,那么先点【创建项目】,然后跟着它的步骤走。注意到当前你想创建的是一个窗口 APP,所以选择 Application (Qt) → Qt Widgets Application。

之后就分成七步:

  1. Location:确定你的项目的名称和路径。可以设置默认项目路径。
  2. 构建系统:用的什么东西来构建系统。如 qmake、CMake、Qbs。这里我用的是 qmake。
  3. Details:设置你的类的种类和类名称。类种类分为 QMainWindow、QWidget、QDialog。QMainWindow 和 QWidget 的区别就是前者是那种类似于大型窗口,拥有「文件(F)、编辑(E)」等的菜单,而 QWidget 就是类似于 Win+R 呼唤出来的运行的小窗口一样。QDialog 则是对话框,很少用。
  4. Translation:目前没有做外语翻译的打算。
  5. 构建套件(Kit):构建套件。我使用的是 MinGW 64-bit。毕竟对我来说比较友好嘛。
  6. 汇总:这里我啥都没选。最下面可以看见你这个项目要添加的文件。

项目编辑界面

对于一个新创建的一个项目,你拥有 {name}.pro 文件,即你这个项目的工程文件。以及你的 main.cppwidget.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
2
3
4
5
6
7
void Widget::on_commitButton_clicked(){
// 获取 Lineedit 数据
QString program = ui -> cmdLineEdit -> text();
// 创建一个 process 对象
QProcess *myProcess = new QProcess(this);
myProcess->start(program);
}

槽函数写好了,于是你编译运行一下,就能实现效果了。

但是你现在想实现回车就可以跳出窗口怎么做?目前已知在 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
2
3
4
5
6
7
8
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);

+ connect(ui->cmdLineEdit, SIGNAL(returnPressed()), this, SLOT(on_commitButton_clicked()));;
}

写好了之后,再编译运行一下,就能实现回车后跳出的效果了!

【取消】部分

欲实现的功能是点击【取消】后该窗口关闭。这里再讲解另一种方法:

先在 widget.hprivate slots: 里面加一个 void on_cancelButton_clicked() 的声明。

然后去 Widget.cpp 里面编写该函数。

1
2
3
void Widget::on_cancelButton_clicked(){
this->close();
}

写完了之后,编译运行后就可以过了。不过如果你这个函数名字改了怎么办?这个时候可以使用地址连接法。即为:

1
connect(ui->cancelButton, &QPushButton::clicked, this, &Widget::on_cancelButton_clicked);

亦可过。

【我要打舞萌】部分

欲实现按下【我要打舞萌】弹出一个自定义标题、内容、按钮说明的信息框,实现这种函数内写的东西比较少的就没必要再写一个函数了。可以使用 lambda 表达式来做。

回忆一下,写排序的时候,你的 lambda 是怎么写的?[&](auto x, auto y){...}[] 是捕获列表,() 是参数列表,{} 内就是函数主体了。

那么这里也很相似,捕获列表就变成了第三个参数,表达式的函数体就变成了第四个参数。稍微修改一下 lambda 表达式:

1
2
3
connect(ui->browseButton, &QPushButton::clicked, [this](){
QMessageBox::information(this, "舞萌 DX 发来的公告", "赶快给我去打中二节奏", "神人舞萌痴");
});

编译运行,可过之。


最终,你得到了一个神人程序!同时,你也学会了 4 种连接信号、槽的方式:

  1. widget.h 中声明规范名字的函数(可以在 UI 界面自动声明),然后在 widget.cpp 中编写该函数。
  2. 使用 connect(ui->x, SIGNAL(signal()), receiver, SLOT(function())) 实现。
  3. 使用 connect(ui->x, &ClassName::signal, receiver, &ClassName::slot) 实现。
  4. 使用 lambda 表达式替换第三、四个参数,即 receivermethod 参数。

今日源码:点击此处

  • 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.
Comments