2012-03-10 76 views
2

我在Qt 4.8.0中遇到了一些按鈕信號問題。我正在使用vs 2010與Qt Designer。我使用playButton名稱在Designer中創建了一個按鈕。但在此之後,我嘗試將clicked()信號(in vs)與來自CRenderArea的函數(啓動計時器)連接起來,但它似乎不起作用(函數start()在我將其放入構造函數中時起作用,所以它不是代碼本身的問題)。代碼正在編譯,程序正在執行,但點擊一個按鈕後 - 什麼也沒有發生(它應該移動一行)。clicked()按鈕信號

我會非常感謝一些幫助,只是與Qt開始一段樂趣。

的代碼是在這裏(我希望文件的數量不會嚇到你,這是最簡單的代碼永遠:)):

的main.cpp

#include "ts_simulator.h" 
#include <QtGui/QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    TS_simulator w; 
    w.show(); 
    return a.exec(); 
} 

ts_simulator.cpp:

TS_simulator::TS_simulator(QWidget *parent, Qt::WFlags flags) 
    : QMainWindow(parent, flags) 
{ 
    p_map = new CRenderArea(); 
    ui.setupUi(this); 
    p_map->setParent(ui.renderArea); 

    // this doesn't work, why? 
    connect(ui.playButton, SIGNAL(clicked()), this, SLOT(p_map->start())); 
} 

CRenderArea.h

#pragma once 

#include <QtGui> 

class CRenderArea : public QWidget { 
    Q_OBJECT // I think it's necessary? 

    int x; 
    QBasicTimer* timer; 
public: 
    CRenderArea(); 
public slots: // this is necessary too, right? 
    void start(); 
private: 
    void timerEvent(QTimerEvent*); 
    void paintEvent(QPaintEvent*); 
}; 

和CRenderArea.cpp:

#include "CRenderArea.h" 

CRenderArea::CRenderArea() : x(0) { 
    setBackgroundRole(QPalette::Base); 
    setMinimumSize(591, 561); 
    setAutoFillBackground(true); 
    timer = new QBasicTimer(); 

} 

void CRenderArea::timerEvent(QTimerEvent* e) { 
    ++x; 
    update(); 
} 

void CRenderArea::paintEvent(QPaintEvent* p) { 
    QPainter painter(this); 
    painter.setRenderHint(QPainter::Antialiasing); 
    painter.setPen(Qt::darkGray); 
    painter.drawLine(2+x/10, 8, 60, 300); 
} 

void CRenderArea::start() { 
    timer->start(0, this); 
} 

迎接。

回答

4

的問題是在這裏:

connect(ui.playButton, SIGNAL(clicked()), this, SLOT(p_map->start()));

如果p_map是信號的接收器,它已Q_OBJECT,應該寫成:

connect(ui.playButton, SIGNAL(clicked()), p_map, SLOT(start()));

+1

謝謝你的快速回答。它現在有效。 – tobi 2012-03-10 23:25:01