7

QT でインタラクティブでない項目を含むメニューを作成しようとしています。MyCustomMenuClass で QMenu をサブクラス化します。ユーザーにとってより明確になるように、セクションのタイトルをメニューに追加しようとしています。

たとえば、次のようになります。

My section 1 title
Action 1
Action 2
Action 3
My second section title
Action 4
Action 5

問題は、セクションのタイトルが常にマウスに反応することですが、マウスオーバーに反応しないようにして、見栄えを良くしたいと思います。それを行う方法について何か考えはありますか?

4

4 に答える 4

12

QMenu のドキュメントから:

アクション アイテムには、セパレータ、サブメニューを表示するアクション、ウィジェット、およびアクションを実行するアクションの 4 種類があります。セパレータは addSeparator() で挿入され、サブメニューは addMenu() で挿入され、他のすべてのアイテムはアクション アイテムと見なされます。

これはベルを鳴らします: ウィジェット! メニューにウィジェットを追加できますか? それはあなたが落ち着いていることを意味し、あなたはやりたいことを何でもすることができます。

必要なのはQWidgetActionオブジェクトです。カスタム ウィジェットをアクションとして挿入できます。タイトルはカスタム ウィジェットになります。タイトルのみが必要な場合は、次のようにしてQLabel十分です。

QMenu* myMenu = new QMenu(...);
QLabel* label = new QLabel(tr("<b>Title</b>"), this);
label->setAlignment(Qt::AlignCenter);

QWidgetAction* a = new QWidgetAction(myMenu);
a->setDefaultWidget(label);

--このコードのソース

より洗練されたコード例については、次の関連する質問を参照してください: Is there a way to add a Widget to a QMenu in QtCreator

于 2014-03-25T13:29:04.007 に答える
5

Qt 5.1 以降では、 を使用する必要がありますaddSection(const QString &)。あなたがやろうとしていることのために正確に設計されています。ウィジェットベースのソリューションは、フォントや間隔などの一致に細心の注意を払わないと奇妙に見えます.

Qt 4 のaddAction(const QString &)場合、コードを Qt 4 でコンパイルするつもりなら、フォールバックとして使用する必要があります。これは妥当なトレードオフだと思います。

Qt 5.0 の場合 - まあ、もう使うべきではありません。それと同じくらい簡単です :)

于 2014-03-25T22:01:07.103 に答える
0

このかなり単純な戦略で同じ問題を解決しました。私の場合はこれで十分でした。

QMenu* menu = new QMenu();
act = menu->addAction("My section 1 title:");
act->setEnabled(false);
// add Action 1
// add Action 2
// add Action 3

act = menu->addAction("My second section title:");
act->setEnabled(false);
// add Action 4
// add Action 5

于 2021-01-19T19:45:54.640 に答える