C++/Qt

C/C++, JAVA, Agilent VEE, PHP, Basic, Pascal, Matlab etc.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Репутация: 0
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: C++/Qt

Сообщение Eugen Graf »

SettingsWidget.h

Код: Выделить всё

#ifndef SETTINGSWIDGET_H
#define SETTINGSWIDGET_H

#include <QWidget>
#include <QComboBox>
#include <QLabel>
#include <QPushButton>
#include <QString>

class SettingsWidget : public QWidget
{

Q_OBJECT

public:
    SettingsWidget(QWidget *parent = 0);
private:
    QLabel *LabelCom, *LabelBaud;
    QComboBox *CBCom, *CBBaud;
    QPushButton *BtnOpen;
private slots:
    void openClose(bool open);
signals:
    void start(QString port, QString baud);
    void stop(void);
};

#endif // SETTINGSWIDGET_H


1. Инклюдируем используемые модули
2. В принципе как всегда дефинируем класс
3. Дефинируем слот openClose, который реагирует на сигнал нажатия на кнопку Open, состояние кнопки True или False передаётся этому слоту из сигнала
4. Дефинируем сигналы start и stop. Ну названия подобраны по-моему не очень. Но старт означает открыть порт с такими то настройками, а стоп означает закрыть порт.

SettingsWidget.cpp

Код: Выделить всё

#include <QComboBox>
#include <QGridLayout>
#include <QList>

#include <qextserialenumerator.h>

#include "SettingsWidget.h"

SettingsWidget::SettingsWidget(QWidget *parent)
    : QWidget(parent)
{
    LabelCom = new QLabel;
    LabelCom->setText("Port");
    CBCom = new QComboBox;
    CBCom->setEditable(TRUE);
    QList<QextPortInfo> ports = QextSerialEnumerator::getPorts();

    for (int i = 0; i < ports.size(); i++)
    {
        CBCom->addItem(ports.at(i).portName.toLocal8Bit().constData());
    }

    LabelBaud = new QLabel;
    LabelBaud->setText("Baud");
    CBBaud = new QComboBox;
    CBBaud->setEditable(TRUE);
    CBBaud->addItem("110");
    CBBaud->addItem("300");
    CBBaud->addItem("600");
    CBBaud->addItem("1200");
    CBBaud->addItem("2400");
    CBBaud->addItem("4800");
    CBBaud->addItem("9600");
    CBBaud->addItem("14400");
    CBBaud->addItem("19200");
    CBBaud->addItem("38400");
    CBBaud->addItem("56000");
    CBBaud->addItem("57600");
    CBBaud->addItem("115200");
    CBBaud->addItem("128000");
    CBBaud->addItem("256000");

    BtnOpen = new QPushButton;
    BtnOpen->setText("Open");
    BtnOpen->setCheckable(TRUE);

    QGridLayout *layout = new QGridLayout;
    layout->addWidget(LabelCom, 0, 0);
    layout->addWidget(CBCom, 1, 0);
    layout->addWidget(LabelBaud, 0, 1);
    layout->addWidget(CBBaud, 1, 1);
    layout->addWidget(BtnOpen, 1, 2);
    setLayout(layout);

    connect(BtnOpen, SIGNAL(clicked(bool)), this, SLOT(openClose(bool)));
}

void SettingsWidget::openClose(bool open)
{
    if (open)
    {
        emit SettingsWidget::start(CBCom->currentText(), CBBaud->currentText());
        BtnOpen->setText("Close");
    }
    else
    {
        emit SettingsWidget::stop();
        BtnOpen->setText("Open");
    }
}


1. Контруктор класса (вызывается всегда, когда этот класс инстанциируется, то есть создаётся обьект класса).
1.1. Создаём комбобокс CBCom с лейблом "Port"
1.2. Вызываем функцию нумерации имеющихся в системе портов
1.3. Добавляем наименования портов в комбобокс
1.4. Создаём комбобокс CBBaud с лейблом "Baud"
1.5. Добавляем список известных нам baudrate
1.6. Создаём кнопку Open
1.7. Создаём layout и добавляем в него созданые элементы виджета Settings
1.8. Соединяем сигнал нажатия на кнопку со слотом openClose

