网站快速建设软件下载,全屏wordpress,郑州建设企业网站,长春制作网站企业目录 标准文件结构widget.hwidget.cppmain.cpppro 文件 信号与槽自定义信号connect 的两种方式 标准文件结构 widget.h
widget 对象的头文件
一般会直接在头文件导入所有后续在 cpp 文件内用到的类#xff0c;所以 include 基本都会写在这里
// 头文件标志起始
#ifndef WID… 目录 标准文件结构widget.hwidget.cppmain.cpppro 文件 信号与槽自定义信号connect 的两种方式 标准文件结构 widget.h
widget 对象的头文件
一般会直接在头文件导入所有后续在 cpp 文件内用到的类所以 include 基本都会写在这里
// 头文件标志起始
#ifndef WIDGET_H
#define WIDGET_H// 头文件导入
#include QWidget// 这一块不要动你也动不了现在
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECT// 初始化定义区域定义非信号和槽方法
public:Widget(QWidget *parent nullptr);~Widget();// 定义信号的区域
signals:// 定义槽的区域
private slots:void on_pushButton_clicked();// 定义全局私有变量
private:Ui::Widget *ui;
};
#endif // WIDGET_Hwidget.cpp
// 头文件导入区
#include Widget.h
#include ui_Widget.h// 主构造函数可以自定义构造函数的参数以及继承规则
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);// 定义Widget被实例化后立刻执行的代码// 比如TCP链接或者调试输出啥的
}// 析构函数用于Widget被销毁前需执行的代码
Widget::~Widget()
{delete ui;
}// 在这里定义信号以及槽的具体实现方法
// ...main.cpp
主入口文件
#include Widget.h#include QApplication// 主入口代码从这里执行
int main(int argc, char *argv[])
{QApplication a(argc, argv);// 实例化widget后使用show显示他Widget w;w.show();// 程序结束使用execreturn a.exec();
}pro 文件
该文件比较复杂具体使用方式请查看帮助文档这里没办法告诉你具体的使用方式
最常用的就是当你使用 TCP 链接或者任意网络请求时必须要在第一行的末尾添加一个 network就在下方代码第一行末尾注释区那边
QT core gui #networkgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES \main.cpp \Widget.cppHEADERS \Widget.hFORMS \Widget.ui# Default rules for deployment.
qnx: target.path /tmp/$${TARGET}/bin
else: unix:!android: target.path /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS target信号与槽 自定义信号 实现功能点击按钮发射一个信号widget 获取信号后执行对应槽函数输出一段信息此过程含有信息的传递 新建一个 Widget 文件UI 设计图添加一个 pushbutton重命名为 firstBtn并且为其添加一个空的 clicked() 槽
此时的 Widget.h 文件应该是这样的
#ifndef WIDGET_H
#define WIDGET_H#include QWidget
#include QDebugQT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();// 自定义一个新的信号其接收一个字符串参数
signals:void firstSignal(QString msg);// firstEmit为自定义槽函数用于响应自定义信号firstSignal
// on_firstBtn_clicked为按钮点击相应槽函数
private slots:void firstEmit(QString msg);void on_firstBtn_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H代码清单 Widget.cpp
注意如果信号定义 N 个形参那么对应接收的槽也必须有等于或少于 N 个的形参绝对不能大于 N因为发射的信号的所有参数值都会一一传递给槽函数所有参数都是对应关系
#include Widget.h
#include ui_Widget.hWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);// 第一步connect链接信号和槽// 参数一信号发出者这里选择当前widget// 参数二欲发出的信号// 参数三信号接收者这里也是当前widget// 参数四欲处理对应信号的槽函数connect(this,Widget::firstSignal,this,Widget::firstEmit);
}Widget::~Widget()
{delete ui;
}// 第二步定义处理信号的槽函数
// 函数有一个形参用于接收信号传递过来的参数
void Widget::firstEmit(QString msg)
{// 调试输出信号发射过来的参数msgqDebug() msg;
}// 第三步定义发射信号的按钮响应槽函数
void Widget::on_firstBtn_clicked()
{// 使用emit发射对应名称的信号注意我们这里传入了一个字符串作为参数emit firstSignal(shit);
}此时保存文件编译运行可见点击按钮后就会在 console 里面看见我们输出的调试信息了 connect 的两种方式 特别注意只要选择了一种方式那么信号和槽都必须使用同种方式添加不能说我信号使用 SIGNAL 然后槽使用引用这是不对的 链接信号和槽时可以使用引用的方式或者实例化对象的方式
实例化时信号和槽末尾要添加小括号引用时不能保留小括号
#include MainWindow.h
#include ui_MainWindow.hMainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);// 方法一使用SIGNAL以及SLOT传入信号和槽connect(this,SIGNAL(customSignal()),this,SLOT(on_pushButton_clicked()));// 方法二直接使用引用传入信号和槽connect(this,MainWindow::customSignal,this,MainWindow::on_pushButton_clicked);emit customSignal();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{qDebug() this is a sentence;
}