QSignalMapper用法;多个QPushButtons分配给一个信号

时间:2014-03-21 20:00:43

标签: c++ qt qpushbutton

编辑:以下代码已更新为工作解决方案。

作为尝试向QT介绍自己,我试图用64个QPushButtons设计一个棋盘。我知道这可能不是最好的方法,但我相信从基础开始是一个很好的学习方法。无论如何,所有64个按钮基本上都会做同样的事情。所有按钮的单击信号将调用相同的函数,并将相关的QPushButton传递给函数。而不是在qtcreator&中单独创建每个QPushButton。 qtdesigner,并为每个按钮单独创建每个on_clicked信号函数,我正在尝试应用QSignalMapper。这就是我到目前为止所做的:

chess.h

#ifndef CHESS_H
#define CHESS_H

#include <QMainWindow>
#include <QSignalMapper>
#include <QPushButton>
#include <QGridLayout>
#include <QMessageBox>

namespace Ui {
class Chess;
}

class Chess : public QMainWindow
{
    Q_OBJECT

public:
    explicit Chess(QWidget *parent = 0);
    ~Chess();

public slots:
    void On_Clicked(int location);

private:
    Ui::Chess *ui;

    QPushButton *buttons[64];
};

#endif // CHESS_H

chess.cpp

#include "chess.h"
#include "ui_chess.h"

Chess::Chess(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Chess)
{
    QSize button_size(100, 100);
    ui->setupUi(this);

    QGridLayout *layout = new QGridLayout;
    QSignalMapper *signalMapper = new QSignalMapper(this);
    connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(On_Clicked(int)));

    for (int i = 0; i < 64; i++) {
        QString t = QString::number(i);
        buttons[i] = new QPushButton(t, this);
        buttons[i]->setMinimumSize(button_size);
        signalMapper->setMapping(buttons[i], i);
        connect(buttons[i], SIGNAL(clicked()), signalMapper, SLOT(map()));
        layout->addWidget(buttons[i], i / 8, i % 8);
    }

    QWidget* central_widget = new QWidget(this);
    central_widget->setLayout(layout);
    setCentralWidget(central_widget);

}

Chess::~Chess()
{
    delete ui;
}

void Chess::On_Clicked(int location) {
    QMessageBox msgbox;
    msgbox.setText(QString::number(location) + " was pushed");
    msgbox.exec();

}

这会创建以下输出:

enter image description here

我希望点击任何按钮的行为会弹出一个QMessageBox,说按钮被按下,如On_Clicked函数中所定义的那样。显然我误解了一些东西,但我无法弄清楚。 QSignalMapper是否针对此类行为而设计?我认为这是在阅读this example.

之后

谢谢!

1 个答案:

答案 0 :(得分:3)

On_Clicked是一个信号,因此您需要连接一个插槽。或者只需将On_clicked更改为slot并将信号映射(int)连接到它(然后使用SLOT关键字)。

请注意,您定义的On_Clicked函数不是您需要的类方法。