Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
1

Не обновляется координата фигуры

21.03.2016, 21:00. Показов 1037. Ответов 10

Author24 — интернет-сервис помощи студентам
Добрые день.

Есть программа на основе QDialog двигающая фигуру по окружности. Я пытаюсь вызвать функцию движения по нажанию кнопки и функция запускается, но обновления положения фигуры не происходит. Раньше не работал с виджетами - пользовался QML и скорее всего где-то допустил глупую логическую ошибку.
Вот мой код:
Dialog.h
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
#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
#include "piewidget.h"
 
namespace Ui {
class Dialog;
}
 
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
 
private slots:
    void on_pushButton_clicked();
 
private:
    Ui::Dialog *ui;
    PieWidget *newPie;
};
 
#endif // DIALOG_H

piewidget.h
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
#ifndef PIEWIDGET_H
#define PIEWIDGET_H
 
#include <QWidget>
 
class PieWidget : public QWidget
{
    Q_OBJECT
public:
    explicit PieWidget(QWidget *parent = 0);
    ~PieWidget();
 
protected:
    void paintEvent(QPaintEvent *);
 
signals:
 
public slots:
    void updateImage();
 
private:
    double angle;
    int R;
    int figureSize;
    int x0;
    int y0;
};
 
#endif // PIEWIDGET_H


dialog.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "dialog.h"
#include "ui_dialog.h"
 
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    newPie = new PieWidget;
}
 
Dialog::~Dialog()
{
    delete ui;
    delete newPie;
}
 
void Dialog::on_pushButton_clicked()
{
    newPie->updateImage();
}

piewidget.cpp
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
#include "piewidget.h"
#include <QPainter>
#include <QTimer>
#include <cmath>
#include <QDebug>
 
PieWidget::PieWidget(QWidget *parent) : QWidget(parent)
{
    angle = 0;
    x0 = y0 = R = 50;
    figureSize = 40;
}
 
PieWidget::~PieWidget()
{
    qDebug() << "Destructor has been invoked";
}
 
void PieWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(Qt::DotLine);
    painter.drawEllipse(figureSize/2,figureSize/4,2*R,2*R);
 
    QRectF pieSize= QRectF(x0+sin(angle)*R, y0+cos(angle)*R, figureSize, figureSize);
    painter.setBrush(Qt::gray);
    painter.setPen(Qt::SolidLine);
    painter.drawPie(pieSize, 0, 180*16);
}
 
