Здравствуйте.
Не понимаю как правильно реализовать отрисовку текста на фоне 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 телеги. Не понимаю что я делаю не так.
Здравствуйте, 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());