没有这样的插槽按钮QT
No such slot button QT
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
button[i][j] = new QPushButton("Empty", this);
button[i][j]->resize(40, 40);
button[i][j]->move(40*j, 40*i);
connect(button[i][j], SIGNAL(clicked()), this, SLOT(changeText(button[i][j])));
}
}
如果我改变函数changeText与功能(全屏为例),它的工作原理但是当我使用由我定义的插槽(changeText)这个错误出现,我不知道如何解决它
QObject::connect: No such slot buttons::changeText(&button[i][j])
这是函数changeText:
void buttons::changeText(QPushButton* button)
{
button->setText("Fish");
}
注意:在头文件中我是这样定义槽的:
类按钮:public QWidget
Q_OBJECT
public slots:
void changeText(QPushButton* button);
- slot可以有比信号更少的参数,但它的参数类型必须与连接信号中的参数类型完全匹配。
- 你不能有这样的动态插槽
- 可能你需要的是一个QSignalMapper。
下面是示例:
QSignalMapper *map = new QSignalMapper(this);
connect (map, SIGNAL(mapped(QString)), this, SLOT(changeText(QString)));
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
button[i][j] = new QPushButton("Empty", this);
button[i][j]->resize(40, 40);
button[i][j]->move(40*j, 40*i);
connect(button[i][j], SIGNAL(clicked()), map, SLOT(map()));
map->setMapping(button[i][j], QString("Something%1%2").arg(i).arg(j));
}
}
也许你可以删除一个表
如果SIGNAL没有提供某个参数,则SLOT无法接收。clicked()的信号没有提供任何参数。接收它的插槽也不应该有任何属性。在任何情况下,您都可以让一个SLOT接收比SIGNAL提供的更少的参数(忽略其他一些参数),但不能有其他情况。但是,您可以了解信号的发送者,将其转换为QPushButton*并对其进行处理:
void buttons::changeText()
{
QPushButton *pb = qobject_cast<QPushButton *>(sender());
if (pb){
pb->setText("fish");
} else {
qDebug() << "Couldn't make the conversion properly";
}
}
QButtonGroup是一个被设计为方便的按钮集合的类。你可以直接进入触发插槽的按钮。它还为您提供了使用给定id注册按钮的可能性。如果您想从按钮id中轻松检索一些元信息,这可能很有用。
QButtonGroup* buttongrp = new QButtonGroup();
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
button[i][j] = new QPushButton("Empty", this);
button[i][j]->resize(40, 40);
button[i][j]->move(40*j, 40*i);
buttongrp->addButton(button[i][j], i << 16 + j);
}
}
QObject::connect(buttongrp, SIGNAL(buttonClicked(int)),
this, SLOT(getCoordinates(int)));
QObject::connect(buttongrp, SIGNAL(buttonClicked(QAbstractButton *)),
this, SLOT(changeText(QAbstractButton * button)));
...
void MyObject::changeText(QAbstractButton * button)
{
button->setText("Fish");
}
void MyObject::getCoordinates(int id){
int i = id >> 16;
int j = ~(i << 16) & id;
//use i and j. really handy if your buttons are inside a table widget
}
通常你不需要同时连接两个插槽。对于id,我假设高度和宽度小于2^16
。
回顾一下,我觉得你好像是在重新实现按钮组的一些功能。
相关文章:
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- NS3 插槽混淆(需要帮助理解)
- QObject::连接无法将信号连接到*this*对象的插槽
- QT 插槽未在主线程上调用
- 将QPush按钮::单击信号到插槽时出错
- Qt按钮无法连接插槽
- 添加按钮时出错,即使存在这样的插槽,也不存在
- 如何在点击时将矩阵中按钮的坐标传递到插槽
- 如何将ui文件类中的按钮连接到其他类中的插槽
- 如何在Qt小工具中删除带有插槽的按钮
- 没有这样的插槽按钮QT
- Qt按钮是呼叫2插槽,我只需要一个
- Qt如何使一个按钮响应时,插槽连接到它的click()信号正在运行
- 多个按钮插槽
- 无法添加插槽并连接到按钮