2. Декларируем слот openClose (что должно происходить если этот слот вызовется каким либо сигналом)
2.1. Если в сигнале было передано состояние кнопки True, до инициируем сигнал старт в котором передаём настройки, заодно меняем надпись на кнопке
2.2. Инициируем сигнал stop и меняем надпись на кнопке

Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Репутация: 0
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: C++/Qt

Сообщение Eugen Graf »

DataOutputWidget.h

Код: Выделить всё

#ifndef DATAOUTPUTWIDGET_H
#define DATAOUTPUTWIDGET_H

#include <QWidget>
#include <QTextEdit>

#include "MyTextEdit.h"

class DataOutput : public QWidget
{
    Q_OBJECT

public:
    DataOutput(QWidget *parent = 0);
private:
    MyTextEdit *te;
public slots:
    void newRXData(QString data);
signals:
    void newTXData(QString data);
};

#endif // DATAOUTPUTWIDGET_H


Думаю обьяснения не требуются. В общем всё как обычно. Слот newRXData вызывается сигналом из SerialThread когда в порт приходят данные, сигнал newTXData инициируется нажатием клавиш на клавиатуре.

DataOutputWidget.cpp

Код: Выделить всё

#include <QGridLayout>

#include "DataOutputWidget.h"

DataOutput::DataOutput(QWidget *parent)
    : QWidget(parent)
{
    te = new MyTextEdit;

    QGridLayout *layout = new QGridLayout;
    layout->addWidget(te);
    setLayout(layout);
    connect(te, SIGNAL(keyPressed(QString)), this, SIGNAL(newTXData(QString)));
}

void DataOutput::newRXData(QString data)
{
    te->insertPlainText(data);
}


В конструкторе создаём виджет MyTextEdit о котором ниже и соединяем сигнал keyPressed с сигналом newTXData.
Слот newRXData добавляет данные в контрол/индикатор MyTextEdit te.

Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Репутация: 0
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: C++/Qt

Сообщение Eugen Graf »

MyTextEdit.h

Код: Выделить всё

#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H

#include <QTextEdit>

class MyTextEdit : public QTextEdit
{
    Q_OBJECT

protected:
        void keyPressEvent ( QKeyEvent * event );
signals:
        void keyPressed ( QString text);
};


#endif // MYTEXTEDIT_H


MyTextEdit.cpp

Код: Выделить всё


#include <QKeyEvent>

#include "MyTextEdit.h"
#include "DataOutputWidget.h"

void MyTextEdit::keyPressEvent ( QKeyEvent * event )
{
    emit this->keyPressed(event->text());
    event->accept();
}


Этот модуль создан для того, чтобы перехватывать ивент нажатия на клавиши, т.к. в системе нет такого предопределённого сигнала. Этот модуль преобразует event в signal.

Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Репутация: 0
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: C++/Qt

Сообщение Eugen Graf »

SerialThread.h

Код: Выделить всё

#ifndef SERIALTHREAD_H
#define SERIALTHREAD_H

#include <QThread>
#include <qextserialport.h>

class SerialThread : public QThread {

Q_OBJECT

public:
  SerialThread(QObject *parent = 0);
  ~SerialThread();
private:
  QextSerialPort *port;
  bool portIsOpen;
  bool exitThread;
  virtual void run(void);
public slots:
  void open(QString newport, QString baud);
  void close(void);
  void stopThread(void);
  void TX(QString data);
signals:
  void RX(QString data);
};

#endif // SERIALTHREAD_H


SerialThread.cpp

Код: Выделить всё

#include <iostream>

#include "SerialThread.h"


SerialThread::SerialThread(QObject *parent)
        : QThread(parent)
{
    portIsOpen = FALSE;
    exitThread = FALSE;
    this->start();
}

SerialThread::~SerialThread()
{
}

void SerialThread::stopThread()
{
    exitThread = TRUE;
    wait();
}

void SerialThread::open(QString newport, QString baud)
{
    port = new QextSerialPort(newport);
    port->setBaudRate((BaudRateType)baud.toULong());
    port->setFlowControl(FLOW_OFF);
    port->setParity(PAR_NONE);
    port->setDataBits(DATA_8);
    port->setStopBits(STOP_1);
    port->setTimeout(100);
    port->open(QIODevice::ReadWrite | QIODevice::Unbuffered);
    portIsOpen = port->isOpen();
}

