工作原因需要用到VS和Qt,在网上搜索了很久都没找到比较全面的在VS下联合开发Qt的教程。使用QT Creater单独开发能通过转到槽函数/双击插件,进行跳转一个插件的响应函数,但是VS上没有转到槽这一项,就挺烦人的。而且说是用过MFC的人转到Qt挺快的,本渣渣表示并不是啊,看其他博客我还是看的可蒙圈。于是本渣渣决定还是自己一边学,一边把要注意的点记录下来,希望能给和我有一样困惑的小伙伴们提供一些帮助吧。
Qt的下载以及VS2022和Qt联合开发的环境配置方法我已写在专栏的另一个博客Qt5.9.8安装教程以及VS2022+QT开发环境搭建-CSDN博客,希望对大家有帮助!
Qt界面在VS2022实现自动生成槽函数
先把槽函数这个问题解决了。
例子:点击按钮显示文本
步骤1:新建一个Qt Widgets Application项目打开UI界面。双击QtWidgetsApplication1.ui文件
如图所示,在界面上拖拽一个按钮插件,一个文本显示插件(lineEdit),调整到合适大小。
步骤2: 编辑信号/槽
鼠标选中按钮插件,将按钮往外拉一下,这样才会让按钮的信号输出出来。否则会变成外部输入对按钮的影响的槽函数。
步骤3: 编辑/创建槽函数
松开鼠标,会进入配置连接界面。
选择编辑,添加槽函数。按图示操作
得到
步骤4:回到VS窗口,在VS解决方案中选中方案,右键->Qt->Refresh intelliSense进行刷新
步骤5:在VS解决方案中右键 .ui 文件 -> "编译",会生成对应的 ui_XX.h 头文件
步骤6:在VS解决方案外部依赖项中打开ui_QtWidgetsApplication1.h文件,出现connect函数后,自动添加槽函数连接成功。
在这里补充一下信号和槽的一些知识:
信号和槽机制是完成任意两个 Qt 对象之间的通信机制。其中,信号会在某个特定情况或动作下被触发,槽是等同于接收并处理信号的函数信号与槽机制的连接方式有以下几种:
(1)一个信号可以与另一个信号相连
connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal1));
(2)同一个信号可以与多个槽相连,代码如下:
connect(Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));
connect(Object1,SIGNAL(signal2),Object3,SIGNAL(slot1));
(3)同一个槽可以相应多个信号,代码如下:
connect(Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));
connect(Object3,SIGNAL(signal2),Object2,SIGNAL(slot2));
通常情况下的连接方式为:
connect(Object1,SIGNAL(signal),Object2,SLOT(slot));
其中,signal 为对象Object1的信号,slot为对象Object2的槽。
步骤7:打开QtWidgetsApplication1.h、QtWidgetsApplication1.cpp两个文件,添加相关功能。
.h文件中,添加private slots:标明信号类函数。
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication1.h"
class QtWidgetsApplication1 : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsApplication1(QWidget *parent = nullptr);
~QtWidgetsApplication1();
private:
Ui::QtWidgetsApplication1Class ui;
//相应功能槽函数
private slots:
void PushButtonClicked();
};
.cpp文件中添加具体的功能。
#include "stdafx.h"
#include "QtWidgetsApplication1.h"
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
QtWidgetsApplication1::~QtWidgetsApplication1()
{}
void QtWidgetsApplication1::PushButtonClicked()
{
QString pushButtonShowText = "You Have Already Clicked The Push Button!!!";
ui.lineEdit->setText(pushButtonShowText);
}
运行结果
点击按钮后的界面
删除一部分文字
再次点击按钮
至此,成功完成槽函数在VS2022下的搭建。
详细了解Qt界面以及编程环境
通过一个简单的小例子来熟悉QT。
例子:计算圆面积
步骤1:新建一个Qt Widgets Application项目。
main函数
#include "stdafx.h"
#include "QtCircleCalculate.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtCircleCalculate w;
w.show();
return a.exec();
}
其中,
(1) #include “QtCircleCalculate.h”: 包含了程序中要完成功能的 Dialog 类的定义,在 Dialog 类中封装完成所需要的功能。
(2) #include < QtWidgets/QApplication>: Application 类的定义。在每个使用 Qt 图形化应用程序中都必须使用一个 QApplication 对象。 QApplication 管理了各种各样的图形化应用程序的广泛资源、基本设置、控制流及事件处理等。
(3)int main(int argc, char *argv[ ]): 应用程序的入口,几乎在所有使用 Qt 的情况下,main函数只需要在将控制转交给 Qt 库之前执行初始化,Qt 库通过事件向程序告知用户的行为。所有 Qt 程序中都必须有且只有一个 main()函数。main()函数有两个参数,即 argc(命令行变量的数量) 和 argv(命令行变量的数组)。
(4) QApplication a(argc, argv): a 是这个程序的 QApplication 对象。在任何 Qt 的窗口系统部件被使用之前必须创建 QApplication 对象。它在这里被创建并且处理这些命令行变量。所有被 Qt 识别的命令行参数都将从 argv 中被移去(并且 argc 也因此而减少)。
(5) w.show( ): 当创建一个窗口部件的时候,默认它是不可见的,必须调用 show( )函数使它变为可见。
(6) return a.exec( ): 程序进入消息循环,等待可能的输入进行响应。这里就是 main() 函数将控制权转交给 Qt, Qt 完成事件处理工作,当应用程序退出的时候, exec( )函数的值就会返回。在 exec()函数中, Qt 接收并处理用户和系统的事件并且将它们传递给适当的窗口部件。
接下来我们将用两种方式完成计算圆面积功能。
方案一:触发按钮事件:在 “lineEdit” 文本框内输入半径值,单击按钮,在 lineEdit_2中显示对应的圆面积。
步骤1:双击QtCircleCalculate.ui文件进入QT Designer界面,在界面上拖拽一个按钮插件,两个个文本显示插件(lineEdit),调整到合适大小(如下图所示)。
步骤2:编辑/创建槽函数
按照前文中提到的方法按住按钮并往外拖动,松开鼠标,会进入配置连接界面。
步骤3:选择编辑,添加槽函数。按图示操作
步骤4:回到VS窗口,在VS解决方案中选中方案,右键->Qt->Refresh intelliSense进行刷新
步骤5:在VS解决方案中右键 .ui 文件 -> "编译",会生成对应的 ui_XX.h 头文件
步骤6:在VS解决方案外部依赖项中打开ui_QtCircleCalculate.h文件,出现connect函数后,自动添加槽函数连接成功。
步骤7:打开QtCircleCalculate.h、QtCircleCalculate.cpp两个文件,添加相关功能。
.h文件中,添加private slots:标明信号类函数。
#pragma once
#include <QtWidgets/QDialog>
#include "ui_QtCircleCalculate.h"
class QtCircleCalculate : public QDialog
{
Q_OBJECT
public:
QtCircleCalculate(QWidget *parent = nullptr);
~QtCircleCalculate();
private:
Ui::QtCircleCalculateClass ui;
//相应功能槽函数
private slots:
void on_pushButton_clicked();
};
.cpp文件
#include "stdafx.h"
#include "QtCircleCalculate.h"
const static double PI = 3.1416;
QtCircleCalculate::QtCircleCalculate(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
}
QtCircleCalculate::~QtCircleCalculate()
{}
void QtCircleCalculate::on_pushButton_clicked()
{
bool ok;
QString tempStr;
QString valueStr = ui.lineEdit->text();
int valueInt = valueStr.toInt(&ok);
double area = valueInt * valueInt * PI;
ui.lineEdit_2->setText(tempStr.setNum(area));
}
运行结果
方案二:触发输入编辑框事件:在 “Line Edit” 文本框内输入半径值,不需要单击按钮触发单击事件,直接就在lineEdit_2 中显示圆面积。
步骤1:编辑/创建槽函数
按照前文中提到的方法按住第一个编辑框并往外拖动,松开鼠标,会进入配置连接界面。
在对话框中选择 “textChanged(QString)” 信号,如图所示。
步骤2:回到VS窗口,在VS解决方案中选中方案,右键->Qt->Refresh intelliSense进行刷新。在VS解决方案中右键 .ui 文件 -> "编译",会生成对应的 ui_XX.h 头文件。在VS解决方案外部依赖项中打开ui_QtCircleCalculate.h文件,出现connect函数后,自动添加槽函数连接成功。
步骤3:打开QtCircleCalculate.h、QtCircleCalculate.cpp两个文件,添加相关功能。
.h文件
#pragma once
#include <QtWidgets/QDialog>
#include "ui_QtCircleCalculate.h"
class QtCircleCalculate : public QDialog
{
Q_OBJECT
public:
QtCircleCalculate(QWidget *parent = nullptr);
~QtCircleCalculate();
private:
Ui::QtCircleCalculateClass ui;
//相应功能槽函数
private slots:
void on_pushButton_clicked();
void on_lineEdit_textChanged(const QString& arg1);
};
.cpp文件
#include "stdafx.h"
#include "QtCircleCalculate.h"
const static double PI = 3.1416;
QtCircleCalculate::QtCircleCalculate(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
}
QtCircleCalculate::~QtCircleCalculate()
{}
void QtCircleCalculate::on_pushButton_clicked()
{
bool ok;
QString tempStr;
QString valueStr = ui.lineEdit->text();
int valueInt = valueStr.toInt(&ok);
double area = valueInt * valueInt * PI;
ui.lineEdit_2->setText(tempStr.setNum(area));
}
void QtCircleCalculate::on_lineEdit_textChanged(const QString& arg1)
{
bool ok;
QString tempStr;
QString valueStr = ui.lineEdit->text();
int valueInt = valueStr.toInt(&ok);
double area = valueInt * valueInt * PI;
ui.lineEdit_2->setText(tempStr.setNum(area));
}
运行结果
小结:一开始用还挺不适应的,但是多做几个例子就很容易上手了(看来有MFC基础确实会学得很快)。所以不断练习,不断熟练,才是掌握一项技能的方法呀。相关代码我已经上传到 GitHub上了(key-cc/QT_EX: This repository is about some exercise code of QT while learning, hope this can help you for QT learning. (github.com)),大家可以自行下载。不方便上GitHub的话,CSDN我也传了一份(【免费】VS2022联合Qt5开发项目(槽函数)资源-CSDN文库《VS2022联合Qt5开发项目(计算圆面积)资源-CSDN文库)。关于GitHub加速的问题,我在另外一篇博文(Github访问速度慢的解决方案-CSDN博客)里有写到方法,希望对大家有帮助。