将多个信号连接到一个插槽



我有以下问题。

有两个signals:

void buttonChanged(int);
void pulseWidthValue(int);

从时隙nextBtn:发射buttonChanged


void Program::nextBtn()
{
m_currentBtn++;
if(m_currentBtn > btnGrp->buttons().size())
{
m_currentBtn = 0;
phaseOver = true;
saveToXMLFile();
}
emit buttonChanged(m_currentBtn);
}

它的连接方式如下:

connect(ui->btn_nextPhase, &QPushButton::clicked, this, &Program::nextBtn);
connect(this, &Program::buttonChanged, this, &Program::paintBtn);

signalbuttonChanged在另一个插槽中用于绘制按钮:


void Program::paintBtn(int id) // how do I change the def of this function to receive to signal?
{

if(id==1)
{
ui->btn1->setStyleSheet(StyleSheetOn);
ui->btn2->setStyleSheet(StyleSheetOff);
ui->btn3->setStyleSheet(StyleSheetOff);
}
else if(id==2)
{
ui->btn1->setStyleSheet(StyleSheetOff);
ui->btn2->setStyleSheet(StyleSheetOn);
ui->btn3->setStyleSheet(StyleSheetOff);
}
else if(id==3)
{
ui->btn1->setStyleSheet(StyleSheetOff);
ui->btn2->setStyleSheet(StyleSheetOff);
ui->btn3->setStyleSheet(StyleSheetOn);
}
else
{
ui->btn1->setStyleSheet(StyleSheetOff);
ui->btn2->setStyleSheet(StyleSheetOff);
ui->btn3->setStyleSheet(StyleSheetOff);
}

ui->label_7->setText(QString::number(pw_value)); // this pw_value is from the other signal pulseWidthValue
}

其基本思想是,有3个阶段按钮,单击Next将在这些按钮之间切换并更改其颜色。现在我需要使用paintBtn内的另一个信号pulseWidthValue

现在我来问一个问题:

如何将两个信号buttonChangedpulseWidthValue(两个信号来自不同的功能(连接到paintBtn插槽?

Qt允许您多次连接,甚至可以连接到相同的插槽。它甚至允许您在信号之间进行连接。检查一下这个例子,它并不意味着功能性的,而是描述性的,足以看到许多选项和可访问性。

class A:public QObject
{
Q_OBJECT
...
signals:
void signalA1();
void signalA2(const QString &);
}
class B:public QObject
{
Q_OBJECT...
signals:
void signalB();
public slots:
void slotB();
}
class C:public QObject
{
...
public:
C(QObject *parent):QObject(parent)
{
a=new A(this);
b=new B(this);
}
void connectionTest()
{
connect (a,&A::signalA1,b,&B::slotB) ; // one connection to slot B::slotB 
connect (this,&C::signalC,b,&B::slotB); // another connection to B::slotB
connect (a,&A::signalA1,this,&C::slotC) ; // another connection from A::signalA, slotC is private so only I can connect
connect (b,&B::signalB,this,&C::signalC); // connection from signal to signal
connect (a,&A::signalA2,this,&C::slotC); //connection from A::signalA2 to C::slotC 
//with different argument count, but compatible as slotC doesn't need an argument

connect (a,&A::signalA1,b,&B::slotB) ; // duplicate connection to slot B::slotB  (signalA1 will trigger slotB two times)
}
signals:
void signalC();
private slots:
void slotC();
private:
class A *a;
class B *b;
}

最新更新