Qt - 我有一个QPushButton QVector,其中一个被按下了?

时间:2015-06-03 04:49:23

标签: c++ qt qpushbutton qvector

我有QLineEdit s和QCheckBox es QVector s - 我还有一个QPushButton QVector,当按下一个元素时,相应的{{} 1}}和QLineEdit也会被移除。

如何找出按下哪个按钮来确定要删除的索引?目前我现在只使用QCheckBox es,这很容易,但我觉得有点笨重。

1 个答案:

答案 0 :(得分:2)

直截了当的方法是在按钮按钮插槽中使用QObject::sender()来找出发出信号的按钮。然后,您应该遍历按钮向量:

QObject* obj = sender();
for(int i=0;i<buttonVector.count();i++)
{
    if( obj == qobject_cast<QObject *>(buttonVector[i]))
    { 
      ...
    }
}

一种解决方法是使用QObject::setObjectName并为您添加的按钮设置一些名称:

button.setObjectName(QString("%1").arg(i));

在插槽中,您可以使用对象名称检索按钮编号:

void MainWindow::buttonClicked()
{
    QPushButton *button = qobject_cast<QPushButton *>(QObject::sender());

    int number = button->objectName().toInt();
}

另一种方法是使用收集一组无参数信号的QSignalMapper类,并使用与发送信号的对象相对应的整数,字符串或窗口小部件参数重新发出它们。所以你可以有一个像:

QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(buttonClicked(int)));

在修改按钮时,您可以将按钮的clicked()信号连接到map()的{​​{1}}位置,并使用QSignalMapper添加映射,以便setMapping时1}}从按钮发出信号,发出信号clicked()

mapped(int)

这样,无论何时单击按钮,都会发出包含按钮编号的映射器的button = new QPushButton(); QObject::connect(button, SIGNAL(clicked()),mapper,SLOT(map())); mapper->setMapping(button, i); 信号,因此使用包含按钮编号的参数调用mapped(int)