Qt文档阅读笔记-Advanced Signals and Slots Usage解析与实例
生活随笔
收集整理的這篇文章主要介紹了
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()信號去去判斷是那個按鈕按下,從而正確處理信號
?
?
博主小栗子
對官方例子的實現
運行截圖如下:
源碼如下:
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_Hadvancedqt.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_Hwidget.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_Hmain.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解析与实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-在界面上输出变量、类、th
- 下一篇: Qt工作笔记-UDP多线程数据处理及发送