2014-02-13 2 views
1

Может ли кто-нибудь прокомментировать, как правильно выполнить выполнение SLOT?Проблема с параметрами СИГНАЛА и SLOT в QT

мой код:

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 нужна такая же подпись, встроенная программа не будет работать SLOT (потому что 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

Большой , оно работает! У меня есть еще один вопрос, в приведенном выше коде показано двойное значение 0 и двойное значение1 на графике. В программе у меня есть функция, которая собирает двойные значения в реальном времени (значения сначала являются строками в совпадениях совпадений (regex), тогда я хотел бы сделать их двойными значениями. Функция, которая собирает данные, является void prog :: collect_data (u_char * data2 , int Size). Не могли бы вы помочь, как подключить эту функцию к уже работающему realtimeDataSlot? –

Смежные вопросы