في كيو تي، كيفية إظهار اختصارات لوحة المفاتيح في القائمة ولكن تعطيلها؟
-
19-09-2019 - |
سؤال
أنا أضيف حفنة من QAction
S إلى قوائم نافذة رئيسي. يمكن أيضا تشغيل هذه الإجراءات من قبل لوحة المفاتيح، وأريد أن تكون الاختصار مرئية في القائمة، كالعادة، على سبيل المثال
-----------------
|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();
}