Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: malin от Декабрь 11, 2011, 23:02



Название: где лежит текст у виджетов?
Отправлено: malin от Декабрь 11, 2011, 23:02
Всем доброго времени суток. Возникла необходимость переопределить QPushButton::setText().
Прошу всех, кто знает, помочь найти, где в классе QPushButton лежит текст? Т.е., что происходит при вызове метода setText()?


Название: Re: где лежит текст у виджетов?
Отправлено: andrew.k от Декабрь 11, 2011, 23:05
А чего исходники не посмотреть?

QAbstractButton (http://www.koders.com/cpp/fid1779E80AD2DA4C93CA22AB575FAA092A9681AE7B.aspx#L597)

Зачем такое извращение?


Название: Re: где лежит текст у виджетов?
Отправлено: malin от Декабрь 11, 2011, 23:49
Благодарю за исходники. А что такое d? Там используется d->text. В классе QPushButton нет поля d((
Мне требуется сделать кнопки с перевернутым текстом.(Не картинкой, а именно текстом). Вот мои попытки. До определенного момента все работает, однако иногда случается не то, что хочется.

Код:
#include <QtGui>

class InverseButton : public QPushButton
{
public:
    InverseButton(QWidget *parent = 0)
    : QPushButton(parent){}
  void paintEvent(QPaintEvent *pe)
  {
    QPushButton::paintEvent(pe);
    QPainter p(this);
    unsigned int len = fontMetrics().width(Text); //длина текста в пикселях
    unsigned int hei = fontMetrics().height(); //высота текста в пикселях
    drawRotatedText(&p, 180, (width()+len) / 2, (height()-hei) / 2, Text);
  }

  void setText(const QString &text){Text = text;}

  QString text(){return Text;}

  void drawRotatedText(QPainter *painter, float degrees, int x, int y, const QString &text)
  {
    painter->save();
    painter->translate(x, y);
    painter->rotate(degrees);
    painter->drawText(0, 0, text);
    painter->restore();
  }

private:
   QString Text;
};


Название: Re: где лежит текст у виджетов?
Отправлено: panAlexey от Декабрь 11, 2011, 23:58
Благодарю за исходники. А что такое d?
Что такое Pimpl по версии Qt, и с чем его едят! (http://habrahabr.ru/blogs/qt_software/76248/)


Название: Re: где лежит текст у виджетов?
Отправлено: thechicho от Декабрь 12, 2011, 00:27
http://sadesign.ru/tools/flip/

Русский алфавит:

ʁ | |o | є | q | ıq | q | m | m | ц | х | ф | ʎ | ʟ | ɔ | d | о | н | w | v | ʞ | и | є | ж | ё | ǝ | 6 | L | ʚ | g | ɐ

Английский алфавит:

z | ʎ | x | ʍ | ʌ | n | ʇ | s | ɹ | d | o | u | l | ʞ | ɾ | ı | ƃ | ɟ | ǝ | ɔ | q | ɐ


Название: Re: где лежит текст у виджетов?
Отправлено: malin от Декабрь 12, 2011, 00:41
Что же так все сурово то... Не хотелось так глубоко влезать в это. Паттерны программирования.. Мда..
to thechicho: Спасибо, но цифры не переворачиваются


Название: Re: где лежит текст у виджетов?
Отправлено: andrew.k от Декабрь 12, 2011, 00:46
А чем тебя твое решение не устраивает?


Название: Re: где лежит текст у виджетов?
Отправлено: popper от Декабрь 12, 2011, 10:49
До определенного момента все работает, однако иногда случается не то, что хочется.

Код:
#include <QtGui>

class InverseButton : public QPushButton
{
  // ...
  void setText(const QString &text){Text = text;}

  QString text(){return Text;}
  // ...
private:
   QString Text;
};


Не знаю, как компилятор (или moc?) будет замещать методы QAbstractButton::text() и QAbstractButton::setText(), и что будет, если, например, доступ к объекту класса InverseButton будет через указатель QPushButton?
Рекомендую дать другие названия методам InverseButton::text() и InverseButton::setText().
Перед вызовом
Код:
drawRotatedText(&p, 180, (width()+len) / 2, (height()-hei) / 2, Text);
на всякий случай можно залить поле кнопки.


Название: Re: где лежит текст у виджетов?
Отправлено: thechicho от Декабрь 12, 2011, 11:01
http://www.cyberforum.ru/assembler/thread136959.html
 ;D


Название: Re: где лежит текст у виджетов?
Отправлено: andrew.k от Декабрь 12, 2011, 11:26
До определенного момента все работает, однако иногда случается не то, что хочется.

Код:
#include <QtGui>

class InverseButton : public QPushButton
{
  // ...
  void setText(const QString &text){Text = text;}

  QString text(){return Text;}
  // ...
private:
   QString Text;
};


Не знаю, как компилятор (или moc?) будет замещать методы QAbstractButton::text() и QAbstractButton::setText(), и что будет, если, например, доступ к объекту класса InverseButton будет через указатель QPushButton?
Рекомендую дать другие названия методам InverseButton::text() и InverseButton::setText().
Нормально все будет. Согласно правилам ООП и с++.
оба метода невиртуальные. Поэтому какой смысл давать другие названия, все равно через указатель на QPushButton с ними работать не получится.
Разницы нет в общем, как называть.
Имхо в данном случае лучше все-таки сохранить название, замещая старую реализацию, чтобы не было путаницы.

А вообще очень странная необходимость возникла.


Название: Re: где лежит текст у виджетов?
Отправлено: lighting от Декабрь 12, 2011, 12:56
А перевернуть саму кнопку не вариант?