Russian Qt Forum
Сентябрь 30, 2024, 06:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPainter::drawText() в paintEvent - выполнятся, но не рисуется  (Прочитано 4862 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Март 12, 2016, 21:31 »

В продолжение темы "Компилируется, но не работает пример из документации по 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."
 

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

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

Код:
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");
}

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

« Последнее редактирование: Март 12, 2016, 22:09 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
VPS
Гость
« Ответ #1 : Март 12, 2016, 22:33 »

Вы уберите ради интереса с виджета "QTableView" и посмотрите результат.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Март 12, 2016, 23:17 »

Вы уберите ради интереса с виджета "QTableView" и посмотрите результат.

Тваюждивизию.

Я тогда не понимаю, почему при командах отрисовки после QWidget::paintEvent(event); строка не рисуется поверх виджетов?
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Март 12, 2016, 23:28 »

Вы уберите ради интереса с виджета "QTableView" и посмотрите результат.

Поигрался, и у меня создается впечатление, что в Qt нет вообще возможности рисовать поверх виджетов, входящих в текущий виджет. Как не крути, строка отрисовывается ПОД виджетами. Нафига тогда paintEvent нужен - неясно.
Записан

Собираю информацию по крупицам
http://webhamster.ru
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Март 13, 2016, 00:31 »

Честно, было лень ваш код качать и повторять эти шаги, написал аналог, который:
1. Создает виджет с рисованием
2. Помещает этот виджет на форму через компоновщики
3. Помещает этот виджет на QTableView и QTextEdit, указав их в качестве родителей

Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QWidget>
#include <QTextEdit>
#include <QTextStream>
#include <QPushButton>
#include <QPainter>
#include <qDebug>
#include <QApplication>
#include <QTableView>
 
 
class TextBoard: public QWidget {
   QString overdrawMessage;
 
   void paintEvent(QPaintEvent *event) {
       QWidget::paintEvent(event);
 
       QPainter painter(this);
       painter.setBrush(Qt::cyan);
       painter.drawRect(rect());
 
       if (overdrawMessage.length() > 0) {
           painter.setPen( QApplication::palette().color(QPalette::ToolTipText) );
           painter.setFont(QFont("Arial", 14));
           painter.drawText(rect(), Qt::AlignCenter, overdrawMessage);
 
           qDebug() << "Print overdraw message:" << overdrawMessage;
       }
   }
 
public:
   void setOverdrawMessage(const QString iOverdrawMessage) {
       overdrawMessage=iOverdrawMessage;
 
       // Обновляется внешний вид виджета
       update();
   }
};
 
 
class MainWindow : public QWidget
{
   Q_OBJECT
 
public:
   MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   QTextEdit * textEdit;
   QPushButton * buttonDraw;
   QTableView view;
 
   TextBoard textBoard;
   TextBoard textBoard2;
   TextBoard textBoard3;
 
public slots:
   void draw();
};
 
#endif // MAINWINDOW_H
 

Код
C++ (Qt)
#include "mainwindow.h"
 
#include <QVBoxLayout>
#include <QHBoxLayout>
 
MainWindow::MainWindow(QWidget *parent)
   : QWidget(parent)
{
   textEdit = new QTextEdit();
 
   buttonDraw = new QPushButton("Draw");
   connect(buttonDraw, SIGNAL(clicked()), SLOT(draw()));
 
   textBoard.setFixedSize(200, 200);
   textBoard2.setFixedSize(200, 200);
   textBoard3.setFixedSize(200, 200);
 
   textBoard2.setParent(&view);
   textBoard2.move(100, 100);
 
   textBoard3.setParent(textEdit);
   textBoard3.move(100, 100);
 
   QHBoxLayout * buttonsLayout = new QHBoxLayout();
   buttonsLayout->addWidget(buttonDraw);
 
   QVBoxLayout * layout = new QVBoxLayout();
   layout->addLayout(buttonsLayout);
   layout->addWidget(textEdit);
 
   QHBoxLayout * mainLayout = new QHBoxLayout();
   mainLayout->addLayout(layout);
   mainLayout->addWidget(&textBoard);
   mainLayout->addWidget(&view);
 
   setLayout(mainLayout);
}
 
MainWindow::~MainWindow() {
}
 
void MainWindow::draw() {
   textBoard.setOverdrawMessage(textEdit->toPlainText());
   textBoard2.setOverdrawMessage(textEdit->toPlainText());
   textBoard3.setOverdrawMessage(textEdit->toPlainText());
}
 
 
« Последнее редактирование: Март 13, 2016, 04:00 от gil9red » Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 13, 2016, 06:00 »

Я тогда не понимаю, почему при командах отрисовки после QWidget::paintEvent(event); строка не рисуется поверх виджетов?
Так рисуется viewport (баба его), он и перекроет. Надо вешаться на viewportEvent, или фильтром на viewport и там рисовать
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 23.