LINUX.ORG.RU

Многострочная кнопка в qt5

 ,


0

1

Можно ли в qt5 создать кнопку с текстом в несколько строк и чтобы каждая строка имела свой шрифт/размер и тп? В gtk в кнопки можно вставлять другие виджеты, например vbox с парой меток к которым уже применить разные стили. А в qt как?


по идее если текст кнопки задавать в HTML, то да

Harald ★★★★★
()
button.setText("first line\nsecond line");
rumgot ★★★★★
()
Ответ на: комментарий от ox55ff

В qml можно.

Первый раз слышу. Ок гляну что за qml, хотя я так понял эта какая-то надстройка, хотелось бы весь код писать на крестах и гуй строить тоже.

по идее если текст кнопки задавать в HTML, то да

В четвертом qt еще вроде можно было, в пятом нельзя.

button.setText(«first line\nsecond line»);

Я про задание своего шрифта/размера/прочих аттрибутов для каждой линии

matrasa
() автор топика
Последнее исправление: matrasa (всего исправлений: 1)
Ответ на: комментарий от matrasa

Тогда что-то такое можно:

// https://stackoverflow.com/questions/2990060/qt-qpushbutton-text-formatting

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();
}
rumgot ★★★★★
()
Ответ на: комментарий от matrasa

В кьюте есть виджеты - на с++. А есть qml - на джава скрипт. Раз ты хочешь с++, то qml не подойдёт. Значит наследуйся от QPushButton и рисуй.

ox55ff ★★★★★
()

сделай разные кнопки одна над другой и пусть они одно и тоже выполняют. делов то…

anonymous
()
Ответ на: комментарий от Chord

я вообще то мог запатентовать этот замечательный способ создания многострочных кнопок, но подарил его миру. вот…

anonymous
()

Если текст на кнопке в строку не влазит, то может дело в ДНК? Т.е. может вы хотите чего странного? З.Ы. а гуй уже давно в qml делают, в плюсах только логика.

Pavval ★★★★★
()

QML говно и не нужно

Harald ★★★★★
()

Если только виджеты нужны - я бы так сделал (минимальный пример):

// Button.h

#ifndef BUTTON_H
#define BUTTON_H

#include <QPushButton>
#include <QPainter>
#include <QTextDocument>

class Button : public QPushButton
{
Q_OBJECT

public:
    Button(QWidget *parent = 0): QPushButton(parent)
        { }

    void setHtml(QString html)
        {
            _htmlText = html;
        }

    void paintEvent(QPaintEvent *p)
        {
            QPushButton::paintEvent(p);
            QPainter painter(this);

            QTextDocument document;
            document.setHtml(_htmlText);
            document.drawContents(&painter);
        }

private:
    QString _htmlText;
};

#endif // BUTTON_H

// main.cpp
...
Button btn;
btn.setHtml("<b>Bolder Text</b><br><i>Italic Text</i>");
...
Stack77
()
Последнее исправление: Stack77 (всего исправлений: 1)
Ответ на: комментарий от Stack77

Это на каждый paintEvent будет создаваться документ. Наверное, лучше создание документа перенести в setHtml?

А вообще интересно, у меня с таким кодом из-за одной кнопки начнется тормозилово, или там в недрах многое делается через HTML?

anymouse
()
Ответ на: комментарий от ox55ff

Qt Quick, а не QML. Логику при этом можно и на крестах написать, коли хочется извращений.

unC0Rr ★★★★★
()
Ответ на: комментарий от anymouse

Это на каждый paintEvent будет создаваться документ. Наверное, лучше создание документа перенести в setHtml?

Не нужно, вроде. Уничтожится при выходе из области видимости.

А вообще интересно, у меня с таким кодом из-за одной кнопки начнется тормозилово, или там в недрах многое делается через HTML?

Там не настоящий HTML (в смысле, движок Qt WebEngine не используется), тормозить не будет.

Stack77
()
Последнее исправление: Stack77 (всего исправлений: 1)
Ответ на: комментарий от anymouse

Это на каждый paintEvent будет создаваться документ. Наверное, лучше создание документа перенести в setHtml?

А, в том смысле, что пересоздаваться будет. Честно затрудняюсь сейчас сказать насколько это накладно будет. Если смущает, лучше вынести, но тогда так:

private:
    QTextDocument *document;

И создавать в конструкторе.

Stack77
()

А вот Swing поддерживает RTF в кнопках, так-то.

moonmadness
()
Ответ на: комментарий от salozar

ну а как ты иначе-то хотел?

посмотри как сделана QPushButton - она самая простая.

salozar
()

Ладно, фиг с ним. Что-то сложно для моего скудного ума. Продолжу писать на gtk

matrasa
() автор топика

А всё, в итоге нашел рабочее решение - https://stackoverflow.com/questions/43801417/qpushbutton-how-to-align-icon-and-text

	QPushButton* button = new QPushButton( this );
	button->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
	
	QLabel* label = new QLabel( "<b>Hello</b><br/><i>World!</i>" );
	label->setAttribute( Qt::WA_TransparentForMouseEvents, true );
	label->setAlignment( Qt::AlignCenter | Qt::AlignVCenter );
	button->setLayout( new QGridLayout );
	button->layout()->addWidget( label );
matrasa
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.