![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Гость_Userg_* |
![]()
Сообщение
#1
|
Гости ![]() |
Подскажите, что происходит.
Есть код: main.cpp
widget.h
widget.cpp
Постоянно "прилетает" paintEvent. |
|
|
Анна |
![]()
Сообщение
#2
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: ![]() ![]() ![]() |
Такое уж это событие. Постоянно "прилетает", например, на тот случай, если тебе захочется, чтобы фон у виджета переливался всеми цветами радуги. Если ты не собираешься что-то перерисовывать, зачем перехватываешь это событие?
|
|
|
marsel |
![]()
Сообщение
#3
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 29.1.2013 Пользователь №: 3693 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Всё очень просто. У тебя в spinBox курсор мигает?
paintEvent вызывается, когда надо перерисовать что то. Вот спинбокс и вызывает paintEvent, чтобы нарисовать или стереть курсор. И по коду, зачем перед void paintEvent(QPaintEvent *) написал virtual? Она же и так виртуальная. Лучше уж тогда использовать override из 11 стандарта или уж ничего не писать. |
|
|
Гость_Гость_* |
![]()
Сообщение
#4
|
Гости ![]() |
Такое уж это событие. Постоянно "прилетает", например, на тот случай, если тебе захочется, чтобы фон у виджета переливался всеми цветами радуги. Если ты не собираешься что-то перерисовывать, зачем перехватываешь это событие? Код приведён исключительно для простоты воспроизведения. Если бы на форме не было бы SpinBoxa, то оно не прилетало бы, пока что-то на форме не изменится, или не произойдёт другое событие ( к примеру перемещение мышки внутри формы и т.п. и т.д.). Вопрос был почему прилетает когда есть SpinBox. На него ответил marsel. Спасибо. |
|
|
Анна |
![]()
Сообщение
#5
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: ![]() ![]() ![]() |
Как раз хотела про курсор дописать...
Вообще, у многих виджетов, события перерисовки валятся без конца, что приводит к вызову огромного числа всевозможных методов у самых разных объектов, связь с которыми не всегда сразу увидишь. Например, по этой причине без конца вызывается метод data() у QStandardItem. |
|
|
ahalaj |
![]()
Сообщение
#6
|
![]() Студент ![]() Группа: Участник Сообщений: 47 Регистрация: 14.6.2014 Пользователь №: 4166 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
И по коду, зачем перед void paintEvent(QPaintEvent *) написал virtual? Она же и так виртуальная. Для лучшей читабельности IMHO. Исходный текст прежде всего читать будет сам автор лет через несколько (и может быть кто-нибудь ещё), а уже после компилятор C++, которому как раз по барабану указано ли "virtual" только в родном заголовочном файле Qt или же продублировано ещё у автора. Лучше уж тогда использовать override из 11 стандарта или уж ничего не писать. Это только для C++ 11, на который пока ещё не все перешли. Иначе явный virtual, облегчает чтение исходников и не вынуждает лазить в заголовки чтобы узнать виртуальная это функция или нет или забивать мозги запоминанием полных сигнатур функций. Это естественно всё моё IMHO, никому не навязываю, просто говорю что так реально удобнее. Написать лишние 7 букв virtual не так сложно и не так затратно по времени по сравнению с поиском/запоминанием всего и вся. |
|
|
marsel |
![]()
Сообщение
#7
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 29.1.2013 Пользователь №: 3693 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Для лучшей читабельности IMHO. Исходный текст прежде всего читать будет сам автор лет через несколько (и может быть кто-нибудь ещё), а уже после компилятор C++, которому как раз по барабану указано ли "virtual" только в родном заголовочном файле Qt или же продублировано ещё у автора. Вообще virtual тут вообще не поможет. Если не рассматривать очевидные случаи( например для paintEvent, timerEvent) про которые и так все знают, ты никогда не узнаешь есть эта виртуальная функция в базовом классе или нет. Например, у меня есть базовый класс и класс наследник, я добавил в класс наследник виртуальный метод virtual void method(). Это же не говорит о том что в базовом классе есть такой виртуальный метод. Поэтому никак нельзя догадаться что virtual продублирован, а не появился только сейчас. Сейчас уже стандарт С++14 приняли. Все основные компиляторы уже поддерживают С++11. Не так трудно в pro файле написать CONFIG += c++11 и пользоваться полезными нововведениями, даже если где то ещё не полная поддержка. Там же столько вкусностей, например новый синтаксис для connect. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 4.4.2025, 2:49 |