crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Непонятное поведение QSpinBox
Гость_Userg_*
сообщение 16.9.2014, 1:25
Сообщение #1





Гости








    


Подскажите, что происходит.
Есть код:

main.cpp
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}


widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    virtual void paintEvent(QPaintEvent *);

};

#endif // WIDGET_H



widget.cpp
#include "widget.h"

#include <QSpinBox>
#include <QDebug>
#include <QPushButton>

float alpha = 0;

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    resize(400, 300);
    QSpinBox *spinBoxAlpha = new QSpinBox(this);
    spinBoxAlpha->setEnabled(true);
    spinBoxAlpha->setSingleStep(1);
    spinBoxAlpha->setValue(1);
    spinBoxAlpha->setGeometry(40, 40, 50,30);

    QPushButton *buttonExit = new QPushButton(this);
    buttonExit->setText("Exit");
    buttonExit->setGeometry(40, 10, 50,30);
    connect (buttonExit, SIGNAL(clicked()), this,SLOT(close()));
}

Widget::~Widget()
{
}

void Widget::paintEvent(QPaintEvent *)
{
    qDebug() << alpha++;
    return;

}


Постоянно "прилетает" paintEvent.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 16.9.2014, 10:34
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


Такое уж это событие. Постоянно "прилетает", например, на тот случай, если тебе захочется, чтобы фон у виджета переливался всеми цветами радуги. Если ты не собираешься что-то перерисовывать, зачем перехватываешь это событие?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
marsel
  опции профиля:
сообщение 16.9.2014, 10:49
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 29.1.2013
Пользователь №: 3693

Спасибо сказали: 3 раз(а)




Репутация:   0  


Всё очень просто. У тебя в spinBox курсор мигает?
paintEvent вызывается, когда надо перерисовать что то. Вот спинбокс и вызывает paintEvent, чтобы нарисовать или стереть курсор.

И по коду, зачем перед void paintEvent(QPaintEvent *) написал virtual? Она же и так виртуальная.

Лучше уж тогда использовать override из 11 стандарта или уж ничего не писать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 16.9.2014, 12:19
Сообщение #4





Гости








    


Цитата(Анна @ 16.9.2014, 10:34) *
Такое уж это событие. Постоянно "прилетает", например, на тот случай, если тебе захочется, чтобы фон у виджета переливался всеми цветами радуги. Если ты не собираешься что-то перерисовывать, зачем перехватываешь это событие?

Код приведён исключительно для простоты воспроизведения. Если бы на форме не было бы SpinBoxa, то оно не прилетало бы, пока что-то на форме не изменится, или не произойдёт другое событие ( к примеру перемещение мышки внутри формы и т.п. и т.д.). Вопрос был почему прилетает когда есть SpinBox. На него ответил marsel.
Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 16.9.2014, 12:51
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


Как раз хотела про курсор дописать...
Вообще, у многих виджетов, события перерисовки валятся без конца, что приводит к вызову огромного числа всевозможных методов у самых разных объектов, связь с которыми не всегда сразу увидишь. Например, по этой причине без конца вызывается метод data() у QStandardItem.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ahalaj
  опции профиля:
сообщение 16.9.2014, 13:08
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 14.6.2014
Пользователь №: 4166

Спасибо сказали: 13 раз(а)




Репутация:   1  


Цитата(marsel @ 16.9.2014, 11:49) *
И по коду, зачем перед void paintEvent(QPaintEvent *) написал virtual? Она же и так виртуальная.

Для лучшей читабельности IMHO. Исходный текст прежде всего читать будет сам автор лет через несколько (и может быть кто-нибудь ещё), а уже после компилятор C++, которому как раз по барабану указано ли "virtual" только в родном заголовочном файле Qt или же продублировано ещё у автора.

Цитата(marsel @ 16.9.2014, 11:49) *
Лучше уж тогда использовать override из 11 стандарта или уж ничего не писать.

Это только для C++ 11, на который пока ещё не все перешли. Иначе явный virtual, облегчает чтение исходников и не вынуждает лазить в заголовки чтобы узнать виртуальная это функция или нет или забивать мозги запоминанием полных сигнатур функций.

Это естественно всё моё IMHO, никому не навязываю, просто говорю что так реально удобнее. Написать лишние 7 букв virtual не так сложно и не так затратно по времени по сравнению с поиском/запоминанием всего и вся.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
marsel
  опции профиля:
сообщение 17.9.2014, 9:52
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 29.1.2013
Пользователь №: 3693

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(ahalaj @ 16.9.2014, 14:08) *
Для лучшей читабельности IMHO. Исходный текст прежде всего читать будет сам автор лет через несколько (и может быть кто-нибудь ещё), а уже после компилятор C++, которому как раз по барабану указано ли "virtual" только в родном заголовочном файле Qt или же продублировано ещё у автора.


Вообще virtual тут вообще не поможет. Если не рассматривать очевидные случаи( например для paintEvent, timerEvent) про которые и так все знают, ты никогда не узнаешь есть эта виртуальная функция в базовом классе или нет.
Например, у меня есть базовый класс и класс наследник, я добавил в класс наследник виртуальный метод virtual void method(). Это же не говорит о том что в базовом классе есть такой виртуальный метод. Поэтому никак нельзя догадаться что virtual продублирован, а не появился только сейчас.

Сейчас уже стандарт С++14 приняли. Все основные компиляторы уже поддерживают С++11.
Не так трудно в pro файле написать CONFIG += c++11 и пользоваться полезными нововведениями, даже если где то ещё не полная поддержка.
Там же столько вкусностей, например новый синтаксис для connect.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 13:08