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

谁都会走 提交于 2019-11-30 14:20:42

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

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.

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).

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.

There is some solution using painting text on SVG graphics. Check it.

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"

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!