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

QPainter изменение параметров объекта

23.04.2015, 02:50. Показов 2787. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, очень простой, но для меня не понятный вопрос. У меня есть программа, которая прекрасно работает. Шарик бегает в окне, отталкивая от стенок. Теперь мне надо изменить его размер, цвет и скорость. но никак не могу все связать вместе. Сначала я хотела изменить просто размер. Переменная r. С помощью QSlider и QSpinBox. А палитру думаю, что нужно добавить при помощи QColorDialog. Также я хотела добавить все на один слой layout, но это уже мелочи. Не могли бы , пожалуйста, помочь.
mainwindows. 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
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
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QSlider>
#include <QApplication>
#include<QSpinBox>
#include<QHBoxLayout>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    QWidget *window =new QWidget;
    QHBoxLayout *layout=new QHBoxLayout;
    QSlider *sl=new QSlider;
    QSpinBox *sb=new QSpinBox;
    layout->addWidget(sl);
    layout->addWidget(sb);
    r=30;
    QObject::connect(sb,SIGNAL(valueChanged(int)),sl,SLOT(setValue(int)));
    QObject::connect(sl,SIGNAL(valueChanged(int)),sb,SLOT(setValue(int)));
    window->setLayout(layout);
    sl->setRange(0,50);
    sb->setRange(0,50);
 
    ui->setupUi(this);
    x= width()/5.;
    y= height()/5.;
 
    x1= 0.1;
    y1= 0.1;
 
 
    QTimer *timer = new QTimer(this);
    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(on_timeOut()));
    timer->start(1);
    window->show();
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
 
void MainWindow::paintEvent(QPaintEvent *evenet)
{
  QPainter painter(this);
  drawBall(&painter);
  QMainWindow::paintEvent(evenet);
}
 
 
 
void MainWindow::drawBall(QPainter *ball)
{
  ball->drawEllipse(x-r,y-r, 2*r, 2*r);
}
 
void MainWindow::on_timeOut()
{
  x+= x1;
  y+= y1;
 
  if(x>width()-r  || x<r) x1*= -1;
  if(y>height()-r || y<r) y1*= -1;
 
  update();
}
mainwindows.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
30
31
32
33
34
35
36
#include <QPainter>
#include <QPaintEvent>
 
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
 
    QTimer *timer;
 
    qreal x,y,x1,y1;
    int r;
 
    void drawBall(QPainter* painter);
    void paintEvent(QPaintEvent* event);
 
protected:
 
 
public slots:
void on_timeOut();
 
};
 
#endif // MAINWINDOW_H
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#include "mainwindow.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    
    return a.exec();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2015, 02:50
Ответы с готовыми решениями:

Выбор объекта QPainter
Рисую геометрические фигуры на форме, используя QPainter Что-то вроде: QPainter painter(mw);...

как правильно передать в качестве параметров указатель на тип QPainter ?
QPixmap *pix = new QPixmap(500,500); QPainter *pp = new QPainter(pix);...

Изменение параметров объекта по ID
Добрый день Господа. Хочу сделать так: В модалке открывается перечень параметров у одной...

Динамическое изменение объекта при изменении параметров
Есть линия - тег &lt;hr&gt;, есть параметры, организованные через теги &lt;input&gt; и &lt;select&gt;, при помощи...

9
24 / 24 / 11
Регистрация: 09.04.2015
Сообщений: 80
23.04.2015, 11:09 2
Лучший ответ Сообщение было отмечено Еленааа как решение

Решение

Ну насколько я вижу нужно объявить слот setValue, который будет срабатывать при изменении слайдера и спинбокса и в котором будет изменяться переменная r.
1
1 / 1 / 1
Регистрация: 05.10.2014
Сообщений: 32
23.04.2015, 20:59  [ТС] 3
QObject::connect(sb,SIGNAL(valueChanged(int)),timer,SLOT(start(int))); добавила эту строку. Стал менять скорость. Все отлично. А как написать изменение обычное переменной r?
QObject::connect(sb,SIGNAL(valueChanged(int)),SLOT(setValue(r)));что-то в этом духе?
0
24 / 24 / 11
Регистрация: 09.04.2015
Сообщений: 80
23.04.2015, 21:16 4
Лучший ответ Сообщение было отмечено Еленааа как решение

Решение

Нет, слот - это фактически обычная процедура, которая вызывается при определенном событии, в этой процедуре можно делать что угодно. Объявляется она в секции public slots
C++
1
2
3
public slots:
void on_timeOut();
void setValue(int value);
А реализуется в cpp файле, как обычная процедура

