Russian Qt Forum
Октябрь 03, 2024, 20:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача переменной в графическое окно из другого класса.  (Прочитано 3713 раз)
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
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Декабрь 03, 2010, 17:10 »

Цитировать
Но задача состоит в том что бы данные выводились в окно.
Только вот само окно вы и не создали.

Для GUI-приложений вместо QCoreApplication нужно использовать QApplication.
Записан

Qt 5.11/4.8.7 (X11/Win)
jodam
Гость
« Ответ #2 : Декабрь 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
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Декабрь 03, 2010, 17:26 »

Цитировать
Создал, .. просто не показал, сейчас main.cpp выглядит так
Странное поведение - нам показывает один код, потом оказывается, что он совсем другой.
С таким подходом вы помощи долго будете ждать...
Записан

Qt 5.11/4.8.7 (X11/Win)
jodam
Гость
« Ответ #4 : Декабрь 03, 2010, 19:18 »

Сделал так из соображений, не запутать форумчан... уже своими попытками.
Записан
BRE
Гость
« Ответ #5 : Декабрь 03, 2010, 19:43 »

Сделал так из соображений, не запутать форумчан... уже своими попытками.
В класс Host нужно добавить свой сигнал, например:
void readedData( const QByteArray & )
В методе onDataReceived, после получения данных, нужно эмитеть этот сигнал с полученными данными.
В MainWindow нужно добавить слот, например:
void logData( const QByteArray & )
который будет разбирать данные и выводить их на экран.

В функции main связать сигнал readedData объекта Host с слотом logData объекта MainWondow.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.21 секунд. Запросов: 23.