QT入门-重载的信号槽
1)
signals:
void sigSub();
void sigSub(int, QString);
然后发送的时候可以发送多个信号。
emit sigSub(100, “lol”);
在写connect函数的时候:
connect(&sb, &SubWidget::sigSub, this, &Widget::slotShowMe);
connect(&sb, &SubWidget::sigSub, this, &Widget::slotSubMessage);
这样写会报错:槽函数和信号匹配不了。
因为在这里sigSub是函数名的地址,不知道参数有几个。重载之后编译器不知道去找哪一个函数了。
考虑函数指针,当定义函数指针时,就显式地定义了有几个参数。
void (SubWidget::*MySigSub)() = &SubWidget::sigSub; //自动找那个没有参数的 注意函数指针属于SubWidget类
void (SubWidget::*MySigSubPlus)(int, QString) = &SubWidget::sigSub;//能够找到带参数的那个函数地址
connect(&sb, MySigSub, this, &Widget::slotShowMe);
connect(&sb, MySigSubPlus, this, &Widget::slotSubMessage);
2)注意slotSubMessage函数的输出要用QDebug类,qDebug() << a << ' '<< s;
如果打印出来的字符串是乱码,查看qDebug的参数为const char*,可能是参数不匹配(貌似QT 5.11已经没有这个问题了QAQ)。需要将QString转换为char*。
QString类有一个函数:toUtf8();
这样写即可:
qDebug() << a << ' '<< s.toUtf8().data();
注意:
std::string ss;
ss.c_str();
ss.data();//可以转化为char*
3)如果槽函数也重载了,还是需要定义一个函数指针。显式地声明槽函数的类型。注意别落下类名加作用域运算符。
//widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPushButton> #include "subwidget.h" QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); void slotOpenSubWindow(); void slotShowMe(); void slotSubMessage(int, QString); private: Ui::Widget *ui; QPushButton* b1;//显示子窗口 SubWidget sb;//子窗口对象 }; #endif // WIDGET_H
//subwidget.h #ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushButton> class SubWidget: public QWidget { Q_OBJECT public: explicit SubWidget(QWidget *parent = 0); signals: void sigSub(); void sigSub(int, QString); public slots: void myslot(); private: QPushButton* b1; }; #endif // SUBWIDGET_H
//widget.cpp #include "widget.h" #include "ui_widget.h" #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); b1 = new QPushButton("点我点我", this); b1->resize(100, 50); b1->move(300, 300); connect(b1, &QPushButton::clicked, this, &Widget::slotOpenSubWindow); void (SubWidget::*MySigSub)() = &SubWidget::sigSub; //自动找那个没有参数的 注意函数指针属于SubWidget类 void (SubWidget::*MySigSubPlus)(int, QString) = &SubWidget::sigSub;//能够找到带参数的那个函数地址 connect(&sb, MySigSub, this, &Widget::slotShowMe); connect(&sb, MySigSubPlus, this, &Widget::slotSubMessage); } Widget::~Widget() { delete ui; } void Widget::slotOpenSubWindow() { hide(); sb.show(); } void Widget::slotShowMe() { show(); sb.hide(); } void Widget::slotSubMessage(int a, QString s) { qDebug() << a << ' '<< s.toUtf8().data(); std::string ss; ss.c_str(); ss.data();//可以转化为char* }
//subwidget.cpp #include "subwidget.h" SubWidget::SubWidget(QWidget *parent): QWidget(parent) { b1 = new QPushButton("我草泥马的线段树", this); b1 -> resize(200, 100); b1->move(150, 150); setWindowTitle("我叫线段树"); resize(400, 600); connect(b1, &QPushButton::clicked, this, &SubWidget::myslot); } void SubWidget::myslot() { //发送信号 emit sigSub(); emit sigSub(100, "傻逼树状数组"); }
//main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!