Создать 2-строчный (не перенос) QPushButton

Я должен создать QPushButton который содержит значок и 2 строки текста.

В идеале я должен иметь возможность разместить значок либо слева (на одном дизайне), либо в центре, над текстом (для другого дизайна на другом виде).

2 строки текста мне нужно иметь возможность устанавливать отдельно (и даже с разным размером текста). Не перенос текста.

Я собираюсь подкласс QPushButtonустановите сетку и добавьте значок и 2 QLabels. Добавить setText2() а также text2(), Кажется простым.

Я видел людей, предлагающих этот «просто подкласс xx control и добавьте свой собственный макет», но никогда с реальным непоколебимым примером.

Мой вопрос:

Что я должен сделать, чтобы воспользоваться всеми встроенными свойствами и событиями QPushButton ? Что я должен сделать, чтобы убедиться, что у меня есть правильные события изменения размера, и что значок и метка, которые я добавляю для первой строки текста, являются QPushButtonфактический значок и текст, чтобы они были применены правильно?

Я искал и не могу найти элементы рисования QPushButton (контейнеры для QIcon и текста) — это помогло бы мне, если бы я хотя бы смог найти их, поэтому я мог бы создать свой собственный макет, используя их.

1

Решение

Прежде чем создавать подклассы, я бы попытался добавить макет к QpushButtonи добавьте нужные виджеты в макет. Чтобы держать вещи вместе, я бы предпочел подкласс QWidget и иметь такой класс:

class CustomButton : public QWidget
{
public:
explicit CustomButton(QWidget * parent);

private:
QPushButton button;
QLabel * icon;
QLabel * line1;
QLabel * line2;
};

Просто добавьте открытые методы, чтобы установить значок и текстовые строки:

public:
void setTextLines(QString & l1, QString & l2)
{
line1->setText(l1);
line2->setText(l2);
}

void setIcon(QPixmap & pixmap)
{
icon->setPixmap(pixmap);
}

и пользовательский сигнал:

signals:
void clicked();

Это возможный конструктор, в котором создаются экземпляры виджетов, а сигнал напрямую связан с сигналом кнопки:

CustomButton::CustomButton(QWidget *parent)
{
button = new QPushButton();
icon = new QLabel(); //use a label to host the icon
line1 = new QLabel();
line2 = new QLabel();

connect(button, SIGNAL(clicked(bool)), this, SIGNAL(clicked()));

QHBoxLayout * hl = new QHBoxLayout();
hl->addWidget(icon);

QVBoxLayout * vl = new QVBoxLayout();
vl->addWidget(line1);
vl->addWidget(line2);

hl->addLayout(vl);
button->setLayout(hl);

QGridLayout * gl = new QGridLayout();
gl->addWidget(button);

setLayout(gl);
}

Код для размещения виджетов можно перемещать специализированными методами.

Почему бы не подкласс QPushButton или же QAbstractButtonКакие кажутся логичным выбор? Наиболее практичная причина: такие методы, как setText а также setIcon больше не имеют значения в этом классе (и даже опасны). Лучше выставить метки и методы кнопок (и сигналы) через безопасный прокси и только нужные.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector