如何使用 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:

需要注意三点
  1. 使用setMapping方法在发送者QObject实例和值(整数、字符串等)之间添加映射。

  2. 将发送器的信号连接到映射器中的 map 插槽。

  3. 将映射器的 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();
}