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

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

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

Сообщений: 754



Просмотр профиля WWW
« : Март 11, 2016, 13:35 »

В документации на QPainter Qt 5.4.2 написан следующий пример:

Код:
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));
    painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

Такое переопределение метода paintEvent() должно нарисовать строку "Qt" в центре виджета.

Вместо этого в логе пишется:

Код:
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::setFont: Painter not active

Как побороть?
Записан

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

Сообщений: 1805



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

QApplication создан?
Записан

xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

QApplication создан?

Конечно
Записан

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

Сообщений: 1805



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

Ищите проблему в своем коде, пример работает:
Записан

xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

Ищите проблему в своем коде, пример работает:

Блин, и что же искать?

Вот мой код:

https://github.com/xintrea/mytetra_dev/commit/8ee9002e4e2199f6194f6bcf2d3b13339dfd9a8b

Пробовал и с вызовом paintEvent() базового класса, и без него.

Виджет можно увидеть нажав Tools - Action Log.
« Последнее редактирование: Март 11, 2016, 13:58 от xintrea » Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 11, 2016, 14:09 »

Вероятно painter создается в неподходящем месте. Остановитесь на точке где начинает вякать и покажите стек вызов. Еще лучше копилябельный проект (в zip)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



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

скорее всего нельзя просто взять и перекрыть отрисовку таблицы

и пара замечаний:
- клэнг выплевывает под 2к ворнингов, большинство из которых лечатся включением 11-го стандарта (но после этого перестает собираться почему-то)
- при закрытии приложения происходит краш:
Цитировать
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   org.qt-project.QtCore            0x0000000107a0cc4c QLocalePrivate::updateSystemPrivate() + 76
1   org.qt-project.QtCore            0x0000000107a123b5 QLocale::system() + 37
2   org.qt-project.QtCore            0x00000001079ef6a4 QTime::toString(QString const&) const + 36
3   ch.iagentur.mytetra              0x00000001068f75b5 smartPrintDebugMessage(QString) + 261 (main.cpp:222)
4   ch.iagentur.mytetra              0x00000001068f7961 myMessageOutput(QtMsgType, QMessageLogContext const&, QString const&) + 353 (main.cpp:267)
5   org.qt-project.QtCore            0x000000010799f2b5 qt_message_print(QtMsgType, QMessageLogContext const&, QString const&) + 213
6   org.qt-project.QtCore            0x000000010799f12d qt_message_output(QtMsgType, QMessageLogContext const&, QString const&) + 13
7   org.qt-project.QtCore            0x0000000107a84174 QDebug::~QDebug() + 100
8   ch.iagentur.mytetra              0x0000000106a06263 DataBaseConfig::~DataBaseConfig() + 131 (DataBaseConfig.cpp:37)
9   ch.iagentur.mytetra              0x0000000106a06305 DataBaseConfig::~DataBaseConfig() + 21 (DataBaseConfig.cpp:40)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

скорее всего нельзя просто взять и перекрыть отрисовку таблицы

Можно. На ЛОРе выяснили, что все, что наследуется от QAbstractScrollArea, требует вызова painter-а на viewport(), а не на this, потому что отрисовка на самом деле выполняется на viewport-е. Поэтому для классов, унаследованных от таких классов как QTableView, надо использовать:

Код:
QPainter painter( viewport() );


и пара замечаний:
- клэнг выплевывает под 2к ворнингов, большинство из которых лечатся включением 11-го стандарта (но после этого перестает собираться почему-то)

Ну так покажи эти замечания, и напиши версию CLang. В gcc 4.9.2 замечаний ноль.


- при закрытии приложения происходит краш:
Цитировать
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   org.qt-project.QtCore            0x0000000107a0cc4c QLocalePrivate::updateSystemPrivate() + 76
1   org.qt-project.QtCore            0x0000000107a123b5 QLocale::system() + 37
2   org.qt-project.QtCore            0x00000001079ef6a4 QTime::toString(QString const&) const + 36
3   ch.iagentur.mytetra              0x00000001068f75b5 smartPrintDebugMessage(QString) + 261 (main.cpp:222)
4   ch.iagentur.mytetra              0x00000001068f7961 myMessageOutput(QtMsgType, QMessageLogContext const&, QString const&) + 353 (main.cpp:267)
5   org.qt-project.QtCore            0x000000010799f2b5 qt_message_print(QtMsgType, QMessageLogContext const&, QString const&) + 213
6   org.qt-project.QtCore            0x000000010799f12d qt_message_output(QtMsgType, QMessageLogContext const&, QString const&) + 13
7   org.qt-project.QtCore            0x0000000107a84174 QDebug::~QDebug() + 100
8   ch.iagentur.mytetra              0x0000000106a06263 DataBaseConfig::~DataBaseConfig() + 131 (DataBaseConfig.cpp:37)
9   ch.iagentur.mytetra              0x0000000106a06305 DataBaseConfig::~DataBaseConfig() + 21 (DataBaseConfig.cpp:40)

Наверно, любителям CLang и C++11 надо вначале устранить эти замечания?
Записан

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

Сообщений: 4744



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

наверно, любителям писать как попало надо вначале устранить эти предупреждения: они вида "this is a C++11 feature, but C++11 option is not enabled". все 2 тыщи копировать сюда не буду, но одно из самых распространенных — это инициализация поля класса в объявлении (это было добавлено лишь в 11-м стандарте).

краш в последней мак ос. на ней тестировалось приложение?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

наверно, любителям писать как попало

Повторяю, у меня нет ни одного предупреждения.

краш в последней мак ос. на ней тестировалось приложение?

Предыдущий релиз был под Mac Os X Snow Leopard 10.6.6 (x86-64) пять лет назад:

http://webhamster.ru/site/page/index/main/news/147

http://webhamster.ru/site/page/index/articles/projectcode/105


ЗЫЖ У меня нарисовалась новая проблема: QPainter::drawText() в paintEvent - выполнятся, но не рисуется.

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

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

Сообщений: 4744



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

Повторяю, у меня нет ни одного предупреждения.
и? нигде не написано, что нельзя собирать другими компиляторами. включи -Wpedantic и наверняка те же предупреждения посыпятся.
Предыдущий релиз был под Mac Os X Snow Leopard 10.6.6 (x86-64) пять лет назад
она (скчанный релиз) не падает. в любом случае, краши надо изучать и фиксить. в современном мире мак ос клэнг является стандартным компилятором — глупо его не поддерживать на мой взгляд.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Можно. На ЛОРе выяснили, что все, что наследуется от QAbstractScrollArea, требует вызова painter-а на viewport(), а не на this, потому что отрисовка на самом деле выполняется на viewport-е. Поэтому для классов, унаследованных от таких классов как QTableView, надо использовать:

Код:
QPainter painter( viewport() );
Только это должно быть там где рисуется сам viewport (а не таблица).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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