【问题标题】:Connect two signals to one slot将两个信号连接到一个插槽
【发布时间】:2020-05-21 06:13:24
【问题描述】:

我有一个名为paintButtonslot。槽内有切换条件如下图:

在每种情况下,我都需要接收一个名为 newValuesignal

void Program::paintButton(int id)
{

    switch(id)
    {
    case 1 :

       // recive  signal: "newValue" here
        int  portNo = 1;
        setValue(portNo, newValue);

        ui->btn1->setText("1");
        ui->btn2->setText("");
        ui->btn3->setText("");
        break;

    case 2 :

       // recive  signal: "newValue" here
        int  portNo = 2;
        setValue(portNo, newValue);

         ui->btn2->setText("2");
         ui->btn1->setText("");
         ui->btn3->setText("");
        break;

    case 3 :

      // recive  signal: "newValue" here
        int  portNo = 3;
        setValue(portNo, newValue);

        ui->btn3->setText("3");
        ui->btn1->setText("");
        ui->btn2->setText("");
        break;

    }

}

如何修改paintButton 插槽以接收两个信号(idnewValue)。或者有更好的方法吗?

提前致谢。

【问题讨论】:

    标签: c++ qt qtgui


    【解决方案1】:

    有人已经emit mysignal(id,value)了吗?如果是这样,请为此使用特定的方法。我将重新使用您的重载名称来显示:

    void Program::paintButton(int id, int value)
    {
         setValue(id, value);
         paintButton(id); 
    }
    
    void Program::paintButton(int id)
    {
        switch(id)
        {
        case 1 :
            ui->btn1->setText("1");
            ui->btn2->setText("");
            ui->btn3->setText("");
            break;
        case 2 :
             ui->btn2->setText("2");
             ui->btn1->setText("");
             ui->btn3->setText("");
            break;
        case 3 :
            ui->btn3->setText("3");
            ui->btn1->setText("");
            ui->btn2->setText("");
            break;
        }
    }
    

    您不能在代码中间等待信号。如果您需要响应两个不同信号中的第二个,您可能希望将每个信号附加到其自己的插槽:

    void Program::slotId(int id)
    {
        if (m_dopaint)
        {
            m_dopaint = false;
            paintButton(id, m_value)
        }
        else
        {
            m_id = id;
            m_dopaint = true;
        }
    }
    
    void Program::slotValue(int value)
    {
        if (m_dopaint)
        {
            m_dopaint = false;
            paintButton(m_id, value)
        }
        else
        {
            m_value = value;
            m_dopaint = true;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多