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

Qt - I have a QPushButton QVector, which one was pressed?

本文关键字:一个 有一个 QPushButton QVector Qt      更新时间:2023-10-16

我有QLineEdit s和QCheckBox es QVector s -我也有QPushButton QVector,当一个元素被按下时,相应的QLineEditQCheckBox也被删除。

如何找出按下了哪个按钮以确定要删除哪个索引?目前我只是使用Checkbox es现在这是容易的,但有点笨重的我喜欢。

直接的方法是使用按钮按槽中的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()信号连接到QSignalMappermap()插槽,并使用setMapping添加映射,以便当按钮发出clicked()信号时,发出mapped(int)信号:

button = new QPushButton();
QObject::connect(button, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(button, i);

这样,每当您单击一个按钮时,映射器的mapped(int)信号将发出,其中包含按钮编号,因此buttonClicked将使用包含按钮编号的参数调用。

相关文章: