2013-08-06 36 views
4

我有一個QToolButton。我使用它而不是QPushButton,因爲我需要一個類似標籤的外觀按鈕。 即使在將樣式表的邊框和填充設置爲None-0px後,QPushButton也太粗糙了。如何對齊QToolButton的文本(單獨)

我想這QToolButton包含一個文本(無圖標)對齊的權利。

但是,text-align: right;不起作用。 .setAlignment(Qt.AlignRight)也不起作用。

如何將文本對齊?

謝謝。

回答

3

您可以嘗試子類QStyle並重新實現QStyle :: drawControl()以將文本對齊到右側。檢查文件qt/src/gui/styles/qcommonstyle.cpp,看看它是如何完成的。 (對不起,我用C++而不是Python)

case CE_ToolButtonLabel: 
    if (const QStyleOptionToolButton *toolbutton 
      = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) { 
     QRect rect = toolbutton->rect; 
     int shiftX = 0; 
     int shiftY = 0; 
     if (toolbutton->state & (State_Sunken | State_On)) { 
      shiftX = proxy()->pixelMetric(PM_ButtonShiftHorizontal, toolbutton, widget); 
      shiftY = proxy()->pixelMetric(PM_ButtonShiftVertical, toolbutton, widget); 
     } 
     // Arrow type always overrules and is always shown 
     bool hasArrow = toolbutton->features & QStyleOptionToolButton::Arrow; 
     if (((!hasArrow && toolbutton->icon.isNull()) && !toolbutton->text.isEmpty()) 
      || toolbutton->toolButtonStyle == Qt::ToolButtonTextOnly) { 
      int alignment = Qt::AlignCenter | Qt::TextShowMnemonic; 
+0

這是非常好的,這是一個好主意!從C++轉換到Python應該不成問題。非常感謝你! – Phil

0

對齊按鈕的內容(圖標&文本)來中心的這個例子,但是你可以通過這個例子您的要求(調整到右)。覆蓋QToolButoon :: paintEvent作爲下一個:

void CMyToolButton::paintEvent(QPaintEvent*) 
{ 
    QStylePainter sp(this); 
    QStyleOptionToolButton opt; 
    initStyleOption(&opt); 
    const QString strText = opt.text; 
    const QIcon icn = opt.icon; 
    //draw background 
    opt.text.clear(); 
    opt.icon = QIcon(); 
    sp.drawComplexControl(QStyle::CC_ToolButton, opt); 
    //draw content 
    const int nSizeHintWidth = minimumSizeHint().width(); 
    const int nDiff = qMax(0, (opt.rect.width() - nSizeHintWidth)/2); 
    opt.text = strText; 
    opt.icon = icn; 
    opt.rect.setWidth(nSizeHintWidth);//reduce paint area to minimum 
    opt.rect.translate(nDiff, 0);//offset paint area to center 
    sp.drawComplexControl(QStyle::CC_ToolButton, opt); 
}