Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Laix
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 64
1

Перерисовка paintEvent после изменения размера окна

16.12.2013, 02:13. Просмотров 1417. Ответов 1
Метки нет (Все метки)

Всем привет.
В paintEvent'e сначала высчитываю данные для графика, рисую его и использую размеры виджета(того в котором рисую, просто область, которая вставлена в другой виджет) через
C++
1
2
int w = graphicField::width();
    int h = graphicField::height();
для построения графика.

Изменяю размер виджета(главного) - все пропадает...
Как использовать resizeEvent и update/repaint так и не понял... а может есть другой способ?

код paintEvent'a:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
void graphicField::paintEvent(QPaintEvent *)
{
    
//сначала идет всякое высчитывание информации.
    SystemVars::logfile<<"->Draw graphic."<<endl;
    struct Data
    {
        myTime totalDur;
        float totalCost;
        int total;
    };
    Data gfData[12];
    for(int i=0; i<12; i++)
    {
        gfData[i].totalCost = 0;
        gfData[i].total = 0;
    }
 
    char filename[50]="";
    strcat( filename, SystemVars::dirName );
    strcat( filename, SystemVars::dataFileName);
    SystemVars::filein.open( filename, ios::in );
    if( !SystemVars::filein )
    {
        SystemVars::logfile<<"Failed to open text file(data).\n";
        return;
    }
 
    DataCall Obj;
    while( SystemVars::filein.peek() != EOF)
    {
        SystemVars::filein>>Obj;
 
        char dateT[11];
        strcpy(dateT,Obj.getDate());
        char yearT[5] = "";
        char mounthT[3] = "";
        for(int i=0; i<4; i++) yearT[i] = dateT[i];
        for(int i=0; i<2; i++) mounthT[i] = dateT[5+i];
        int intyear = atoi(yearT);
        int intmounth = atoi(mounthT);
        int reg = Obj.getNumber()/10000000;
 
        if( 2013 == intyear )
            if( 495 == reg )
                gfData[intmounth-1].totalDur += Obj.getDuration();
    }
 
    for(int i=0; i<12; i++)
        gfData[i].total = gfData[i].totalDur.getHour()*60 + gfData[i].totalDur.getMin();
 
//конец высчитывании
 
    QPainter painter(this);
    int w = graphicField::width();
    int h = graphicField::height();
 
    QPen mainPen(Qt::black);    
    mainPen.setWidth(3);
 
    QPen bgPen(Qt::lightGray);
    bgPen.setWidth(1);
 
    int dX = (w-40)/12;
    int a = 20 + dX;
    for(int i = 0; i<12; i++)
    {
        painter.setPen(bgPen);
        painter.drawLine(QPoint(a,h-20), QPoint(a,20));
        painter.setPen(mainPen);
        painter.drawLine(QPoint(a,h-20), QPoint(a,h-30));
        a += dX;
    }
 
    int dY = (h-40)/20;
    a = h-20;
    for(int i=0; i<20; i++)
    {
        painter.setPen(bgPen);
        painter.drawLine(20,a,w-20,a);
        painter.setPen(mainPen);
        painter.drawLine(QPoint(20,a), QPoint(30,a));
        a-=dY;
    }
    mainPen.setWidth(4);
    painter.setPen(mainPen);
    painter.drawLine(QPoint(20,20),QPoint(20, h-20)); // ось У
    painter.drawLine(QPoint(20, h-20), QPoint(w-20,h-20));// ось Х
 
 
 
    a = 20+dX;
    mainPen.setColor(Qt::red);
    painter.setPen(mainPen);
    for(int i=0; i<11; i++)
    {
        painter.drawLine(a, h-20-dY-gfData[i].total, a+dX, h-20-dY-gfData[i+1].total );
        a+=dX;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2013, 02:13
Ответы с готовыми решениями:

Перерисовка изображения при нажатии на кнопку. Вызов paintEvent по кнопке
Класс Painter унаследован от Qwidget для рисования. Переопределен paintEvent,...

Сигнал изменения размера окна.
Подскажите как можно отследить изменения размера окна. Не могу найти такого...

Перерисовка графика при изменении размера виджета
Делаю программу, которая должна визуализировать алгоритмы сортировок. Для...

Перерисовка рамки окна
Ребята, помогите по таким вопросам: 1. Как правильно сделать сигнал/слот для...

Qml изменение размера Canvas при изменении размера окна
Может есть какой нибудь способ, чтобы при изменении размера окна (в моем случае...

1
RazrFalcon
1386 / 1243 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
16.12.2013, 03:02 2
C++ (Qt)
1
2
int w = this->width();
int h = this->height();
При ресайзе отрисовка вызывается всегда, при условии что виджет видно.
Запомните что paintEvent вызывается когда виджет видно на экране, иначе ничего не будет.

Ну и в paintEvent считать ничего не нужно, желательно, так как он вызывается очень часто, будут большие проблемы с производительностью.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2013, 03:02

Подгон размера виджетов в зависимости от размера окна
Добрый день. Возникла необходимость изменять размеры виджетов при изменении...

Подстроить размер окна относительно размера другого окна в X11
Есть два риложения, у обоих устанавливается атрибут WA_X11NetWmWindowTypeaDock....

Передать параметр высоты окна в setGeometry для динамического изменения высоты окна
Здравствуйте, появилась необходимость динамически изменять высоту окна. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru