编辑:以下代码已更新为工作解决方案。
作为尝试向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();
}
这会创建以下输出:
我希望点击任何按钮的行为会弹出一个QMessageBox,说按钮被按下,如On_Clicked函数中所定义的那样。显然我误解了一些东西,但我无法弄清楚。 QSignalMapper是否针对此类行为而设计?我认为这是在阅读this example.
之后谢谢!
答案 0 :(得分:3)
On_Clicked是一个信号,因此您需要连接一个插槽。或者只需将On_clicked更改为slot并将信号映射(int)连接到它(然后使用SLOT关键字)。
请注意,您定义的On_Clicked函数不是您需要的类方法。