我需要在 QPushButton 上使用 setMenu 洗掉這個默認的向下箭頭指示器。但是如果我以某種方式更改 QPushButton::menu-indicator 樣式,例如這樣:
QPushButton::menu-indicator { image: none; }
QPushButton 的填充立即消失。我該如何解決這個問題?
小例子:
btn = QPushButton("Hello world!")
btn.setStyleSheet(
"QPushButton { padding: 0 50px; text-align: left; }"
"QPushButton::menu-indicator { image: none }"
)
menu = QMenu()
menu.addAction("Help")
menu.addAction("Go away")
btn.setMenu(menu)
如果我洗掉線
"QPushButton::menu-indicator { image: none }"
填充再次出現
以下是圖片以便更好地理解:


uj5u.com熱心網友回復:
這似乎是一個錯誤,因為它在 Qt5 中按預期作業。
在檢查了來源之后,他們改變了按鈕斜面計算中的一些重要方面以及后續方面(包括標簽的幾何形狀)。
我強烈建議您報告該錯誤,因為它似乎非常重要。
同時,有一個部分解決方法:您可以為感興趣的按鈕設定一個特定的 QProxyStyle,并覆寫該drawItemText()函式(這是少數即使在使用 QSS 時仍以代理樣式呼叫的函式之一)。
這是一個可能的解決方案:
class ButtonFix(QProxyStyle):
def __init__(self, button):
super().__init__()
self.button = button
def drawItemText(self, rect, alignment, palette,
enabled, text, role=QPalette.ColorRole.NoRole):
opt = QStyleOptionButton()
self.button.initStyleOption(opt)
opt.features &= ~opt.ButtonFeature.HasMenu
rect = self.button.style().subElementRect(
QStyle.SubElement.SE_PushButtonContents, opt, self.button)
super().drawItemText(qp, rect, alignment, palette,
enabled, text, role)
然后你可以做這樣的事情:
btn = QPushButton("Hello world!")
# ...
btn.setStyle(ButtonFix(self.proxyBtn))
請注意,這顯然有一些重要問題(除了我剛剛在 Linux 和幾種樣式上測驗過它的事實):
- 一旦你在一個小部件上明確設定了樣式,設定應用程式樣式將不起作用;
- 在某些樣式中,填充可能并不完美(我只假設基于
SE_PushButtonContents列舉的邊距,因此可能不一致); - 該錯誤也會影響圖示,但 QStyleSheetStyle 不呼叫基本樣式
drawItemPixmap()(它只是呼叫 QPainter'sdrawPixmap()),因此沒有解決方案;
一旦您知道該錯誤已得到修復,您就可以為受它影響的 Qt 版本提供解決方法,最終檢查QT_VERSION_STR.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/512325.html
下一篇:此模式問題的邏輯問題
