Is there a way to enable word wrapping of text on some simple widgets like QPushButton?

前端 未结 5 1966
没有蜡笔的小新
没有蜡笔的小新 2020-12-10 05:52

I\'d like to make QPushButton word wrap and expand it\'s height instead of expanding width. How can I do that?

相关标签:
5条回答
  • 2020-12-10 06:21

    For word wrapping in regular QPushButton you can implement proxy style class derived from QProxyStyle.

    /**
    proxy style for text wrapping in pushbutton
    */
    class QtPushButtonStyleProxy : public QProxyStyle
    {
    public:
        /**
        Default constructor.
        */
        QtPushButtonStyleProxy()
            : QProxyStyle()
        {
        }
    
        virtual void drawItemText(QPainter *painter, const QRect &rect,
            int flags, const QPalette &pal, bool enabled,
            const QString &text, QPalette::ColorRole textRole) const
        {
            flags |= Qt::TextWordWrap;    
            QProxyStyle::drawItemText(painter, rect, flags, pal, enabled, text, textRole);
        }
    
    private:
        Q_DISABLE_COPY(QtPushButtonStyleProxy)
    };
    

    And later in your own MyQtPushButton:

    MyQtPushButton::MyQtPushButton()
       : QPushButton()
    {
       setStyle(new QtPushButtonStyleProxy());
    }
    

    See additional information on QProxyStyle class in Qt documentation.

    0 讨论(0)
  • 2020-12-10 06:21

    A straightforward solution is to insert a line break when writing the text inside the QPushButton just like

    This button has \n a long text
    

    If you are digning in QtDesigner, you can simply right-click the button and then "Insert line break"

    0 讨论(0)
  • 2020-12-10 06:24

    You might be doing something wrong. Buttons aren't supposed to hold much text, rather a couple of words describing action to be taken. If you wish to make it multi-line, you'd better consider providing a QLabel with corresponding description.

    Anyways, I don't know any [Qt-supported] way to make this. Same problem exists for, say, QHeaderView captions, where it could be even more applicable. Manually, you could always do this by adding "\n" chars to your caption strings (which you may automate for sure).

    0 讨论(0)
  • 2020-12-10 06:28

    I have solved the problem with wordwrap on a button this way:

    QPushButton *createQPushButtonWithWordWrap(QWidget *parent, const QString &text)
    {
       auto btn = new QPushButton(parent);
       auto label = new QLabel(text,btn);
       label->setWordWrap(true);
    
       auto layout = new QHBoxLayout(btn);
       layout->addWidget(label,0,Qt::AlignCenter);
    
       return btn;
    }
    
    0 讨论(0)
  • 2020-12-10 06:43

    Use a QToolButton instead of a QPushButton. QToolButton can use multiline text and QToolButton's size is easier to control than the size of a QPushButton.

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