Название: Передача переменной в графическое окно из другого класса.
Отправлено: jodam от Декабря 03, 2010, 16:55
Добрый день. Такая вот задачка, сперва опишу проблему, ниже прикреплю код. Есть библиотека работающая с serial port(/dev/ttyS0), и пример к ней, все работает идеально, данные выводит в консоль. Но задача состоит в том что бы данные выводились в окно. Почитал документацию по сигналам и слотам... разбираюсь, но пока что безуспешно. вот код: main.cpp C++ (Qt) #include <iostream> #include <QtCore/QCoreApplication> #include <QThread> #include <QString> #include <QStringList> #include <QDebug> #include <QSerialPort> #include "host.h" void printHelp() { std::cout << "Usage: echo_eventmode [--help] [--port=<serial port>] [--set=<port settings>]" << std::endl; std::cout << std::endl; #if defined(Q_OS_WIN) std::cout << "Example: echo_eventmode --port=COM3 --set=9600,8,N,1" << std::endl; #else std::cout << "Example: echo_eventmode --port=/dev/ttyS0 --set=9600,8,N,1" << std::endl; #endif } bool processArgs(const QStringList &args, QString &serPort, QString &settings) { QHash<QString, QString> argPairs; foreach( QString ar, args ) { if ( ar.split('=').size() == 2 ) { argPairs.insert(ar.split('=').at(0), ar.split('=').at(1)); } else { if ( ar == "--help" ) goto LPrintHelpAndExit; } } settings = argPairs.value("--set", "9600,8,n,1"); #if defined(Q_OS_WIN) serPort = argPairs.value("--port", "COM3"); #else serPort = argPairs.value("--port", "/dev/ttyS0"); #endif return true; LPrintHelpAndExit: printHelp(); return false; } int main(int argc, char *argv[]) { using TNX::QSerialPort; QCoreApplication a(argc, argv); std::cout << "Serial port echo example with event-driven model, Copyright (c) 2010 Inbiza Systems Inc." << std::endl; std::cout << "Created by Inbiza Labs <labs@inbiza.com>" << std::endl; std::cout << std::endl; std::cout << "Main thread id: " << QThread::currentThreadId() << std::endl; QString portName; QString settings; if ( !processArgs(a.arguments(), portName, settings) ) return 0; QSerialPort serport(portName, settings); if ( !serport.open() ) qFatal("Cannot open serial port %s. Exiting..", qPrintable(portName)); Host host(serport); return a.exec(); }
host.cpp C++ (Qt) #include <iostream> #include <QtCore/QCoreApplication> #include <QThread> #include <QSerialPort> #include <QTimerEvent> #include <QDateTime> #include "host.h" Host::Host(TNX::QSerialPort &serPort, QObject *parent) : QObject(parent), serialPort_(serPort), timerId_(0), byteCounter_(0) { using TNX::QSerialPort; timerId_ = startTimer(5000); connect(&serialPort_, SIGNAL(readyRead()), SLOT(onDataReceived())); if ( !serialPort_.setCommTimeouts(QSerialPort::CtScheme_NonBlockingRead) ) qWarning("Cannot set communications timeout values at port %s.", qPrintable(serialPort_.portName())); } Host::~Host() { } void Host::onDataReceived() { if ( timerId_ ) killTimer(timerId_); QByteArray data = serialPort_.read(512); byteCounter_ += data.size(); std::cout << "Thread id: " << QThread::currentThreadId() << " Received data @ " << qPrintable(QDateTime::currentDateTime().toString("hh:mm:ss.zzz")) << ". Echo back." << std::endl; serialPort_.write(data); if ( byteCounter_ >= 4096 ) { std::cout << "Event-Driven example is terminated successfully." << std::endl; qApp->exit(0); } // create a wait timer for the next packet timerId_ = startTimer(5000); // 5sec } void Host::timerEvent(QTimerEvent *event) { Q_ASSERT(timerId_ == event->timerId()); killTimer(event->timerId()); timerId_ = 0; std::cout << "Timeout occurred." << std::endl; }
host.h C++ (Qt) #ifndef HOST_H__ #define HOST_H__ #include <QObject> class QTimerEvent; namespace TNX { class QSerialPort; } class Host : public QObject { Q_OBJECT public: Host(TNX::QSerialPort &serPort, QObject *parent = 0); ~Host(); protected: virtual void timerEvent(QTimerEvent *event); private slots: void onDataReceived(); private: TNX::QSerialPort &serialPort_; int timerId_; int byteCounter_; }; #endif // HOST_H__
открываю проект в qt creator добавляю класс формы qr desinger mainwindow ... есть ui форма... добавляю виджеты... все работает кроме .... того что я не могу графику связать с программой, не могу передать переменную из ф-и void Host::onDataReceived() в ф-ю... работающую с гуи окном в класе mainwindow
Название: Re: Передача переменной в графическое окно из другого класса.
Отправлено: GreatSnake от Декабря 03, 2010, 17:10
Но задача состоит в том что бы данные выводились в окно. Только вот само окно вы и не создали. Для GUI-приложений вместо QCoreApplication нужно использовать QApplication.
Название: Re: Передача переменной в графическое окно из другого класса.
Отправлено: jodam от Декабря 03, 2010, 17:16
Создал, .. просто не показал, сейчас main.cpp выглядит так C++ (Qt) #include <iostream> #include <QtGui/QApplication> #include <QThread> #include <QString> #include <QStringList> #include <QDebug> #include <QSerialPort> #include "host.h" #include "mainwindow.h" void printHelp() { std::cout << "Usage: echo_eventmode [--help] [--port=<serial port>] [--set=<port settings>]" << std::endl; std::cout << std::endl; #if defined(Q_OS_WIN) std::cout << "Example: echo_eventmode --port=COM3 --set=9600,8,N,1" << std::endl; #else std::cout << "Example: echo_eventmode --port=/dev/ttyS0 --set=9600,8,N,1" << std::endl; #endif } bool processArgs(const QStringList &args, QString &serPort, QString &settings) { QHash<QString, QString> argPairs; foreach( QString ar, args ) { if ( ar.split('=').size() == 2 ) { argPairs.insert(ar.split('=').at(0), ar.split('=').at(1)); } else { if ( ar == "--help" ) goto LPrintHelpAndExit; } } settings = argPairs.value("--set", "115200,8,n,1"); #if defined(Q_OS_WIN) serPort = argPairs.value("--port", "COM3"); #else serPort = argPairs.value("--port", "/dev/ttyUSB0"); #endif return true; LPrintHelpAndExit: printHelp(); return false; } int main(int argc, char *argv[]) { using TNX::QSerialPort; QApplication a(argc, argv); MainWindow w; w.show(); std::cout << "Serial port echo example with event-driven model, Copyright (c) 2010 Inbiza Systems Inc." << std::endl; std::cout << "Created by Inbiza Labs <labs@inbiza.com>" << std::endl; std::cout << std::endl; std::cout << "Main thread id: " << QThread::currentThreadId() << std::endl; QString portName; QString settings; if ( !processArgs(a.arguments(), portName, settings) ) return 0; QSerialPort serport(portName, settings); if ( !serport.open() ) qFatal("Cannot open serial port %s. Exiting..", qPrintable(portName)); Host host(serport); return a.exec(); }
и сответственно #include "mainwindow.h" ... создается стандартный C++ (Qt) #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
Название: Re: Передача переменной в графическое окно из другого класса.
Отправлено: GreatSnake от Декабря 03, 2010, 17:26
Создал, .. просто не показал, сейчас main.cpp выглядит так Странное поведение - нам показывает один код, потом оказывается, что он совсем другой. С таким подходом вы помощи долго будете ждать...
Название: Re: Передача переменной в графическое окно из другого класса.
Отправлено: jodam от Декабря 03, 2010, 19:18
Сделал так из соображений, не запутать форумчан... уже своими попытками.
Название: Re: Передача переменной в графическое окно из другого класса.
Отправлено: BRE от Декабря 03, 2010, 19:43
Сделал так из соображений, не запутать форумчан... уже своими попытками.
В класс Host нужно добавить свой сигнал, например: void readedData( const QByteArray & ) В методе onDataReceived, после получения данных, нужно эмитеть этот сигнал с полученными данными. В MainWindow нужно добавить слот, например: void logData( const QByteArray & ) который будет разбирать данные и выводить их на экран. В функции main связать сигнал readedData объекта Host с слотом logData объекта MainWondow.
|