void PieWidget::updateImage(){
    if(angle<3.14){
        angle+=3.14/180;
        qDebug() << angle;
        update();
        QTimer::singleShot(50,this,SLOT(updateImage()));
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2016, 21:00
Ответы с готовыми решениями:

Описать структуру Трехмерный вектор с полями Координата х, Координата у, Координата z
Описать структуру Трехмерный вектор с полями Координата х, Координата у, Координата z. Создать...

Координата центра тяжести фигуры
Есть две функции: x^2+y^2=4 и x+y=2 Я так понимаю нужно сначала вычислить площади фигуры с помощью...

Класс «Точка». В классе определить поля «координата X», «координата Y», автовычисляемое поле, хранящее расстояние от точки до начала координат,
Класс «Точка». В классе определить поля «координата X», «координата Y», автовычисляемое поле,...

Связь: координата пикселя и координата вершины
Не могу никак разобраться с одной вещью: как координату вершины (OpenGL) получить в координате...

10
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
22.03.2016, 08:44 2
Попробуй использовать не update(), а repaint().
0
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
22.03.2016, 11:29  [ТС] 3
Wyn, не помогло. Когда вызываю функцию updateImage() в конструкторе - всё работает. А прицепить на кнопку не получается никак.
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
22.03.2016, 11:34 4
Цитата Сообщение от inviter42 Посмотреть сообщение
Wyn, не помогло. Когда вызываю функцию updateImage() в конструкторе - всё работает. А прицепить на кнопку не получается никак.
Так у вас функция не вызывается или же обновление не происходит? Если вы qDebug добавите в функцию updateImage и щёлкните на кнопку - он выведется?
0
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
22.03.2016, 11:36  [ТС] 5
Wyn,
Цитата Сообщение от inviter42 Посмотреть сообщение
Я пытаюсь вызвать функцию движения по нажанию кнопки и функция запускается, но обновления положения фигуры не происходит
qDebug выводит обновление угла. Там в коде есть же в функции updateImage().
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
22.03.2016, 11:49 6
Лучший ответ Сообщение было отмечено inviter42 как решение

Решение

Цитата Сообщение от inviter42 Посмотреть сообщение
qDebug выводит обновление угла. Там в коде есть же в функции updateImage().
Потестил у себя - работает. Единственное замечание - ты newPie нормально где-нибудь размещай.
C++ (Qt)
1
2
newPie = new PieWidget;
ui->layout()->addWidget(newPie);
1
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
22.03.2016, 11:52  [ТС] 7
Цитата Сообщение от Wyn Посмотреть сообщение
Потестил у себя - работает. Единственное замечание - ты newPie нормально где-нибудь размещай.
Странно. Ладно, попробую пересобрать всё на новом проекте. Замечание учту.
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
22.03.2016, 11:58 8
Цитата Сообщение от inviter42 Посмотреть сообщение
Странно.
Ничего странного нет. У тебя виджет newPie просто не виден.
Так что либо его размещать нужно на форме, либо его нужно показывать с помощью show().
Учти, что виджет без родителя - это всегда _отдельное окно_. И по умолчанию оно при создании скрыто(hided).

Добавлено через 1 минуту
P.S. Если бы ты написал, что фигура изначально не видна, то можно было бы намного быстрее разобраться. А то я так понял, будто она у тебя изначально рисовалась, а потом отказывала обновляться.
0
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
22.03.2016, 11:59  [ТС] 9
Цитата Сообщение от Wyn Посмотреть сообщение
P.S. Если бы ты написал, что фигура изначально не видна, то можно было бы намного быстрее разобраться. А то я так понял, будто она у тебя изначально рисовалась, а потом отказывала обновляться.
Ну так, вообще говоря, и было. Так что теперь у меня два виджета
Миниатюры
Не обновляется координата фигуры  
0
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
22.03.2016, 12:07  [ТС] 10
Wyn, думаю, надо добавить, что я в дизайнере бросил виджет в форму и преобразовал его в PieWidget.

Добавлено через 21 секунду
Отсюда и два виджета, я думаю.

Добавлено через 1 минуту
Это всё было из-за недопонимания того, как работают виджеты. В частности, вот этого
Цитата Сообщение от Wyn Посмотреть сообщение
Так что либо его размещать нужно на форме, либо его нужно показывать с помощью show().
Учти, что виджет без родителя - это всегда _отдельное окно_. И по умолчанию оно при создании скрыто(hided).
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
22.03.2016, 15:34 11
Цитата Сообщение от inviter42 Посмотреть сообщение
Wyn, думаю, надо добавить, что я в дизайнере бросил виджет в форму и преобразовал его в PieWidget.
С этого надо было начинать.
Цитата Сообщение от inviter42 Посмотреть сообщение
Это всё было из-за недопонимания того, как работают виджеты. В частности, вот этого
Ясно. Дизайнер, если что, сам создаёт виджеты и сам их удаляет. К созданным в нём виджетам можно обратиться с помощью ui->имя_виджета.
0
22.03.2016, 15:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2016, 15:34
Помогаю со студенческими работами здесь

Класс "Точка". В классе определить поля "координата X", "координата Y"
В классе определить поля «координата X», «координата Y», автовычисляемое поле, хранящее расстояние...

Часто на 8-ке не обновляется (или криво обновляется) индекс вида после
Часто на 8-ке не обновляется (или криво обновляется) индекс вида после рефреша дизайна. Такого в...

Каждые 2 секунды формируется ответ с сервера и div обновляется. Как подвесить к нему событие, если он обновляется?
Посоветуйте, как поступить? Есть небольшой div, в котором выводится список файлов на сервере...

W координата
Все было хорошо, пока я не захотел перейти от 3D к 2D Сначала я забыл добавить проекцию. Потом,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru