カスタムスタイルQMenu

カスタムスタイルQMenu

最近の研究では、メニューのカスタム外観を達成するために必要ですが、オンライン検索で少しQMenuスタイルカスタムの詳細な分析関連があることがわかりました。シニア、会社を掲載し、彼は便利ではないので、彼自身が、一般的にメニューコントロールを実現しQMenuのカスタムスタイルを言及しました。いくつかの探査は、基本的に自分の希望のスタイルを達成した後のように、しかし、これは、あまりにも面倒だろう。

QMenuは、レイアウトのサブコンポーネント

中古QSS(Qtのスタイルシート)複合カスタムコントロールを介して、一般的に制御するQSliderのQtとして知られている他は、サブコントロール(以下、翻訳された子コントロール)の複数を含みます。Qtはできる子コントロールが、コントロールが含まれているが付属してQtのスタイルシートの参照を読んでください。しかし、文書は、子コントロールとの間の相対的な関係を与えるものではありません。

ドキュメントを表示するにはQMenu列によって、我々はQMenuを含める知ることができitem、  indicatorseparatorright-arrowscrollertearoff、相対的に言って、子供に属していることをより多くのコントロールを制御しitem、  indicatorseparatorright-arrow子コントロールのための、より一般的です。子コントロールとの間の相対的な位置関係を決定するために、我々は対によって背景色とボーダーコントロールの異なるビューを設定することができます。結果は、図に示しました。画像によれば、我々はそれを見ることができ、QMenu行の数で、それぞれの行であってもよいウォン注意してください配置されている国境の内側に、我々は起動することができますし、含まれる2つの子コントロール内。上に位置し、中心の左側に位置する中央の右側。画像のテキストであり、かつ、ブロッキングを避けるために、私たちがする必要があるので、重複適切に設定して
QMenuサブコントロール
::item::separator::indicator::right-arrow::item::indicatorright-arrow::item::indicator::item::right-arrow::item::item::indicator::right-arrow::itempadding-leftpadding-right

QMenuのボーダー影

我々は、背景画像を設定することによって達成することができQMenuボーダー影。しかし、セットアッププロセスの間に、私はのQMenuを発見したborder-widthバグの属性。
図は次のような効果QSSで提供されます

1 
2
3
4
5
6
QMenu { 背景色:#F00000。ボーダー幅:10pxの20ピクセル30px 40ピクセル。ボーダースタイル:固体; ボーダーカラー:#00000F。}





間違った境界線の幅

いくつかの調整を比較した後、私は両方の四辺がことが判明しborder-width、境界線の幅は、実際には最後の値です値の種類を設定するには、境界線の幅のセクションには、その後、背景を塗りつぶし、余分なフレームの一部のための境界線の色を表示する設定カラー。これは私をリードしていない境界線の影の良い指標、境界線の影は常にいくつかは、四辺の影の幅がまったく同じではありません、オフセットがあるでしょう。まだ解決策は、ボーダー、シャドウ側のための最も広い幅にカットする計画を提供し、デザイナーと相談しなかったいくつかの試みの後、適当な透明部分で満たされ、他の側は、一時的にこの問題を回避します。

もう一つの問題は、デフォルトQMenu影があるということです、我々は、デフォルトの影を削除する必要があります。私たちは、QMenuに追加することができますQt::NoDropShadowWindowHintWindowFlagの問題を解決します。

問題のQMenuサイズ

QMenuのデフォルトは、動的エントリの内容に基づいて、その表示サイズを調整しますが、私は、テキストQSSのフォントサイズを調整する場合、適切なサイズに調整されていないQMenuは、実際には、不完全なテキスト表示になります。この問題は、その後、突然、別の人を考えたときに、コンテンツがQMenu QSSの大きさに応じて決定することができるかどうか、この問題を議論するために、長い時間のために私を悩またまだ有効ではありません。QSSのでQStyleを通じて、具体的な結果を達成するために実際にある、とQStyleは呼び出すことであるQStyle::polishコントロールスタイルの初期の方法を行うこと。この方法ではドキュメントような記述があります:

This function is called for every widget at some point after it has been fully created but just before it is shown for the very first time.
说明QSS生效是在控件创建完成后,这个时候控件的大小已经确定,所以我们需要在控件创建完成前设置好空间的字体属性,而不能通过QSS来设置。

QMenu的弹出位置

QMenu默认弹出位置是和设置该菜单的控件位置相关的。但有时我们需要控制菜单的弹出位置。例如,我们需要在点击一个按钮后弹出菜单。通常情况下,我们可以通过QPushButton::setMenu来设置一个菜单。但这种方式QMenu固定以和按钮左对齐的方式显示,如果我们希望弹出菜单和按钮保持居中就无法实现。因此我们需要换一种方式。QMenu提供了QMenu::exec方法,我们可以传入QPoint来指定菜单弹出位置。这里有两处需要额外注意的地方。

  1. QMenu其实是一个独立的顶层窗口,因此其位置是相对于整个桌面的,而不是相对于程序主窗口。在Qt的文档中有以下说明:

    Pops up the menu so that the action action will be at the specified global position p. To translate a widget’s local coordinates into global coordinates, use QWidget::mapToGlobal().
    因此我们需要通过坐标转换来得出菜单实际弹出的位置。

  2. 在计算QMenu的弹出位置时我们可能需要使用到QMenu的窗口大小属性,然而文档中提到了

    あなたは、メニューの現在のサイズに依存することはできません念頭に置いてのexec()またはポップアップ()、熊でメニューを配置する場合()。パフォーマンス上の理由から、メニューは必要な場合のみ、そのサイズを適応させます。だから、多くの場合、ショーの前と後のサイズが異なっています。代わりに、メニューの現在の内容に応じて、適切なサイズを計算のsizehintを()を使用します。
    正确的获取QMenu的窗口大小的姿势是通过所以sizeHint()方法。

概要

相対的に言って、QMenuは、より複雑なコントロールまで可能。この種の制御のために、我々は最初の公式APIドキュメントを読まなければならない、Qtのドキュメントはかなり良いツール、私たちのピットの多くに少しステップすることができ、このツールを有効に利用することです。しかし、今のところ、Qtはバグがまだある実現、問題の原因を確認するための時間では、我々が必要とする実際の開発では、バグを回避する方法を見つけるのが得意であることを、BUGツールにあまりにも多くの時間を費やすことはありません。

重版:

おすすめ

転載: www.cnblogs.com/lehoho/p/11233666.html