Я должен создать QPushButton
который содержит значок и 2 строки текста.
В идеале я должен иметь возможность разместить значок либо слева (на одном дизайне), либо в центре, над текстом (для другого дизайна на другом виде).
2 строки текста мне нужно иметь возможность устанавливать отдельно (и даже с разным размером текста). Не перенос текста.
Я собираюсь подкласс QPushButton
установите сетку и добавьте значок и 2 QLabels. Добавить setText2()
а также text2()
, Кажется простым.
Я видел людей, предлагающих этот «просто подкласс xx control и добавьте свой собственный макет», но никогда с реальным непоколебимым примером.
Мой вопрос:
Что я должен сделать, чтобы воспользоваться всеми встроенными свойствами и событиями QPushButton
? Что я должен сделать, чтобы убедиться, что у меня есть правильные события изменения размера, и что значок и метка, которые я добавляю для первой строки текста, являются QPushButton
фактический значок и текст, чтобы они были применены правильно?
Я искал и не могу найти элементы рисования QPushButton (контейнеры для QIcon и текста) — это помогло бы мне, если бы я хотя бы смог найти их, поэтому я мог бы создать свой собственный макет, используя их.
Прежде чем создавать подклассы, я бы попытался добавить макет к 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
больше не имеют значения в этом классе (и даже опасны). Лучше выставить метки и методы кнопок (и сигналы) через безопасный прокси и только нужные.
Других решений пока нет …