如何使用 QSignalMapper 将整数映射到数字?
How to use QSignalMapper to map integers to numerals?
我在使用 Qt 中的简单应用程序时遇到问题。该应用程序看起来像一个带有按钮(从 0 到 9 的数字)的简单计算器。
单击按钮后,应用程序应在应用程序的输出中以数字和数字(单词)形式显示相应的数字。
我需要使用 QSignalMapper
。我该如何解决?
到目前为止我的代码:
QLayout* Widget::createButtons()
{
QGridLayout *lt = new QGridLayout(this);
QSignalMapper *signalMapper = new QSignalMapper(this);
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(keyPressed(int)));
QString txtButtons[10] = {"zero", "one", "two",
"three", "four", "five",
"six", "seven", "eight",
"nine"};
for(int i=0; i<10; i++) {
buttons[i] = new QPushButton(txtButtons[i], this);
signalMapper->setMapping(buttons[i], i);
connect(buttons[i], SIGNAL(clicked()), signalMapper, SLOT(map()));
lt->addWidget(buttons[i], i/3, i%3);
}
return lt;
}
void Widget::keyPressed(int buttonID)
{
qDebug() << QString::number(buttonID) + " was clicked";
}
QString::number(buttonID)
仅将文本显示为数字,但不会在单词中打印该数字。总之,对于打印,您可以回收利用 QString txtButtons[]
:
QString txtButtons[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
(应该是 txtButtons[9],0 也算!但是你可以使用 QStringList
更好 http://doc.qt.io/qt-4.8/qstringlist.html)
取号码后显示的字样:
void Widget::keyPressed(int buttonID)
{
qDebug() << QString::number(buttonID) + ", " + **txtButtons[buttonID]** + " was clicked";
}
请参阅 this question 了解将多个对象之一映射到一个值的三种方法。 QSignalMapper
在 Qt 5 中不是必需的,在 Qt 4 中是可选的。
下面是在Qt4/5中使用QSignalMapper
的例子。使用QSignalMapper
:
需要注意三点
使用setMapping
方法在发送者QObject
实例和值(整数、字符串等)之间添加映射。
将发送器的信号连接到映射器中的 map
插槽。
将映射器的 mapped(ValueType)
信号连接到映射的使用者。 ValueType
是您要映射到的类型 - 此处为 QString
.
// https://github.com/KubaO/Whosebugn/tree/master/questions/button-grid-37492290
#include <QtGui>
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
#include <QtWidgets>
#endif
const QString numerals[] = {"zero", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten"};
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QWidget w;
QGridLayout layout{&w};
QLabel label;
QSignalMapper mapper;
QPushButton buttons[10];
for (int i = 0; i < 10; ++i) {
auto n = qMax(7-(3*(i/3))+i%3, 0); // numpad layout
auto & button = buttons[i];
button.setText(QString::number(n));
mapper.setMapping(&button, QString("%1 - %2").arg(n).arg(numerals[n]));
mapper.connect(&button, SIGNAL(clicked(bool)), SLOT(map()));
layout.addWidget(&button, 1+i/3, i%3, 1, n > 0 ? 1 : 3);
}
layout.addWidget(&label, 0, 0, 1, 3);
label.connect(&mapper, SIGNAL(mapped(QString)), SLOT(setText(QString)));
w.show();
return app.exec();
}
我在使用 Qt 中的简单应用程序时遇到问题。该应用程序看起来像一个带有按钮(从 0 到 9 的数字)的简单计算器。
单击按钮后,应用程序应在应用程序的输出中以数字和数字(单词)形式显示相应的数字。
我需要使用 QSignalMapper
。我该如何解决?
到目前为止我的代码:
QLayout* Widget::createButtons()
{
QGridLayout *lt = new QGridLayout(this);
QSignalMapper *signalMapper = new QSignalMapper(this);
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(keyPressed(int)));
QString txtButtons[10] = {"zero", "one", "two",
"three", "four", "five",
"six", "seven", "eight",
"nine"};
for(int i=0; i<10; i++) {
buttons[i] = new QPushButton(txtButtons[i], this);
signalMapper->setMapping(buttons[i], i);
connect(buttons[i], SIGNAL(clicked()), signalMapper, SLOT(map()));
lt->addWidget(buttons[i], i/3, i%3);
}
return lt;
}
void Widget::keyPressed(int buttonID)
{
qDebug() << QString::number(buttonID) + " was clicked";
}
QString::number(buttonID)
仅将文本显示为数字,但不会在单词中打印该数字。总之,对于打印,您可以回收利用 QString txtButtons[]
:
QString txtButtons[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
(应该是 txtButtons[9],0 也算!但是你可以使用 QStringList
更好 http://doc.qt.io/qt-4.8/qstringlist.html)
取号码后显示的字样:
void Widget::keyPressed(int buttonID)
{
qDebug() << QString::number(buttonID) + ", " + **txtButtons[buttonID]** + " was clicked";
}
请参阅 this question 了解将多个对象之一映射到一个值的三种方法。 QSignalMapper
在 Qt 5 中不是必需的,在 Qt 4 中是可选的。
下面是在Qt4/5中使用QSignalMapper
的例子。使用QSignalMapper
:
使用
setMapping
方法在发送者QObject
实例和值(整数、字符串等)之间添加映射。将发送器的信号连接到映射器中的
map
插槽。将映射器的
mapped(ValueType)
信号连接到映射的使用者。ValueType
是您要映射到的类型 - 此处为QString
.
// https://github.com/KubaO/Whosebugn/tree/master/questions/button-grid-37492290
#include <QtGui>
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
#include <QtWidgets>
#endif
const QString numerals[] = {"zero", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten"};
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QWidget w;
QGridLayout layout{&w};
QLabel label;
QSignalMapper mapper;
QPushButton buttons[10];
for (int i = 0; i < 10; ++i) {
auto n = qMax(7-(3*(i/3))+i%3, 0); // numpad layout
auto & button = buttons[i];
button.setText(QString::number(n));
mapper.setMapping(&button, QString("%1 - %2").arg(n).arg(numerals[n]));
mapper.connect(&button, SIGNAL(clicked(bool)), SLOT(map()));
layout.addWidget(&button, 1+i/3, i%3, 1, n > 0 ? 1 : 3);
}
layout.addWidget(&label, 0, 0, 1, 3);
label.connect(&mapper, SIGNAL(mapped(QString)), SLOT(setText(QString)));
w.show();
return app.exec();
}