日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt文档阅读笔记-Advanced Signals and Slots Usage解析与实例

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt文档阅读笔记-Advanced Signals and Slots Usage解析与实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

目錄

官方解析

博主小栗子

對官方例子的實現

通過自定義信號與槽的方式,巧妙實現QSignalMap的功能


官方解析

某些時刻需要知道是哪個對象發的信號,可以用Qt提供了QObject::sender()獲得是哪個對象發出的信號。

QSignalMapper類用于這種情況當有很多信號連接到了一個槽函數,并且要對每一個信號做不同處理的時候用。

舉個例子,有3個按鈕將決定打開的是“Tax File”,“Accounts File”,“Report File”。

為了處理好正確的信號,使用QSiganlMapper::setMapping()將把所有的QPushButton::clicked()信號映射到一個QSignalMapper對象上面,然使用連接QPushButton::clicked()信號連接QSignalMapper::map()這個槽函數。

signalMapper = new QSignalMapper(this);signalMapper->setMapping(taxFileButton, QString("taxfile.txt"));signalMapper->setMapping(accountFileButton, QString("accountsfile.txt"));signalMapper->setMapping(reportFileButton, QString("reportfile.txt"));connect(taxFileButton, &QPushButton::clicked,signalMapper, &QSignalMapper::map);connect(accountFileButton, &QPushButton::clicked,signalMapper, &QSignalMapper::map);connect(reportFileButton, &QPushButton::clicked,signalMapper, &QSignalMapper::map);


然后通過mapped()信號去去判斷是那個按鈕按下,從而正確處理信號
?

connect(signalMapper, SIGNAL(mapped(QString)),this, SLOT(readFile(QString)));

?

博主小栗子

對官方例子的實現

運行截圖如下:

源碼如下:

advancedqt.h

#ifndef ADVANCEDQT_H #define ADVANCEDQT_H#include <QtWidgets/QWidget> #include "ui_advancedqt.h"QT_USE_NAMESPACE class QSignalMapper; QT_END_NAMESPACE#define AAAAclass AdvancedQt : public QWidget {Q_OBJECTpublic:AdvancedQt(QWidget *parent = 0);~AdvancedQt();protected slots:void popupAppointedMegBox(QString msg);private:Ui::AdvancedQtClass ui;QSignalMapper *signalMapper; };#endif // ADVANCEDQT_H

advancedqt.cpp

#include "advancedqt.h" #include "ui_advancedqt.h" #include <QSignalMapper> #include <QDebug>AdvancedQt::AdvancedQt(QWidget *parent): QWidget(parent) {ui.setupUi(this);setWindowTitle(QString::fromLocal8Bit("中文是否亂碼"));signalMapper=new QSignalMapper(this);signalMapper->setMapping(ui.cPushButton,QString("CDesk"));signalMapper->setMapping(ui.dPushButton,QString("DDesk"));signalMapper->setMapping(ui.ePushButton,QString("EDesk"));signalMapper->setMapping(ui.fPushButton,QString("FDesk"));connect(ui.cPushButton,SIGNAL(clicked()),signalMapper,SLOT(map()));connect(ui.dPushButton,SIGNAL(clicked()),signalMapper,SLOT(map()));connect(ui.ePushButton,SIGNAL(clicked()),signalMapper,SLOT(map()));connect(ui.fPushButton,SIGNAL(clicked()),signalMapper,SLOT(map()));connect(signalMapper,SIGNAL(mapped(QString)),this,SLOT(popupAppointedMegBox(QString)));}AdvancedQt::~AdvancedQt() {}void AdvancedQt::popupAppointedMegBox(QString msg) {qDebug()<<"The msg is "<<msg; }

main.cpp

nclude "advancedqt.h" #include <QtWidgets/QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);AdvancedQt w;w.show();return a.exec(); }

?

通過自定義信號與槽的方式,巧妙實現QSignalMap的功能

源碼如下:

mypushbutton.h

#ifndef MYPUSHBUTTON_H #define MYPUSHBUTTON_H#include <QPushButton>class MyPushButton : public QPushButton {Q_OBJECT public:MyPushButton(QWidget *parent = 0);void setMsg(const QString msg);signals:void sendMeg(QString msg);protected:void mouseReleaseEvent(QMouseEvent *event)Q_DECL_OVERRIDE;QString m_msg; };#endif // MYPUSHBUTTON_H

widget.h

#ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected slots:void prepareTodo(QString msg);private:Ui::Widget *ui; };#endif // WIDGET_H

main.cpp

#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

mypushbutton.cpp

#include "mypushbutton.h"MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent) {}void MyPushButton::setMsg(const QString msg) {m_msg=msg; }void MyPushButton::mouseReleaseEvent(QMouseEvent *event) {Q_UNUSED(event)emit sendMeg(m_msg); }

widget.cpp

#include "widget.h" #include "ui_widget.h"#include <QDebug>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);ui->cPushButton->setMsg("C Desk");ui->dPushButton->setMsg("D Desk");ui->ePushButton->setMsg("E Desk");ui->fPushButton->setMsg("F Desk");connect(ui->cPushButton,SIGNAL(sendMeg(QString)),this,SLOT(prepareTodo(QString)));connect(ui->dPushButton,SIGNAL(sendMeg(QString)),this,SLOT(prepareTodo(QString)));connect(ui->ePushButton,SIGNAL(sendMeg(QString)),this,SLOT(prepareTodo(QString)));connect(ui->fPushButton,SIGNAL(sendMeg(QString)),this,SLOT(prepareTodo(QString))); }Widget::~Widget() {delete ui; }void Widget::prepareTodo(QString msg) {qDebug()<<msg; }

?

總結

以上是生活随笔為你收集整理的Qt文档阅读笔记-Advanced Signals and Slots Usage解析与实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。