void SerialThread::close()
{
    portIsOpen = FALSE;
    port->close();
    portIsOpen = port->isOpen();
}

void SerialThread::TX(QString data)
{
    if(portIsOpen)
    {
        port->write(data.toAscii(), data.length());
    }
}

void SerialThread::run()
{
    char buff[1024];
    int numBytes = 0;
    while(!exitThread)
    {
            if(portIsOpen)
                {
                    numBytes = port->bytesAvailable();
                    if(numBytes >0)
                    {
                        port->read(buff, numBytes);
                        buff[numBytes] = '\0';
                        QString msg = buff;
                        emit this->RX(msg);
                    }
                    else
                    {
                        this->msleep(100);
                    }
                }
            else
                {
                    this->msleep(100);
                }
        }
}


В конструкторе инициализируем флэги portIsOpen и exitThread для внутреннего использования в потоке. this->start стартует выполнение потока (то есть запускается функция SerialThread::run(), которая работает параллельно главному потоку программы).
Деструктор пустой, да он в принципе и не нужен, хотя в нём можно бы например освободить память или ещё что нибудь (может порт закрыть).
Слот stopThread переводит флэг (по нашему локальную переменную) exitThread в состояние True и ждёт пока SerialThread::run() не закончит своё выполнение. Кстати есть функция terminate, тогда SerialThread::run() сразу прервёт своё исполнение (но это более насильный метод остановки потока).
Собственно open и close должны быть понятны.
Сам поток состоит из цикла (он не обязательно должен состоять из цикла как мы привыкли думать в LabVIEW). И так создаём буфер для данных и запускаем цикл, в котором считываются данные и в случае если данные имеются отправляем их в другой слот для представления на лицевой панели. Цикл выполняется до тех пор, пока флэг exitThread не станет True.

Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4402
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Репутация: 0
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Контактная информация:

Re: C++/Qt

Сообщение Pavel Krivozubov »

Мне кажется эта тема довольно наглядно иллюстрирует разницу между текстовым и графическим подходами к программированию :D

Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Репутация: 0
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: C++/Qt

Сообщение Eugen Graf »

Да, я согласен, что понять его для нас сложно, но я расписал всё подробно, тем более не использовал Qt Designer, с которым можно WYSIWYG создавать лицевую панель мышкой.
Но конечно в :labview: намного быстрее можно это всё провернуть, особенно если его знаешь.

AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1225
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Репутация: 0
Версия LabVIEW: 6.1 - 2016
Откуда: Германия
Контактная информация:

Re: C++/Qt

Сообщение AndreyDmitriev »

eg писал(а):1. Инклюдируем используемые модули
2. В принципе как всегда дефинируем класс
...


О, сразу видно - за границей человек живёт. Дефинитивно за границей.
Извините за оффтопик, не удержался...

Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Репутация: 0
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: C++/Qt

Сообщение Eugen Graf »

Ок, определяем наверное, мы здесь любим (непонятные) иностранные слова переделывать, хотя мне бы хотелось говорить по-русски. Но все всех понимают, довольны этим и не обращаем на это внимание.
Когда был в Москве мне показалось, что мой разговорный русский неотличим от местного :haha:

Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Репутация: 0
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: C++/Qt

Сообщение Eugen Graf »

А я окончательно перешёл на Qt/C++, теперь только старые LabVIEW-проекты поддерживаю, а все новые делаю на Qt.
Поэтому в этом форуме редко появляюсь.

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3482
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2020
Контактная информация:

Re: C++/Qt

Сообщение dadreamer »

Eugen Graf писал(а):а все новые делаю на Qt.

С чем это связано? Можете поделиться мыслями?

Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1099
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Репутация: 0
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: C++/Qt

Сообщение Vitekkz88 »

На самом деле я тоже начал делать упор на Си-подобные языки. Хоть опыт работы и написания программ на С/C++ есть, но я решил освоить Java(почему именно Java, а не C# не буду расписывать. Долго и вряд ли интересно. Холивары куда интересней читать, погуглите) :).
Потихонечку поставил себе NetBeans и Eclipse и начал с десктопных приложений для начала. Дальше буду двигаться в область сетевого программирования и апликухи под андроид писать. Проекты буду потихоньку переносить в текст. Да помогут мне плагины и sdk :crazy:
Но я хочу свой софт(некоторые проекты) перетащить на планшеты с андроид. И делать это классическим текстовым способом, без читерства и графического программинга:)
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3482
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2020
Контактная информация:

