2014-10-19 3 views
1

Мне нужна небольшая помощь в изменении размера 2D-фигуры. После 4 часов поиска и тестирования разных методов, я полагаю, что я должен задать вопрос здесь.Qt Creator/C++ Resize Drawing

[Project]: Я пытаюсь рисовать и изменять размер и поворачивать фигуру с помощью ползунков. По какой-то причине он не хочет воздействовать на фигуру. Я хочу увеличить размер на 1 для каждого изменения значения ползунка и обратно.

Я не хочу использовать QPainter :: масштабирование или поворот.

[Код]:

#include "dialog.h" 
#include "ui_dialog.h" 

Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 
{ 

    a = 250; 
    b = 150; 
    c = 200; 
    d = 150; 


    ui->setupUi(this); 

    connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(change(int))); 

} 

Dialog::~Dialog() 
{ 
    delete ui; 
} 

void Dialog::paintEvent(QPaintEvent *e) 
{ 
    QPainter painter(this); 

    painter.fillRect(a,b,c,d, Qt::green); 

} 

void Dialog::change(int value1) 
{ 
    if(value1 > value2) 
    { 
     next = ++value1; 
     a = a; 
     b = b; 
     c = c + next; 
     d = d + next; 
    } 
} 

[Заголовок]:

#ifndef DIALOG_H 
#define DIALOG_H 

#include <QDialog> 
#include <QtGui> 
#include <QtCore> 

namespace Ui { 
class Dialog; 
} 

class Dialog : public QDialog 
{ 
    Q_OBJECT 

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

public slots: 
    void change(int value1); 

private: 
    Ui::Dialog *ui; 
    int value2, next; 

protected: 
    void paintEvent(QPaintEvent *e); 
    int a,b,c,d; 
}; 
+0

, так что вы хотите масштабировать прямоугольник, который вы рисовали в paintEvent? – Iuliu

+0

Попробуйте вызвать обновление или перерисовку в слот, он вызовет paintEvent и обновит rect. – Chernobyl

+0

Да, Iuliu, вот что я пытаюсь сделать. –

ответ

0

Вызов QWidget::update() обновит форму и вызвать событие краски.

Предполагая, что у вас есть horizontalSlider, работающий в диапазоне [-100; 100], вот небольшой пример:

dialog.h:

#ifndef DIALOG_H 
#define DIALOG_H 

#include <QDialog> 

namespace Ui { 
class Dialog; 
} 

class Dialog : public QDialog 
{ 
    Q_OBJECT 

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

protected: 
    void paintEvent(QPaintEvent *e); 

private: 
    Ui::Dialog *ui; 
    int a,b,c,d; 
}; 

#endif // DIALOG_H 

dialog.cpp:

#include "dialog.h" 
#include "ui_dialog.h" 

#include <QPainter> 

Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 
{ 
    ui->setupUi(this); 
    ui->horizontalSlider->setMinimum(-100); 
    ui->horizontalSlider->setMaximum(100); 

    a = 10; 
    b = 10; 
    c = 200; 
    d = 150; 

    connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(update())); 
} 

Dialog::~Dialog() 
{ 
    delete ui; 
} 


void Dialog::paintEvent(QPaintEvent *e) 
{ 
    QPainter painter(this); 

    painter.fillRect(a, 
        b, 
        c + ui->horizontalSlider->value(), 
        d + ui->horizontalSlider->value(), 
        Qt::green); 

} 

Если вы хотите, чтобы масштабировать прямоугольник с центром в точка опоры только используется:

void Dialog::paintEvent(QPaintEvent *e) 
{ 
    QPainter painter(this); 

    painter.fillRect(a - ui->horizontalSlider->value(), 
        b - ui->horizontalSlider->value(), 
        c + ui->horizontalSlider->value() * 2, 
        d + ui->horizontalSlider->value() * 2, Qt::green); 

} 

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

+0

Большое спасибо, это здорово. Я не знал, что вы можете использовать «c + ui-> horizontalSlider-> value()». Есть ли простой способ сделать его изменение размера из центра? Поэтому вместо изменения размера вокруг верхней левой точки поворота, от середины. –

+0

Да, просто посмотри мои правки – Iuliu

+0

Отлично, я собираюсь поиграть с этим некоторое время. Для вращения (также с ползунком) я думаю об использовании матрицы вращения. Есть ли лучшие способы сделать это, или я на правильном пути? –