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
类,它收集一组无参数信号,并使用与发送信号的对象相对应的整数、字符串或部件参数重新发出它们。所以你可以有这样一个:
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
将使用包含按钮编号的参数调用。
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 我的输出中有一个额外的 0,为什么会这样
- 节点是否为空,即使它有一个值?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 在 Stream C++ 文本之前有一个额外的换行符
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 有一个构造函数,但有两个析构函数
- 我有一个关于C++提升的问题:: asio 和 std :: 异步