2012-06-01 45 views
1

對不起,如果我失去了一些明顯的東西,但我似乎無法找到我的問題的答案。任何幫助,將不勝感激。如何將插槽連接到Qt中的用戶定義變量?

我想使用QSlider來操作我創建的類中的數據。

在主窗口構造我有以下:

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

隨着在同一類中定義的插槽:

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

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

private: 
    AFrame *frame; 
    Ui::MainWindow *ui; 

public slots: 
    void setValue(int val) 
    { 
     frame->setMphValue(val); 
    } 

}; 

我的幀類是一個小部件推動,以允許用於在繪圖圖像我已經設置和定義如下:

class AFrame : public QLabel 
{ 
    Q_OBJECT 

public: 
    AFrame(QWidget *parent); 
    void setMphValue(int val) { m_mph = val; } 

protected: 
    void paintEvent(QPaintEvent *event); 

private: 
    int m_mph; 

}; 

問題是,當我嘗試在AFrame類的paintEvent函數中分配m_mph值時,整數值將丟失。

有什麼明顯的我失蹤了嗎?有沒有更好的方法來解決這個問題?

而且我的paintEvent代碼:

void AFrame::paintEvent(QPaintEvent *event) 
{ 

    QLabel::paintEvent(event); 
    QPainter painter(this); 

    QPen pen("#FF0099"); 
    pen.setWidth(8); 


    painter.setPen(pen); 

    //rpm 
    painter.drawLine(250,275,165,165); 

    //oil 
    painter.drawLine(450,100,400,75); 

    //fuel 
    painter.drawLine(650,95,600,65); 

    //mph 

    QRect rec(0,0,125,3); 

    int velocity = m_mph; 
    int rpmStartVal = -225; 
    float mph = velocity * 1.68; 

    painter.translate(870,275); 
    painter.rotate(rpmStartVal + mph); 

    painter.drawRect(rec); 


} 
+0

你確定的setValue函數被調用?如果連接失敗,Qt通常會通過調試輸出進行投訴。 –

+0

我沒有調試器工作通過它,但我沒有得到我以前見過的「沒有這樣的插槽」的錯誤,我沒有得到任何其他警告,所以我假設它被調用。 – user1430512

+3

「當我嘗試在paintEvent函數中分配m_mph值時」你沒有這樣做,你正在將它分配給'setMphValue(int)'方法。如果在移動滑塊時'AFrame'沒有改變,則需要在'setMphValue(int)'中調用'update()'。 – cmannett85

回答

2

整數值不被丟失。該小部件沒有神奇的洞察力,當mph值更新時它應該重繪。您的setMphValue應該如下所示。這就是它的全部。

void setMphValue(int val) { 
    m_mph = val; 
    update(); 
} 
0

要添加到庫巴的答覆:

您也應該檢查val是否是相同的值以前,爲了避免避免重畫時,它實際上不是必要的 - 和副作用無限循環如果有什麼稍後由update()調用setMphValue()

在全:

void setMphValue(int val) { 
    if (val == m_mph) return; 
    m_mph = val; 
    update(); 
}