0

我在 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";
}
4

2 回答 2

0

有关将多个对象之一映射到值的三种方法,请参阅此问题。在 Qt 5 中使用QSignalMapper不是必需的,在 Qt 4 中是可选的。

下面是一个QSignalMapper在 Qt4/5 中使用的例子。使用时要记住三点QSignalMapper

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

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

  3. 将映射器的信号连接到映射的mapped(ValueType)消费者。ValueType是您要映射到的类型 - 在这里,它是QString.

示例截图

// https://github.com/KubaO/stackoverflown/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();
}
于 2016-05-31T14:24:21.067 回答
0

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";
}
于 2016-05-27T22:51:17.313 回答