QComboBox的信号

QComboBox的最重要的信号activated和currentIndexChanged

两个信号的区别:

QComboBox::activated信号发射在用户打开选择了选项后,即便选项与当前选项一致,也会发射该信号
QComboBox::currentIndexChanged信号只在选项发生了变化的时候

这两个信号的发射顺序为,先QComboBox::currentIndexChanged
再QComboBox::activated

QComboBox* cbx=new QComboBox;
cbx->addItems(QStringList()<<"1"<<"2"<<"3");

//先发出currentIndexChanged信号,再发出activated信号
connect(cbx,QOverload::of(&QComboBox::currentIndexChanged),[]{
    qDebug()<<"QOverload::of(&QComboBox::currentIndexChanged)";
});

connect(cbx,QOverload::of(&QComboBox::activated),[]{
    qDebug()<<"QOverload::of(&QComboBox::activated)";
});

两个下拉框相互关联的问题

经常会有这样的需求:

将两个下拉框变化的信号相互关联上,使得任意一个下拉框被用户手动选择更改后,另外一个下拉框联动变化。

这里会有下拉框1改变导致下拉框2改变,下拉框2改变再导致下拉框1改变的死循环吗?

为什么不会?

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QWidget* center=new QWidget;
    QHBoxLayout* hlayout=new QHBoxLayout(center);
    QComboBox* cbx=new QComboBox;
    hlayout->addWidget(cbx);
    QComboBox* cbx2=new QComboBox;
    hlayout->addWidget(cbx2);

    cbx->addItems(QStringList()<<"1"<<"2"<<"3");
    cbx2->addItems(QStringList()<<"a"<<"b"<<"c");

    //将两个下拉框变化的信号相互关联上
    //使得任意一个下拉框被用户手动选择更改后,另外一个下拉框联动变化
    connect(cbx,QOverload::of(&QComboBox::currentIndexChanged),[=]{
        qDebug()<<"1:QOverload::of(&QComboBox::currentIndexChanged)";
        cbx2->setCurrentIndex(cbx->currentIndex());
    });


    connect(cbx2,QOverload::of(&QComboBox::currentIndexChanged),[=]{
        qDebug()<<"2:QOverload::of(&QComboBox::currentIndexChanged)";
        cbx->setCurrentIndex(cbx2->currentIndex());
    });
    this->setCentralWidget(center);
}

不会造成死循环的原因在于两个下拉框的下拉项数码一致,而且每次关联后的序号也一致。

而且下拉框的setCurrentIndex()方法设置一个当前正处于的序号是不会发出currentIndexChanged信号的。所以不会存在循环发送信号的问题。

你可能感兴趣的:(Qt)