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

Posted

技术标签:

【中文标题】Qt - 我有一个 QPushButton QVector,哪个被按下了?【英文标题】:Qt - I have a QPushButton QVector, which one was pressed? 【发布时间】:2015-06-03 04:49:23 【问题描述】:

我有QLineEdits 和QCheckBoxes QVectors - 我还有一个QPushButton QVector,当按下一个元素时,相应的QLineEditQCheckBox 也会被删除。

如何找出按下了哪个按钮来确定要删除哪个索引?目前我只是在使用Checkboxes,这很简单,但对我来说有点笨重。

【问题讨论】:

【参考方案1】:

直接的方法是在按钮按下槽中使用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

【讨论】:

还有 QButtonGroup,虽然这个用例与 QSignalMapper 相当 QSignalMapper 是我设法实现的一个可爱的解决方案。我发现唯一有点烦人的是,如果我删除一个按钮,我必须手动管理映射,因为 mapping->removeMapping() 不会调整任何东西的大小。谢谢@Negat!

以上是关于Qt - 我有一个 QPushButton QVector,哪个被按下了?的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 获取 QPushButton 图标名称

Qt 4.8:显示窗口时选择 QPushButton 上的文本

如何使用 QEvents 在 Qt 中模拟 QPushButton 单击

在推送 QPushButton 时将文本从 QTextEdit 发送到 QListWidget - Qt

Qt:如何连接“DialogClass1”的 QPushButton 来杀死“Class2”中的 QProcess?

[Qt入门] QPushButton创建