2014-10-19 3 views
1

2D 그림 크기를 조정할 때 약간의 도움이 필요합니다. 여러 가지 방법으로 검색하고 시도한 후 4 시간이 지나면 여기에 질문을 게시해야한다고 생각했습니다.Qt Creator/C++ 도면 크기 조정

[프로젝트] : 슬라이더를 사용하여 그림을 그리고 크기를 조정하고 회전하려고합니다. 어떤 이유로 그것은 인물에게 행동하기를 원하지 않습니다. 슬라이더 값이 변경 될 때마다 크기를 1 씩 증가시키고 싶습니다.

QPainter :: scale 또는 rotate를 사용하고 싶지 않습니다.

[코드] :

#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; 
    } 
} 

[헤더] : 양식을 업데이트하고 페인트 이벤트를 트리거합니다 QWidget::update()를 호출

#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

예, 율리우, 그게 내가하려는거야. –

답변

0

.

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

완벽한, 잠시 동안 이걸 가지고 놀 것입니다. 회전 (또한 슬라이더)에 대해 회전 행렬을 사용할 생각입니다. 그것을하는 더 좋은 방법이 있습니까? 아니면 올바른 방향으로 가고 있습니까? –