2016-03-18 7 views
0

私は四角形を作成し、それをQTimerで移動したいので、QTimerのメソッドがどのように正確に機能するか知りたいと思います。このコードは実行されていますが、私が描いた図は動いていません。 WIDGET_Hqtimerの基本的な作業は何ですか?

#define WIDGET_H 

#include <QWidget> 

namespace Ui { 
class Widget; 
} 

class Widget : public QWidget 
{ 
Q_OBJECT 

public: 
    explicit Widget(QWidget *parent = 0); 
void paintEvent(QPaintEvent *event); 
~Widget(); 
private slots: 
void update(); 
private: 
Ui::Widget *ui; 
}; 

#ifndefの の.h ヘッダファイル は、これはあなたが "私が描いた図が動いていない" と言う.cppファイル

た.cpp

#include "widget.h" 
#include "ui_widget.h" 
#include<QPainter> 
#include<QTimer> 



Widget::Widget(QWidget *parent) : 
QWidget(parent), 
ui(new Ui::Widget) 
{ 
ui->setupUi(this); 
QTimer *timer = new QTimer(this); 
timer->setInterval(1000); 
connect(timer, SIGNAL(timeout()), this, SLOT(update())); 
timer->start(); 

} 

Widget::~Widget() 
{ 
delete ui; 
} 
void Widget::paintEvent(QPaintEvent *event) 
{ 

QPainter painter(this); 

    painter.drawRect(50,80,70,80); 

} 

void Widget::update() 

{ 
update(); 
} 
+0

貼り付けたコードは正しくインデントされていないため、読みにくいものがあります。質問を編集してコードを正しくインデントしてください。 –

答えて

1

です。あなたのコードでは、私は動く人物のコードは表示されません、私は描画されている静的な四角形を参照してください。

さらに、update()関数はそれ自身を呼び出し、無限再帰をもたらします。あなたのコードからupdate()を削除すると、基本クラスの実装QWidget::update()paintEvent()への呼び出しをスケジューリングする正しいことを行います。update()を再実装する必要はありません。

1

まず、スロットメソッドは既に特定の意味と目的を持っていますが、他の目的のためにオーバーライドしないでください。さらに、virtualではありません。は、を上書きすることを意味していません(それを実行すると非常に混乱する可能性があります)。だから自分のメソッドの名前を... updateAnimation()か何かに変更してください。 (ご希望の場合はQRect 1つだけ)

次に、あなたがあなたの四角形の位置のためのプライベートメンバ変数を追加する必要があり、rectXrectYrectWidthrectHeightを言います。

void Widget::paintEvent(QPaintEvent *event) 
{ 
    // default setting is that Qt clears the widget before painting, 
    // so we don't need to worry about erasing previous rectangle, 
    // just paint the new one 
    QPainter painter(this); 
    painter.drawRect(rectX, rectY, rectWidth, rectHeight); 
} 


void Widget::updateAnimation() 
{ 
    // modify rectX, rectY, rectWidth and rectHeight here 
    update(); // make Qt do redrawing 
} 
関連する問題