0
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])));
    }
}

如果我用函数(例如fullScreen)更改函数changeText,它可以工作,但是当我使用我定义的插槽(changeText)时出现此错误,我不知道如何解决它

QObject::connect: No such slot buttons::changeText(&button[i][j])

这是函数changeText:

void buttons::changeText(QPushButton* button)
{
    button->setText("Fish");
}

注意:在头文件中我定义了这样的插槽:

类按钮:公共 QWidget

    Q_OBJECT
public slots:
    void changeText(QPushButton* button);
4

3 回答 3

5
  1. slot 的参数可以少于信号,但它具有的参数类型必须与连接信号中的参数类型完全匹配。
  2. 你不能有这样的动态插槽。
  3. 可能您需要的是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));
    }
}

可能你可以删除一张桌子。

于 2013-06-16T22:13:00.750 回答
5

如果 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";
    }
} 
于 2013-06-16T23:10:07.490 回答
1

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,我假设 height 和 width 小于2^16.

回想起来,在我看来,您正在重新实现按钮组的一些功能。

于 2013-06-17T08:25:35.337 回答