Re: C++/Qt

Сообщение dadreamer »

Vitekkz88, то есть, этот переход не связан с какими-то недостатками :labview: как среды программирования, а связан больше все-таки с расширением кругозора и получением нового опыта? А что касается мобильных платформ, то там :labview: как редактор не поставить никак, так что остаются традиционные языки.

Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1099
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Репутация: 0
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: C++/Qt

Сообщение Vitekkz88 »

этот переход не связан с какими-то недостатками как среды программирования, а связан больше все-таки с расширением кругозора и получением нового опыта?

LabVIEW эффективно решает задачи в своей области. Временами действительно удобен и в разы эффективней текстовых языков. Но всё же не хватает ему универсальности, популярности и широкой востребованности. Карьерный рост LabVIEW-разработчика в подавляющем большинстве проигрывает росту классического разработчика.
А что касается мобильных платформ, то там как редактор не поставить никак, так что остаются традиционные языки.

Редактор на Android не поставить, но можно использовать WebPager(по-моему так называется), чтоб получать доступ к FP на мобильных устройствах. Ну или планшеты с Windows или iOS покупать и инсталировать туда приложения и редактор при желании. Но это опять же, загонять себя в рамки. Каждому инструменту - своё место.
Похоже я стал достигать того уровня, когда закрытый доступ к исходникам и реализации у меня начинает потихонечку вызывать недовольство.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын

AlexanderKonoval
developer
developer
Сообщения: 257
Зарегистрирован: 03 янв 2014, 19:37
Репутация: 0
Версия LabVIEW: 2016
Откуда: Украина, Киев
Контактная информация:

Re: C++/Qt

Сообщение AlexanderKonoval »

dadreamer писал(а):Vitekkz88, то есть, этот переход не связан с какими-то недостатками :labview: как среды программирования, а связан больше все-таки с расширением кругозора и получением нового опыта? А что касается мобильных платформ, то там :labview: как редактор не поставить никак, так что остаются традиционные языки.


купил себе недавно HP Stream 7. Компактный планшет на атоме, по сути, полноценный карманный ПК. Отличная вещь и лабвью там работает замечательно со всеми вытекающими.

учитывая заявления микрософта по их платформе Вин10, подобных устройств будет становится только больше. Что-то мне подсказывает, что гугл с яблоком тоже начнут идти в подобном направлении, только по юникс-подобным системам, то есть, вполне вероятно, что скоро андоиды и яблоки станут карманными ПК на линуксе.

так что, "не всё так однозначно" (с)
колдооооовствооооо! (С)

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3482
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2020
Контактная информация:

Re: C++/Qt

Сообщение dadreamer »

AlexanderKonoval писал(а):купил себе недавно HP Stream 7. Компактный планшет на атоме, по сути, полноценный карманный ПК. Отличная вещь и лабвью там работает замечательно со всеми вытекающими.

Мне стоило конкретизировать, что на мобильные устройства с ОС Android :labview: не поставить. У вас-то девайс работает на Windows 8.1. А также стоит добавить, что и на iPhone тоже :labview: не поставить.
AlexanderKonoval писал(а):Что-то мне подсказывает, что гугл с яблоком тоже начнут идти в подобном направлении, только по юникс-подобным системам, то есть, вполне вероятно, что скоро андоиды и яблоки станут карманными ПК на линуксе.

Android и так UNIX-подобная ОС, поскольку основана на ядре Линукса. Так что вероятнее всего, что в NI просто добавят поддержку Android (т.к. :labview: на Linux существует давно и прекрасно работает) и iOS (т.к. :labview: на Apple OS X также работает давным-давно, причем ядро iOS почти идентично ядру Apple OS X). Ну, а для Windows поддержка уже есть.
Vitekkz88 писал(а):можно использовать WebPager(по-моему так называется), чтоб получать доступ к FP на мобильных устройствах

Я знаю, что у NI есть вот такой продукт - Data Dashboard for LabVIEW. По сути это расширение для web-сервисов и переменных с общим доступом, и позволяет на мобильном устройстве отобразить лицевую панель приложения с возможностью управления контролами. Кое какая информация на русском есть здесь.

Ответить

Вернуться в «Языки программирования»