في كيو تي، كيفية إظهار اختصارات لوحة المفاتيح في القائمة ولكن تعطيلها؟

StackOverflow https://stackoverflow.com/questions/1894395

سؤال

أنا أضيف حفنة من QActionS إلى قوائم نافذة رئيسي. يمكن أيضا تشغيل هذه الإجراءات من قبل لوحة المفاتيح، وأريد أن تكون الاختصار مرئية في القائمة، كالعادة، على سبيل المثال

-----------------
|Copy     Ctrl+C|
-----------------

يمكنني أن أفعل هذا باستخدام QAction.setShortcut(). وبعد ومع ذلك، أولا لا تريد هذه QActionليتم تشغيلها من خلال الاختصارات؛ أنا أتطلع إلى جميع مدخلات لوحة المفاتيح بشكل منفصل في مكان آخر.

هل هذا ممكن؟ هل يمكنني تعطيل الاختصار في الجودة ولكن لا يزال لديك نص اختصار (في هذا المثال كنترول + جيم) في قوائمي؟

تعديل: الطريقة التي انتهيت منها القيام بذلك هو الاتصال بالقائمة aboutToShow() و aboutToHide() الأحداث، وتمكين / تعطيل الاختصارات حتى تكون نشطة فقط عند عرض القائمة. لكنني أقدر حل نظيف ...

هل كانت مفيدة؟

المحلول

يمكنك أن ترث من QACE وتجاوز QACTION :: Event (Qevent *):

class TriggerlessShortcutAction : public QAction
{
public:
    ...ctors...

protected:
    virtual bool event(QEvent* e)
    {
        if (e->type() == QEvent::Shortcut)
            return true;
        else
            return QAction::event(e);
    }
};

سيؤدي ذلك إلى أن أي أحداث من النوع QEVENT :: اختصار يتم إرسالها إلى أفعالك حتى لا تؤدي إلى إشارات "الناتجة ()".

نصائح أخرى

action.setText("Copy\tCtrl+C");

سيبدو هذا مثل إجراء مع اختصار، ولكن الاختصار غير مثبت بالفعل.

هنا مثال كامل:

#include <QtGui>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QMainWindow win;

    QMenu *menu = win.menuBar()->addMenu("Test");

    // This action will show Ctrl+T but will not trigger when Ctrl+T is typed.
    QAction *testAction = new QAction("Test\tCtrl+T", &win);
    app.connect(testAction, SIGNAL(triggered(bool)), SLOT(quit()));
    menu->addAction(testAction);

    // This action will show Ctrl+K and will trigger when Ctrl+K is typed.
    QAction *quitAction = new QAction("Quit", &win);
    quitAction->setShortcut(Qt::ControlModifier + Qt::Key_K);
    app.connect(quitAction, SIGNAL(triggered(bool)), SLOT(quit()));
    menu->addAction(quitAction);

    win.show();

    return app.exec();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top