C++
1
2
3
4
void void MainWindow::setValue(int value)
{
 r = value;
}
Нужно иметь ввиду, что список параметров в процедуре-слоте должен соответствовать типам параметров сигнала, к которому он привязывается (int -> int)
1
1 / 1 / 1
Регистрация: 05.10.2014
Сообщений: 32
23.04.2015, 21:46  [ТС] 5
mainwindows.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
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
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QSlider>
#include <QApplication>
#include<QSpinBox>
#include<QHBoxLayout>
#include<QDialog>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    r=30;
    QWidget *window =new QWidget;
    QHBoxLayout *layout=new QHBoxLayout;
    QSlider *sl=new QSlider;
    QSpinBox *sb=new QSpinBox;
    QSlider *sl1=new QSlider;
    QSpinBox *sb1= new QSpinBox;
    layout->addWidget(sl);
    layout->addWidget(sb);
    QObject::connect(sb,SIGNAL(valueChanged(int)),sl,SLOT(setValue(int)));
    QObject::connect(sl,SIGNAL(valueChanged(int)),sb,SLOT(setValue(int)));
    layout->addWidget(sl1);
    layout->addWidget(sb1);
    QObject::connect(sb1,SIGNAL(valueChanged(int)),sl1,SLOT(setValue(int)));
    QObject::connect(sl1,SIGNAL(valueChanged(int)),sb1,SLOT(setValue(int)));
    window->setLayout(layout);
    sl->setRange(0.001,10);
    sb->setRange(0.001,10);
    sl1->setRange(1,10);
    sb1->setRange(1,10);
    window->show();
    ui->setupUi(this);
    x= width()/5.;
    y= height()/5.;
 
    x1= 0.1;
    y1= 0.1;
 
 
    QTimer *timer = new QTimer(this);
 
    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(on_timeOut()));
    QObject::connect(sb,SIGNAL(valueChanged(int)),timer,SLOT(start(int)));
   !!!!! QObject::connect(sb1,SIGNAL(valueChanged(int)),r,SLOT(setValue(int r)));
 
}
void MainWindow::setValue(int value)
{
 r = value;
}
MainWindow::~MainWindow()
{
    delete ui;
}
 
 
void MainWindow::paintEvent(QPaintEvent *evenet)
{
 
  QPainter painter(this);
  drawBall(&painter);
  QMainWindow::paintEvent(evenet);
}
 
 
 
void MainWindow::drawBall(QPainter *ball)
{
    ball->drawEllipse(x-r,y-r, 2*r, 2*r);
}
 
void MainWindow::on_timeOut()
{
  x+= x1;
  y+= y1;
 
  if(x>width()-r  || x<r) x1*= -1;
  if(y>height()-r || y<r) y1*= -1;
 
  update();
}
mainwindows.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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QGraphicsScene>
#include <QTimer>
#include <QPainter>
#include <QPaintEvent>
 
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
 
    QTimer *timer;
 
    qreal x,y,x1,y1;
    int  r;
 
    void drawBall(QPainter* painter);
    void paintEvent(QPaintEvent* event);
 
protected:
 
 
public slots:
void on_timeOut();
void setValue(int value);
 
};
 
#endif // MAINWINDOW_H
извините за надоедливость, но я правильно понимаю при помощи QObject нужно передать изменения в r? И каким образом?
0
24 / 24 / 11
Регистрация: 09.04.2015
Сообщений: 80
23.04.2015, 22:40 6
Лучший ответ Сообщение было отмечено Еленааа как решение

Решение

Нет, так неверно...

C++
1
QObject::connect(sb1,SIGNAL(valueChanged(int)),r,SLOT(setValue(int r)));
Из спинбокса нельзя напрямую вызвать изменение переменной. Можно вызвать процедуру в самом окне, в которой записать значение переменной. В этом случае отправителем будет спинбокс, а получателем - окно.

C++
1
QObject::connect(sb1,SIGNAL(valueChanged(int)),this,SLOT(setValue(int)));
В процедуре слота собственно меняем значение переменной
C++
1
2
3
4
void void MainWindow::setValue(int value)
{
 r = value;
}
2
1 / 1 / 1
Регистрация: 05.10.2014
Сообщений: 32
24.04.2015, 01:12  [ТС] 7
А вот еще вопрос. Я правильно понимаю, что, когда хочу изменить цвет, то создаю
C++ (Qt)
1
2
QColorDialog *cl=new QColorDialog;
    layout->addWidget(cl);
а как правильно связать с помощью connect?
QObject::(cl,SIGNAL(??currentColorChanged(QColor)??),??,??).
0
24 / 24 / 11
Регистрация: 09.04.2015
Сообщений: 80
24.04.2015, 08:43 8
Цвет чего нужно изменить?
0
1 / 1 / 1
Регистрация: 05.10.2014
Сообщений: 32
24.04.2015, 12:59  [ТС] 9
Шарика. Т.е. он бегает в окошке, и чтобы как с размером или скоростью я могла менять цвет
0
24 / 24 / 11
Регистрация: 09.04.2015
Сообщений: 80
24.04.2015, 13:35 10
Для этого необходимо установить "кисть" в PaintEvent например

C++
1
painter.setBrush(QBrush(QColor("red")));
0
24.04.2015, 13:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2015, 13:35
Помогаю со студенческими работами здесь

Меню параметров объекта
Пример программы в меню которой можно спрашивать параметр объекта,выводить его на экран ,а потом...

Проверка параметров объекта в списке
Есть список объектов класса Animal у него есть поле Weight как мне сделать так чтобы из списка...

Оценка параметров объекта по изображению
Здравствуйте, мне нужна программма на языке С++ позволяющая по исходному изображению определить...

Передача параметров объекта в функцию события
Доброго времени суток, уважаемые гуру! Вопрос в следующем. Например у меня есть на форме 3...


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

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