QSignalMapper的使用

来源:互联网 发布:迁移阿里云rds到aws 编辑:程序博客网 时间:2024/06/06 03:34

       QSignalMapper可以看作是信号的翻译和转发器,可以只写一个Slot函数,处理许多个不同的信号。

例子:

class SignalMapperTest : public QMainWindow{Q_OBJECTpublic:SignalMapperTest(QWidget *parent = 0);~SignalMapperTest();private slots:    void onBtnClick( int BtnId );void onMenuTriggered( QString str);void on_update_window_menu();private:Ui::SignalMapperTestClass ui;QSignalMapper* pSignalMapper;QPushButton* MyButtons[7];QAction* MyActions[7];int currentMenuIndex;};

SignalMapperTest::SignalMapperTest(QWidget *parent): QMainWindow(parent){ui.setupUi(this);pSignalMapper = new QSignalMapper( this );connect( pSignalMapper, SIGNAL(mapped( int)),this, SLOT( onBtnClick(int) ));connect( pSignalMapper, SIGNAL( mapped( QString )),this, SLOT(onMenuTriggered( QString )));connect(ui.menu_W, SIGNAL(aboutToShow()), this, SLOT(on_update_window_menu()));MyButtons[0] = ui.Btn1;MyButtons[1] = ui.Btn2;MyButtons[2] = ui.Btn3;MyButtons[3] = ui.Btn4;MyButtons[4] = ui.Btn5;MyButtons[5] = ui.Btn6;MyButtons[6] = ui.Btn7;for (int i = 0; i < 7; ++i){connect(MyButtons[i], SIGNAL( clicked()), pSignalMapper, SLOT(map() ) );pSignalMapper->setMapping( MyButtons[i], i);}//for (int j = 0; j < 7; ++j){MyActions[j] = ui.menu_W->addAction(QString("Action%1").arg(j));MyActions[j]->setCheckable(true);connect( MyActions[j], SIGNAL(triggered()), pSignalMapper, SLOT(map()));pSignalMapper->setMapping( MyActions[j], QString("Action%1").arg(j));}currentMenuIndex = 0;}SignalMapperTest::~SignalMapperTest(){}void SignalMapperTest::onBtnClick(int BtnId){if (BtnId >= 0 && BtnId < 7){ui.lineEdit->setText(MyButtons[BtnId]->text() );update();}}void SignalMapperTest::on_update_window_menu(){for (int i = 0; i < 7; ++i){MyActions[i]->setChecked(i == currentMenuIndex );}}void SignalMapperTest::onMenuTriggered(QString str){for (int i = 0; i < 7; ++i){QString str1 = MyActions[i]->text();if (str == str1){currentMenuIndex = i;}}ui.lineEdit->setText( str);update();}


效果:当点击右边Button时,左边lineEdit显示当前Button的内容。比如点击Btn5,lineEdit中显示“Btn5”。当点击窗口菜单项时,lineEdit显示当前触发的菜单动作。


0 0
原创粉丝点击