Qt - QPushButton text formatting

后端 未结 4 569
余生分开走
余生分开走 2021-01-04 23:26

I have a QPushButton and on that I have a text and and icon. I want to make the text on the button to be bold and red. Looked at other forums, googled and lost my hope. Seem

相关标签:
4条回答
  • 2021-01-04 23:35

    You can subclass a QLabel and completely throw away all of its mouse events (so they reach the parent). Then crate a QPushButton, set a layout on it and in this layout insert a QLabel with formatted text. You get a button that contains QLabel and is clickable. (Any Qt Widget can have layout set, including ones that you never ever expected they can.)

    0 讨论(0)
  • 2021-01-04 23:42

    Note:
    My answer is inspired by the idea from @Петър Петров and the comment from @mjwach.

    You can subclass QPushButton and give it two private fields:

    • self.__lbl: A QLabel() instance to hold the rich text. Its background is made transparent and it doesn't catch mouse events.
    • self.__lyt: A QHBoxLayout() to hold the label. The layout margins are set to zero, such that the label's borders touch the button's borders. In other words: we ensure that the label has the exact same size as the button, and is positioned right on top of it.

    Finally you have to override the setText() method, such that the text ends up in the label instead of the button.

    class RichTextPushButton(QPushButton):
        def __init__(self, parent=None, text=None):
            if parent is not None:
                super().__init__(parent)
            else:
                super().__init__()
            self.__lbl = QLabel(self)
            if text is not None:
                self.__lbl.setText(text)
            self.__lyt = QHBoxLayout()
            self.__lyt.setContentsMargins(0, 0, 0, 0)
            self.__lyt.setSpacing(0)
            self.setLayout(self.__lyt)
            self.__lbl.setAttribute(Qt.WA_TranslucentBackground)
            self.__lbl.setAttribute(Qt.WA_TransparentForMouseEvents)
            self.__lbl.setSizePolicy(
                QSizePolicy.Expanding,
                QSizePolicy.Expanding,
            )
            self.__lbl.setTextFormat(Qt.RichText)
            self.__lyt.addWidget(self.__lbl)
            return
    
        def setText(self, text):
            self.__lbl.setText(text)
            self.updateGeometry()
            return
    
        def sizeHint(self):
            s = QPushButton.sizeHint(self)
            w = self.__lbl.sizeHint()
            s.setWidth(w.width())
            s.setHeight(w.height())
            return s
    
    0 讨论(0)
  • 2021-01-04 23:45

    you make the subclass of "QPushbutton", then override the paint event, there you modify the text to your wish.

    here it is,

    class button : public QPushButton
        {
        Q_OBJECT
    
    public:
        button(QWidget *parent = 0)
            {
    
            }
        ~button()
            {
    
            }
    
        void paintEvent(QPaintEvent *p2)
            {
    
            QPushButton::paintEvent(p2);
    
                QPainter paint(this);
                paint.save();
                QFont sub(QApplication::font());
                sub.setPointSize(sub.pointSize() + 7);
                paint.setFont(sub);
                paint.drawText(QPoint(300,300),"Hi");
                paint.restore();
    
            }
        };
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
    
        button b1;
        b1.showMaximized();
        return a.exec();
    }
    
    0 讨论(0)
  • 2021-01-04 23:59

    You really don't need to subclass to change the formatting of your button, rather use stylesheets e.g.

    QPushButton {
        font-size: 18pt;
        font-weight: bold;
        color: #ff0000;
    }
    

    Applying this to the button that you want to change will make the buttons text 18pt, bold and red. You can apply via widget->setStyleSheet()

    Applying this to a widget in the hierarchy above will style all the buttons underneath, the QT stylesheet mechanism is very flexible and fairly well documented.

    You can set stylesheets in the designer too, this will style the widget that you are editing immediately

    0 讨论(0)
提交回复
热议问题