salutations, p>
Pour l'une de mes applications, j'essaie de mettre en place un menu "Modifier". Ce menu dispose généralement des entrées standard annuler em>, coupez em>, copier em> et coller em>. P>.
Ce menu n'est pas là par défaut et les utilisateurs semblent s'y attendre surtout sur Mac OS X. P>
est-il un moyen plus facile de la mettre en œuvre, sans le faire dans tous les widget manuellement? Étant donné que la plupart des widgets ont le mécanisme de copie / pâte / d'annulation déjà implémentée via des raccourcis, j'aimerais fournir quelques actions de menu simples qui les appellent également. P>
Les actions doivent appeler tout le widget au point d'abord, puis ils devraient passer les événements vers le haut de la chaîne d'objet, je suppose. P>
J'utilise Qt 4.6 sous Windows, Linux et Mac OS X. P>
Merci! P>
4 Réponses :
Mon impression est que le menu Edition s'applique au widget de document central, pas de charges de petite taille. Je n'ai pas testé, mais si vous avez un formulaire avec QLineDits, le menu Edition (dans la barre de menus) s'applique-t-il vraiment à ce widget. Vous n'apparaissez pas le menu contextuel ou appuyez sur les coupes courtes pour accéder à ces options ... P>
Cela pourrait être vrai pour Windows / Linux comme les gestionnaires de fenêtres. Sur OS X, toutefois, vous avez une barre de menus à large bande en haut de l'écran, pas en haut de chaque fenêtre. Et les utilisateurs de Mac s'attendent à ce que l'action de menu sélectionnée ait un effet sur la fenêtre la plus haute et le widget qui a actuellement la mise au point. (Sélection de la pâte collerait tout ce qui se trouve dans le presse-papiers dans le QLineDit qui a actuellement l'accent, etc.)
Il est assez facile d'accomplir la moitié de la fonctionnalité nécessaire. Il suffit de créer le menu Edition, ainsi que des qactions nécessaires (copier / coller / annuler / etc.) Dans votre classe de la fenêtre principale et les connecter aux machines à sous. Dans les fentes, émulez la touche correcte appuyez sur la touche et les événements de publication (E.G. Ctrl + C pour copier) et envoyez-les au widget actuellement ciblé. Dans le code, quelque chose comme ceci:
MainWindow::MainWindow(...) { ... connect( actionCopy, SIGNAL( triggered()), SLOT( copy())); ... } ... void MainWindow::copy() { QWidget* focused = QApplication::focusWidget(); if( focused != 0 ) { QApplication::postEvent( focused, new QKeyEvent( QEvent::KeyPress, Qt::Key_C, Qt::ControlModifier )); QApplication::postEvent( focused, new QKeyEvent( QEvent::KeyRelease, Qt::Key_C, Qt::ControlModifier )); }
La solution d'User285740 ne m'a pas aidé, car j'utilise un contrôle de navigateur dans mon application (CEF ou WebKit, peu importe). P>
pourquoi? strong> pour navigateurs, Finalement, j'ai trouvé la solution! Créez les mêmes éléments de menu du code ObjectIVec ++. Ils agissent comme ceux créés via Vous pouvez trouver un exemple ici: NSMENUUTILSX :: getStandardeditmenuitem () , faites-le à partir de votre code Objc ++. P>
Mais, ce code ne fonctionne pas si vous l'exécutez avant focuswidget () code> semble toujours être
null code>, puisque
code> Les éléments ne sont pas des widgets. J'ai essayé
posefent () code> à d'autres widgets - n'a pas fonctionné. Ajout d'éléments de menu avec
Qaction :: Textheuristicrole Code> + Séquences standard telles que
QisonSuence :: Copie Code> n'a pas fait le travail, je ne pouvais pas les connecter uniquement à mes machines à sous, pas à emplacements standard). L'échantillon CEFCLIENT charge un fichier XIB, mais ce n'est pas une option pour moi, car qt crée tout à partir de zéro. Em> p>
qmenubar code>, mais (!) Ils peuvent être connectés à des actions automatiques réelles telles que
@Selector (copie :) p> p> p>
qapplication :: Exec () code>. QT a ensuite "réécrire" le menu principal de manière programmatique ...
Comment résoudre ce problème? Eh bien, j'ajouterai peut-être un piratage comme un QTIMER. Strike> Cela ne fait pas que si vous n'essayez pas d'ajouter un autre article via qmenubar. C'est bon maintenant! Menu indépendant QT. P>
La meilleure solution que je puisse trouver pour cela provient de https://www.qtcentre.org/threads/10709-utilisateur-cut () -Copy () -paste () . Dans mon application, cela a fini par ressembler à ceci:
connect(ui->actionCut, &QAction::triggered, []() { QWidget *focusWidget = QApplication::focusWidget(); QLineEdit *lineEdit = dynamic_cast<QLineEdit*>(focusWidget); QTextEdit *textEdit = dynamic_cast<QTextEdit*>(focusWidget); if (lineEdit && lineEdit->isEnabled() && !lineEdit->isReadOnly()) lineEdit->cut(); else if (textEdit && textEdit->isEnabled() && !textEdit->isReadOnly()) textEdit->cut(); });