- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
编辑:下面的代码已更新为工作解决方案。
为了向 QT 介绍自己,我尝试用 64 个 QPushButtons 设计一个棋盘。我知道这可能不是最好的方法,但我相信从基础开始是一个很好的学习方法。无论如何,所有 64 个按钮基本上都会做同样的事情。所有按钮的点击信号都将调用同一个函数,将关联的 QPushButton 传递给该函数。我没有在 qtcreator 和 qtdesigner 中单独创建每个 QPushButton,也没有为每个按钮单独创建每个 on_clicked 信号函数,而是尝试应用 QSignalMapper。这是我目前所拥有的:
国际象棋.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
国际象棋.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.
谢谢!
最佳答案
On_Clicked 是一个信号,因此您需要为其连接一个插槽。或者只是将 On_clicked 更改为插槽并将信号映射(int)连接到它(然后使用 SLOT 关键字)。
请注意,您定义的 On_Clicked 函数不是您需要的类方法。
关于c++ - QSignalMapper 用法;分配给一个信号的多个 QPushButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22568446/
我知道 QSignalMapper 在这种情况下工作得很好: QSignalMapper *signalMapper = new QSignalMapper(this); connect(signal
是否可以使用 QSignalMapper 重新发出具有多个参数的信号?我找到了一种解决方法,但我很想知道它是否可能。 示例:采取 void QLineEdit::textEdited ( const
我尝试制作一个简单的示例来帮助理解 QSignalMapping 的概念如何在 PySide 中工作。我想通过循环迭代来动态创建一系列按钮,当用户按下其中一个按钮时,我可以激活一个方法,为按下的按钮返
如何使用 QSignalMapper 映射多个复选框?我将使用的来自复选框的信号是 stateChanged(int flag)。在此过程中,我想保留此 int 标志,它最终将与其他映射变量一起发送到
在我在这里发帖之后:Associate signal and slot to a qcheckbox create dynamically我需要关联: • 当我点击一个 qCheckBox 到我的函数
我遇到了一个问题,我需要保留映射源信号的参数。到目前为止,我只找到了没有任何参数的映射信号的示例。 例如,clicked() 信号: signalMapper = new QSignalMapper(
我在 Qt 4.8 中使用 QSignalMapper。现在我正在发出如下网络请求: // start the request QNetworkRequest request(url); QNetwo
我有一个自定义结构,它的实例与 QAction 实例相关联。我希望在执行操作时使用我的结构的相应实例执行槽。 我设法使用 QSignalMapper 通过对 QObject 进行子类化以封装我的结构实
我正在制作一个能够对我的电路板进行编程的应用程序。我想通过文件对话框选择文件,并通过上传按钮上传带有所选文件的板。我有两个类:MyFileDialog 和 CommandProcess。我将上传按钮单
我正在尝试将 QSignalMapper 与我的按钮一起使用,但我似乎无法让它工作以触发我的插槽。 这是我的 SignalMapper 代码: 在我的标题中: ... private: QSi
我正在使用 C++ Qt 框架制作一个应用程序。我现在遇到的问题类似于提交表格。我需要向系统添加一个客户端。因此,当您单击“添加客户端”按钮时,它需要将来自 QLineEdit 的文本和来自 QDat
我有一个QSignalMapper,在某些时候我需要断开这个QSignalMapper到一个插槽,之后,我再次重新连接。执行此操作的正确方法是什么? 或者有什么方法可以检查 QSignalMapper
我在一个表中有一堆 QComboBoxes。为了知道触发了哪个信号,我重新映射信号以对表格单元格位置进行编码(如 Selecting QComboBox in QTableWidget 中所述) (为
我正在尝试使用 QSignalMapper 在单击时将信号发送器 (QPushButton) 发送到插槽。但它不起作用,我真的不知道为什么。 如果您知道执行此操作的不同方法,很高兴通知我,但我真的很想
我有一个带有所有标准按钮和非标准按钮的 QDialogButtonBox(添加 QPushbutton 以创建非标准按钮)。 我可以为非标准按钮单独实现 SignalMapper。但在这种情况下,
我想创建一个动态菜单,它枚举 QMainWindow 中的所有 QDockWidget 并允许显示/隐藏 QDockWidgets,因此到目前为止我得到了这个代码: class PluginActio
我有一个 QTreeWidget,其中它的每个项目在一列中都有一个 QComboBox。我已将它连接到带有 QSignalMapper 的插槽,并且在触发时成功检索了组合框中的项目和索引。我是这样做的
首先,我很抱歉这个看起来很夸张的问题,但事实并非如此。我正在阅读 Foundation of qt development 一书,在阅读第四章时,作者通过展示这个例子讲述了 MDI 窗口的基础知识:
您好,我尝试将带有参数的插槽绑定(bind)到 QAction 触发的信号我有这段代码,上下文菜单效果很好。但是 OpenPublishWin 从未触发过。 void MyApp::ShowConte
编辑:下面的代码已更新为工作解决方案。 为了向 QT 介绍自己,我尝试用 64 个 QPushButtons 设计一个棋盘。我知道这可能不是最好的方法,但我相信从基础开始是一个很好的学习方法。无论如何
我是一名优秀的程序员,十分优秀!