LINUX.ORG.RU

QPainter::drawText() в paintEvent - выполнятся, но не рисуется

 


0

1

В продолжение темы "Компилируется, но не работает пример из документации по QPainter".

Теперь у меня есть класс, унаследованный от QWidget. И в нем не работает вывод надписи поверх виджета при QPainter painter(this):

void FindTableWidget::paintEvent(QPaintEvent *event)
{
  QWidget::paintEvent(event);

  if(overdrawMessage.length()>0)
  {
    QPainter painter(this);
    painter.setPen( QApplication::palette().color(QPalette::ToolTipText) );
    painter.setFont(QFont("Arial", 14));
    painter.drawText(rect(), Qt::AlignCenter, overdrawMessage);

    qDebug() << "Print overdraw message:" << overdrawMessage;
  }
}

void FindTableWidget::setOverdrawMessage(const QString iOverdrawMessage)
{
  overdrawMessage=iOverdrawMessage;

  // Обновляется внешний вид виджета
  update();
}


В логе я вижу, что paintEvent() выполняется, я вижу сообщение вида:

Print overdraw message: My message


однако поверх виджета ничего не пишется.

Код: https://github.com/xintrea/mytetra_dev/commits/experimental
Актуальный коммит: 7fb151b3b3122e26cfeafffeb7175d0a0ae16ee6

Действия для появления сообщения, которое не появляется:

- Создать две ветки.
- Нажать Tools - Find in base
- В строке поиска написать белиберду
- Установить переключатель «Entire base» на «Current branch»
- Нажать кнопку поиска

В логе будет сообщение:

21:18:49 [DBG] Print overdraw message: "Search produced within one branch. Try to search the entire database."


А на экране ничего не изменится.

★★★★★

Ответ на: комментарий от annulen

QWidget::paintEvent(event) вызывай в самом конце, а лучше совсем не вызывай

Пробовал и в конец и вообще убрать - нет надписи.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от annulen

Даже в прямой реализации (без условий) ничего не выводится:

void FindTableWidget::paintEvent(QPaintEvent *event)
{
  QWidget::paintEvent(event);

  QPainter painter(this);
  painter.setPen( QApplication::palette().color(QPalette::ToolTipText) );
  painter.setFont(QFont("Arial", 14));
  painter.drawText(rect(), Qt::AlignCenter, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
}


Предупреждений никаких нет, просто ничего не выводится.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от EXL

Оно вернёт rect виджета вроде.

Именно так.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от annulen

В порядке бреда: цвет текста совпал с цветом фона

Пробовал и так:

  painter.setPen( Qt::blue );


Нет текста.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от EXL

Я проверил на всякий случай, rect() не нулевого размера:

23:17:57 [DBG] Rectangle:  QRect(0,0 1366x167)

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от matrixd

Походу, нащупал. Если с виджета убрать экземпляр findTableView (класса QTableView), то надпись видна.

Убрать можно, закомментировав в методе assembly() строку:

// central_layout->addWidget(findTableView);


Но не могу понять, как нарисовать строку поверх этого виджета.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Stahl

Painter.end() добавь после отрисовки.

И Painter.begin() вначале. Пробовал, бесполезно.

Нашел вот такую статью:

http://www.wiki.crossplatform.ru/index.php/Рисование_поверх_дочерних_виджетов

В ней в частности говорится:

- Функционал Qt, представленный пользователям библиотеки, позволяет виджетам рисовать себя и только себя.
- Нет возможности выбора рисовать перед тем как виджет себя нарисует или после этого
- Qt очищает область виджета перед посылкой QPaintEvent'a независимо от того собираетесь ли вы рисовать что-то или нет
- Невозможно изменить порядок рисования виджетов. Он всегда один и тот же - от родителя до последнего ребенка.

В общем, я именно это и наблюдаю.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Qt очищает область виджета перед посылкой QPaintEvent'a независимо от того собираетесь ли вы рисовать что-то или нет

QWidget::setAutoFillBackground(false);
m0rph ★★★★★
()

По теме: можно создать полностью прозрачное окно без рамки и рисовать на нем. Единственная проблема - его положение и размер требуется синхронизировать с положением и размером основного окна:

setAttribute(Qt::WA_TranslucentBackground);
setAttribute(Qt::WA_TransparentForMouseEvents);
setWindowFlags(Qt::FramelessWindowHint);

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Я обошел проблему другим путем.

У меня сообщение выводится только тогда, когда QTableView пустой (нет ни одной строки). Соответственно, я тупо скрываю экземпляр QTableView через hide(), и надпись становится видна.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Выводи надпись в QLabel тогда вместо всей этой порнографии.

unC0Rr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.