4

の放出をシミュレートすることでQtウィジェットの「コピー」機能をテストしたいのですがQKeySequence::CopyQTest::keyClick受け入れませんQKeySequence(またはQKeySequence::StandardKey):

void QTest::keyClick ( QWidget * widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1 ) [static]
void QTest::keyClick ( QWidget * widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay = -1 ) [static]

Ctrl+としてコピーをハードコードすることができますC

QTest::keyClick(widget, Qt::Key_C, Qt::ControlModifier)

QKeySequence::Copyただし、それはかなり脆弱であり、他の環境でウィジェットをテストすると失敗する可能性があるため、可能であれば使用したいと思います。

プライマリバインディングを見つけるために使用できることは知っていQKeySequence::QKeySequence(StandardKey)ますが、キーと修飾子を抽出する方法がわかりません。あるいは、同じ結果を得る他の方法はありますか?

4

3 に答える 3

3

うまくいきました: aとフラグタイプoperator[]のビット単位の組み合わせを返します(これはどこにも文書化されていないようです)。したがって、キーと修飾子を抽出する方法は、(完全に文書化されていない)でマスクすることです。Qt::KeyQt::KeyboardModifiersQt::KeyboardModifierMask

QKeySequence binding(QKeySequence::Copy);
for (uint i = 0; i < binding.count(); ++i) {
    uint key = binding[i];
    QTest::keyClick(widget, Qt::Key(key & ~Qt::KeyboardModifierMask),
        Qt::KeyboardModifiers(key & Qt::KeyboardModifierMask));
}
于 2013-01-14T09:09:03.553 に答える
1

このQKeySequence::keyBindings()メソッドを使用して、指定されたすべての使用可能なキーシーケンスを取得し、この質問SequenceKeyの回答を使用してキーを抽出できます。

または、関数を使用してすべてQKeySequenceを文字列に変換し、文字列を区切り文字として使用toStringする文字列に分割してから、ヘルパー関数を使用してリストのすべての部分を対応する文字列に変換することもできます。QStringList+Qt::Key

QList<QKeySequence> bindings = QKeySequence::keyBindings(QKeySequence::Copy);
for (int i=0; i<bindings.count(); i++)
{
    QStringList keysList = bindings[i].toString().split("+");
    QVector<int> keys = getKeys(keysList);
}


QVector<int> getKeys(const QStringList& list)
{
    QVector<int> keys;
    for (int i=0; i<list.count(); i++)
    {
        if (list[i] == "Ctrl")
            keys << Qt::Key_Control;
        else if (list[i] == "F11")
            keys << Qt::Key_F11;
        else if (list[i] == "Ins")
            keys << Qt::Key_Insert;
        // add remaining modifiers
        // single letters
        else
            keys << list[i][0].toAscii();
    }
    return keys;
}
于 2013-01-12T11:25:15.000 に答える
0

私は同じ問題を抱えていて、受け入れられた答えはうまくいきましたが、それを行う別の簡単な方法を発見しました(他の誰かが解決策を探している場合に備えて、ここに追加したいだけです)。

Qt 5.10以降を使用している場合は、次の電話番号に電話してください。

QTest::keySequence(widget, QKeySequence::Copy);

https://doc.qt.io/qt-5/qtest.html#keySequence-1

于 2021-06-21T12:08:26.023 に答える