Qt - QPushButton文本格式

时间:2010-06-07 13:53:21

标签: c++ qt formatting button

我有一个QPushButton,我有一个文字和图标。我想让按钮上的文字变为粗体和红色。看着其他论坛,谷歌搜索,失去了我的希望。如果按钮有一个图标,那么似乎没有办法做到这一点(当然,如果你没有创建一个新的图标,那就是文字+前图标)。这是唯一的方法吗?任何人都有更好的主意吗?

4 个答案:

答案 0 :(得分:18)

你真的不需要子类来改变按钮的格式,而是使用样式表,例如。

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

将此选项应用于要更改的按钮将使按钮文本为18pt,粗体和红色。您可以通过widget->setStyleSheet()

申请

将此应用于上面层次结构中的窗口小部件将设置下面的所有按钮的样式,QT stylesheet机制非常灵活且记录良好。

您也可以在设计器中设置样式表,这将为您正在编辑的窗口小部件设置样式

答案 1 :(得分:5)

你创建“QPushbutton”的子类,然后覆盖paint事件, 在那里你根据自己的意愿修改文本。

在这里,

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();
}

答案 2 :(得分:2)

您可以对QLabel进行子类化并完全丢弃其所有鼠标事件(以便它们到达父级)。 然后创建一个QPushButton,在其上设置一个布局,并在此布局中插入带有格式化文本的QLabel。您将获得一个包含QLabel的按钮,并且可以单击。 (任何Qt Widget都可以设置布局,包括你从未想到的布局设置。)

答案 3 :(得分:1)

注意:
我的回答受到@ПетърПетров的想法和@mjwach的评论的启发。

您可以继承QPushButton并为其提供两个私有字段:

  • self.__lbl:用于保存RTF文本的QLabel()实例。它的背景是透明的,不会捕获鼠标事件。
  • self.__lyt:用于保存标签的QHBoxLayout()。布局边距设置为零,以使标签的边框触摸按钮的边框。换句话说:我们确保标签的尺寸与按钮的尺寸完全相同,并位于其上方。

最后,您必须重写setText()方法,以使文本最终显示在标签中,而不是按钮中。

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