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

多数のオブジェクトの 1 つを値にマッピングする 3 つの方法については、この質問を参照してください。の使用はQSignalMapperQt 5 では必要ありませんが、Qt 4 ではオプションです。

以下は、QSignalMapperQt4/5 での使用例です。使用上の注意点は次の3点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"};

QStringList(これは txtButtons[9] である必要があり、カウントも 0 です!しかし、より適切な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 に答える