Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Март 11, 2016, 13:35



Название: Компилируется, но не работает пример из документации по QPainter
Отправлено: xintrea от Март 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

Как побороть?


Название: Re: Компилируется, но не работает пример из документации по QPainter
Отправлено: gil9red от Март 11, 2016, 13:46
QApplication создан?


Название: Re: Компилируется, но не работает пример из документации по QPainter
Отправлено: xintrea от Март 11, 2016, 13:46
QApplication создан?

Конечно


Название: Re: Компилируется, но не работает пример из документации по QPainter
Отправлено: gil9red от Март 11, 2016, 13:53
Ищите проблему в своем коде, пример работает:


Название: Re: Компилируется, но не работает пример из документации по QPainter
Отправлено: xintrea от Март 11, 2016, 13:55
Ищите проблему в своем коде, пример работает:

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

Вот мой код:

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

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

Виджет можно увидеть нажав Tools - Action Log.


Название: Re: Компилируется, но не работает пример из документации по QPainter
Отправлено: Igors от Март 11, 2016, 14:09
Вероятно painter создается в неподходящем месте. Остановитесь на точке где начинает вякать и покажите стек вызов. Еще лучше копилябельный проект (в zip)


Название: Re: Компилируется, но не работает пример из документации по QPainter
Отправлено: kambala от Март 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)


Название: Re: Компилируется, но не работает пример из документации по QPainter
Отправлено: xintrea от Март 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 надо вначале устранить эти замечания?


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

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


Название: Re: Компилируется, но не работает пример из документации по QPainter
Отправлено: xintrea от Март 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 - выполнятся, но не рисуется (http://www.prog.org.ru/topic_29924_0.html).



Название: Re: Компилируется, но не работает пример из документации по QPainter
Отправлено: kambala от Март 12, 2016, 23:03
Повторяю, у меня нет ни одного предупреждения.
и? нигде не написано, что нельзя собирать другими компиляторами. включи -Wpedantic и наверняка те же предупреждения посыпятся.
Предыдущий релиз был под Mac Os X Snow Leopard 10.6.6 (x86-64) пять лет назад
она (скчанный релиз) не падает. в любом случае, краши надо изучать и фиксить. в современном мире мак ос клэнг является стандартным компилятором — глупо его не поддерживать на мой взгляд.


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

Код:
QPainter painter( viewport() );
Только это должно быть там где рисуется сам viewport (а не таблица).