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(例如fullScreen),它可以工作 但是当我使用我定义的插槽(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);
答案 0 :(得分:4)
这里是样本:
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));
}
}
可能你可以删除一个表。
答案 1 :(得分:4)
如果SIGNAL未提供某些参数,则SLOT无法接收。 clicked()信号不提供任何参数。收到它的SLOT也不应该有。在任何情况下,您都可以让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";
}
}
答案 2 :(得分:0)
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
。
回顾一下,在我看来,你正在重新实现按钮组的一些功能。