QMdiArea фоновый текст по центру окна
От: youmych  
Дата: 19.05.16 09:29
Оценка:
Здравствуйте.

Не понимаю как правильно реализовать отрисовку текста на фоне QMdiArea. Вроде как текст по центру окна в telegram'е.

Пробовал переопределять paintEvent() — текст не видно. Переопределял так

class MyMdiArea : public QMdiArea {
  ....
  virtual void paintEvent(QPaintEvent* pe) override {
        QMdiArea::paintEvent(pe);  

        QPainter painter(this);

    int width = size().width() - 3;
    int height = size().height() - 5;

    painter.fillRect(0, 0, width, height, QColor(220, 220, 220));
    painter.drawText(10, 10, "Some Text" );
  }
};



Смотрел исходник телеграма (tdesktop 0.9.49) HistoryWidget::paintEvent() так там аналогично тому, что я делаю. MdiArea вроде тоже наследник QAbstractScrollArea как и HistoryWidter телеги. Не понимаю что я делаю не так.
qt qmdiarea paintevent
Re: QMdiArea фоновый текст по центру окна
От: youmych  
Дата: 19.05.16 09:51
Оценка: 2 (1)
Здравствуйте, youmych, Вы писали:

Y>Здравствуйте.


Y>Не понимаю как правильно реализовать отрисовку текста на фоне QMdiArea. Вроде как текст по центру окна в telegram'е.


Y>Пробовал переопределять paintEvent() — текст не видно. Переопределял так


Y>
Y>class MyMdiArea : public QMdiArea {
Y>  ....
Y>  virtual void paintEvent(QPaintEvent* pe) override {
Y>        QMdiArea::paintEvent(pe);  

Y>        QPainter painter(this);

Y>    int width = size().width() - 3;
Y>    int height = size().height() - 5;

Y>    painter.fillRect(0, 0, width, height, QColor(220, 220, 220));
Y>    painter.drawText(10, 10, "Some Text" );
Y>  }
Y>};
Y>



Y>Смотрел исходник телеграма (tdesktop 0.9.49) HistoryWidget::paintEvent() так там аналогично тому, что я делаю. MdiArea вроде тоже наследник QAbstractScrollArea как и HistoryWidter телеги. Не понимаю что я делаю не так.



Действительно не так делаю. Ларчик открывался просто. В paintEvent() надо было создавать QPainter не для MdiArea, а для viewport()'а внутри него! В доке об этом, оказывается, тоже сказано:

This event handler can be reimplemented in a subclass to receive paint events (passed in event), for the viewport() widget.

Note: If you open a painter, make sure to open it on the viewport().


Итого:
    - QPainter painter(this);
    + QPainter painter(viewport());
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.