Qt - 我有一个 QPushButton QVector,按下了哪个?
Qt - I have a QPushButton QVector, which one was pressed?
我有 QLineEdit
s 和 QCheckBox
es QVector
s - 我还有一个 QPushButton
QVector
当一个元素被按下时,相应的QLineEdit
和 QCheckBox
也被删除。
如何找出按下哪个按钮来确定要删除的索引?目前我正在使用 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
class 收集一组无参数信号,并使用与发送信号的对象对应的整数、字符串或小部件参数重新发射它们。所以你可以有一个这样的:
QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(buttonClicked(int)));
在新建按钮时,可以将按钮的 clicked()
信号连接到 QSignalMapper
的 map()
插槽,并使用 setMapping
添加映射,这样当clicked()
从按钮发出信号,发出信号 mapped(int)
:
button = new QPushButton();
QObject::connect(button, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(button, i);
这样,无论何时单击按钮,映射器的 mapped(int)
信号都会发出,其中包含按钮编号,因此 buttonClicked
会使用包含按钮编号的参数进行调用。
我有 QLineEdit
s 和 QCheckBox
es QVector
s - 我还有一个 QPushButton
QVector
当一个元素被按下时,相应的QLineEdit
和 QCheckBox
也被删除。
如何找出按下哪个按钮来确定要删除的索引?目前我正在使用 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
class 收集一组无参数信号,并使用与发送信号的对象对应的整数、字符串或小部件参数重新发射它们。所以你可以有一个这样的:
QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(buttonClicked(int)));
在新建按钮时,可以将按钮的 clicked()
信号连接到 QSignalMapper
的 map()
插槽,并使用 setMapping
添加映射,这样当clicked()
从按钮发出信号,发出信号 mapped(int)
:
button = new QPushButton();
QObject::connect(button, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(button, i);
这样,无论何时单击按钮,映射器的 mapped(int)
信号都会发出,其中包含按钮编号,因此 buttonClicked
会使用包含按钮编号的参数进行调用。