• 2135阅读
  • 3回复

[提问]多个信号连接一个槽函数,可以让信号传递多余的参数吗? [复制链接]

上一主题 下一主题
离线纹枰老妖
 

只看楼主 倒序阅读 楼主  发表于: 2021-02-03
一个应用里面有100个同类按钮,每个按钮代表不同字符串,按下某个按钮,应用输出对应字符串。我只想写一个槽函数完成这功能,关键代码如下所示:
  1. QPushButton btn[10][10];
  2. ...
  3. ...
  4.     for(int row=0; row<10; row++)
  5.         for(int col=0; col<10; col++)
  6.         {
  7.              gridLayout->addWidget(&btn[ row ][ col ], row, col);
  8.              connect(&btn[row][col], SIGNAL(clicked(int row, int col)),
  9.                                              this,SLOT(slotOutput(int row, int col)));
  10.         }
可是上面的代码并不能完成工作,明显最后的那句connect代码有问题,达不到我的预期;
所以我来这里问问大家:当用户点击那100个按钮数组中的某个按钮时,会发出一个信号,那么能不能让这个信号携带着多余的自定义参数,如果可以这个样,那我这个槽函数如何接收这些多余的参数呢?

离线lemonzll

只看该作者 1楼 发表于: 2021-02-03
这个用Qt5的signal slot新语法,直接用lambda函数不是就搞定了吗?
1条评分金钱+5
纹枰老妖 金钱 +5 - 2021-02-14
离线飞翔梦幻

只看该作者 2楼 发表于: 2021-02-04
    QSignalMapper* m_Mapper = new QSignalMapper(this);
    for (int i = 0; i < 4; i++)
    {
        m_pTurnPageBtn = new QPushButton();
        m_pTurnPageBtn->setFixedSize(60, iHeight);
        m_pTurnPageBtn->setFont(QFont("宋体", 10, QFont::Bold));
        if (i == 0)
            strSerInfo = tr("Home");
        else if (i == 1)
            strSerInfo = tr("Pre");
        else if (i == 2)
            strSerInfo = tr("Next");
        else if (i == 3)
            strSerInfo = tr("End");

        m_pTurnPageBtn->setText(strSerInfo);
        m_pTurnPageBtn->setToolTip(strSerInfo);
        m_pTurnPageBtn->setStyleSheet("QPushButton{background:transparent;color:rgb(0,88,152)}"//
            "background-color:rgba(97%,80%,9%,50%);}");
        m_Mapper->setMapping(m_pTurnPageBtn, i);
        m_pLeftToolBar->addWidget(m_pTurnPageBtn);
        connect(m_pTurnPageBtn, SIGNAL(clicked()), m_Mapper, SLOT(map()));
    }
1条评分金钱+5
纹枰老妖 金钱 +5 - 2021-02-14
离线纹枰老妖

只看该作者 3楼 发表于: 2021-02-14
回 飞翔梦幻 的帖子
飞翔梦幻:    QSignalMapper* m_Mapper = new QSignalMapper(this);
    for (int i = 0; i < 4; i++)
    {
        m_pTurnPageBtn = new QPushButton();
   &n .. (2021-02-04 10:29) 

谢谢您朋友,学会了。
不过在上面的代码中,少了最后的一个connect,也就是需要处理信号的槽函数链接。比如我们最终处理按钮按下的槽函数名字叫slotProcess(int),那么就需要在外面加一句【connect(m_Mapper,SIGNAL(mapped()),this,SLOT(slotProcess(int)))】这样的代码。
写在这里回复您,是为了巩固一下自己的记忆,如有叨扰我很抱歉。再次致谢您!
快速回复
限100 字节
 
上一个 下一个