Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: fear от Октябрь 11, 2008, 15:16



Название: QPushButton content (text, icon) alignment
Отправлено: fear от Октябрь 11, 2008, 15:16
Текст и иконка в QPushButton по дефолту центрирован. Как можно это изменить, например прижать контент вправо или влево?
Ещё интересно каким образом можно добавить допалнительный контент в QPushButton, например ещё одну иконку. ???

Пытался получить указатель на layout, не получилось, возвращается 0
Код:
class MyPushButton: public QPushButton
{
  public:
    MyPushButton(const QIcon &icon, const QString &text, QWidget *parent = 0)
    :QPushButton(icon, text, parent)
    {
      QLayout *l = layout();
      qDebug("%d\n", l);  // 0
    }
};


Название: Re: QPushButton content (text, icon) alignment
Отправлено: IGHOR от Октябрь 13, 2008, 22:33
Код:
QPushButton *myButton = new QPushButton(this);
myButton->setGeometry(10,10,400,100);
QLabel *myIcon = new QLabel(myButton);
myIcon->setAttribute(Qt::WA_TransparentForMouseEvents);
myIcon->setGeometry(0,0,100,100);
myIcon->setPixmap(QPixmap("C:/pix.png"));
QLabel *myText = new QLabel(myButton);
myText->setGeometry(100,0,300,100);
myText->setAttribute(Qt::WA_TransparentForMouseEvents);
myText->setText("SomeText");

Так подойдет ?


Название: Re: QPushButton content (text, icon) alignment
Отправлено: fear от Октябрь 14, 2008, 08:50
Так подойдет ?

неа, это изврат :) единственное правильное решение насколько я понимаю курить QStyle


Название: Re: QPushButton content (text, icon) alignment
Отправлено: Alex03 от Октябрь 15, 2008, 06:09
неа, это изврат :) единственное правильное решение насколько я понимаю курить QStyle

Ну почему же единственное?
Можете сформировать всё что Вам надо в QPixmap, и передать его в конструктор QIcon.
Можете породить свой класс от QAbstractButton.


Название: Re: QPushButton content (text, icon) alignment
Отправлено: fear от Октябрь 16, 2008, 13:12
Ну почему же единственное?
Можете сформировать всё что Вам надо в QPixmap, и передать его в конструктор QIcon.
Можете породить свой класс от QAbstractButton.

В первом варианте не понятно как это может решить вопрос, иконка также будет отцентрирована по центру.
Породить свой класс можно, переопределить метод paintEvent() тоже, это быстрое решение, но не правильное потому что таким образом будет разорвана связь стилей приложения с нашей кнопкой

Решил задачу следующим образом:
В собственном стиле переопределил метод drawControl() для CE_PushButtonLabel. Код позаимствовал из qcommonstyle.cpp, добавив возможность изменения размещения, заменив:
Код:
iconRect = QRect(textRect.x(), textRect.y() + (textRect.height() - labelHeight) / 2, pixmap.width(), pixmap.height());
на
Код:
Qt::Alignment labelAlign = Qt::AlignLeft;
if(labelAlign == Qt::AlignLeft)
  iconRect = QRect(textRect.x(), textRect.y() + (textRect.height() - labelHeight) / 2, pixmap.width(), pixmap.height());
else if(labelAlign == Qt::AlignRight)
  iconRect = QRect(textRect.x() + (textRect.width() - labelWidth), textRect.y() + (textRect.height() - labelHeight) / 2, pixmap.width(), pixmap.height());
else //// Qt::AlignHCenter
  iconRect = QRect(textRect.x() + (textRect.width() - labelWidth) / 2, textRect.y() + (textRect.height() - labelHeight) / 2, pixmap.width(), pixmap.height());