2014-02-13 53 views
1

有人請指教如何正確實施SLOT執行?QT中的SIGNAL和SLOT參數問題

我的代碼:

prog::prog(QWidget *parent): QMainWindow(parent) //constructor (VisualStudio): 
{ 
    ui.setupUi(this); 
    QCustomPlot * customPlot = new QCustomPlot(this); 

    setupRealtimeDataDemo(customPlot); 

    // + more code 
} 

void prog::setupRealtimeDataDemo(QCustomPlot * customPlot) 
{ 
customPlot->addGraph(); // 
// + more related with graph methods 

// setup a timer that repeatedly calls realtimeDataSlot: 
connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot(QCustomPlot))); 
dataTimer.start(0); // Interval 0 means to refresh as fast as possible 
} 

void prog::realtimeDataSlot(QCustomPlot *customPlot) 
{ 
    // calculate two new data points: 
#if QT_VERSION < QT_VERSION_CHECK(4, 7, 0) 
    double key = 0; 
#else 
    double key = QDateTime::currentDateTime().toMSecsSinceEpoch()/1000.0; 
#endif 
    static double lastPointKey = 0; 
    if (key-lastPointKey > 0.01) // at most add point every 10 ms 
    { 
    double value0 = qSin(key); //sin(key*1.6+cos(key*1.7)*2)*10 + sin(key*1.2+0.56)*20 + 26; 
    double value1 = qCos(key); //sin(key*1.3+cos(key*1.2)*1.2)*7 + sin(key*0.9+0.26)*24 + 26 
     // add data to lines: 
    customPlot->graph(0)->addData(key, value0); 
    customPlot->graph(1)->addData(key, value1); 
// + more code related with graph 
} 
} 

這裏是我的發現:

  1. SIGNAL和SLOT需要相同的簽名,建設程序將無法運行 插槽(這是因爲縫隙變得不確定)。

    可能的解決方案:刪除QCustomPlot參數表單SLOT,但如何將 發送給realtimeDataSlot指向QCustomPlot的指針?也許 有可能超載超時()?也許其他的解決方案

  2. 我發現,當我使用的#include「winsock2.h」,並嘗試以「推動到...」選項 像 出現有關參數的重新定義http://www.qcustomplot.com/index.php/tutorials/settingup錯誤,所以這種解決方法我不能 使用。我也不會不會使用qwt

感謝您的幫助!

回答

1

有許多解決方案。二浮現在腦海中:

  1. 充分利用QCustomPlot*prog類的成員:

    class prog : public QWidget { 
        Q_OBJECT 
        QScopedPointer<QCustomPlot> m_plot; 
        ... 
    } 
    
    prog::prog(QWidget *parent): QMainWindow(parent) : 
        m_plot(new QCustomPlot) 
    { 
        ui.setupUi(this); 
        setupRealtimeDataDemo(m_plot.data()); 
    } 
    
  2. 使用C++ 11個Qt 5特點:

    connect(&dataTimer, &QTimer::timeout, this, [=]{ 
        realtimeDataSlot(customPlot); // doesn't need to be a slot anymore 
    }); 
    
+0

大, 有用!我還有一個額外的問題,在上面的代碼中double value0和double value1顯示在plot上。在程序中我有實時收集double值的函數(值首先是smatch匹配中的字符串(regex),然後我想讓它們成爲double值。收集數據的函數是void prog :: collect_data(u_char * data2 ,int Size)。請問如何將這個函數與已經運行的realtimeDataSlot連接起來? –