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
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

C++/Qt

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

Привет!

На днях заинтересовался языком программирования C++. Мои требования к языку/компилятору/среде разработки были следующими:

бесплатность (включая создание комерческих приложений)
распространённость (форумы, блоги, примеры)
гибкость (наличие библиотек)
несложность работы с пользовательским интерфейсом (программирование GUI)
межплатформенность (виндовс, линукс, контроллеры, сотовые телефоны, PDA)

В общем инсталяция прошла на ура, примеры и уроки выполнять и понимать получается, отличный русскоязычный форум нашёл, библиотек выше крыши, кросплатформенность несложных примеров протестил в линуксе, GUI создать легко, все лицензии использованых инструментов под LGPL. Всё подходит.

Думаю и дальше продолжать заниматься этим, пока как хобби, а потом посмотрим.

В общем впечатления только положительные, всем советую:
http://qt.nokia.com/products/
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4421
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 24 раза
Поблагодарили: 9 раз
Контактная информация:

Re: C++/Qt

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

Прикольно)
Ну и как после LabVIEW идет процесс изучения текстового языка? Есть ли трудности в освоении?
Аватара пользователя
grjgrj

Gold Bronze
professional
professional
Сообщения: 300
Зарегистрирован: 18 фев 2009, 14:32
Награды: 2
Версия LabVIEW: 8.5-2011
Откуда: Караганда
Контактная информация:

Re: C++/Qt

Сообщение grjgrj »

Я тоже решил С++ изучать, но не вижу смысла изучать какие то экзотическое IDE, предпочитаю более популярные среды. Сейчас потихоньку в свободное время осваиваю Visual Studio C++. У них тоже есть бесплатные версии и поддержка для КПК и сматфонов. И при трудоустройстве по крайне мере у нас спрашивают именно его. У C++/Qt на мой взгляд только два плюса: кросс платформенный и бесплатность.
Аватара пользователя
Forward

Activity Tutorials Black
professional
professional
Сообщения: 337
Зарегистрирован: 03 мар 2008, 12:41
Награды: 3
Версия LabVIEW: 2010
Откуда: Кишинев
Контактная информация:

Re: C++/Qt

Сообщение Forward »

Тоже работал с Qt. Делал маленькие проекты под winCE и под Embedded Linux, возможно к концу года придется делать на нем большой проект.
Со сборкой пару раз натыкался на "гемморные варианты" (особенно со сборкой под АРМ), но ради кросс-платформенности все это можно простить, да и главное один раз это пройти.
Для коммерческих приложений Qt не бесплатен, если конечно нет желания открывать все исходники.
grjgrj писал(а):не вижу смысла изучать какие то экзотическое IDE
Qt - это набор классов и его можно использовать совместно с Visual Studio, используя майкросфтовский компилятор и все навороты студии и примочки к ней - типа Visual Assist X, Visual SVN, Compuware Devpartner и т.п. Большинство так и делает.
Из того что не очень нравится - при компиляции конечного приложения в статике оно занимает от 5 Мб и выше, если там присутствует GUI, либо нужно тащить за собой длл-ки. Хотя на сегодняшний день это конечно объем несерьезный :).
Еще как альтернативу Qt пробовал wxwidgets (http://www.wxwidgets.org): он полностью бесплатен, конечное приложение работает быстрее Qt-го, он использует нативные элементы ОС, приложение меньше весит и меньше требует, но с т.з. скорости и простоты создания приложений он значительно уступает Qt, + классов там поменьше.
Аватара пользователя
grjgrj

Gold Bronze
professional
professional
Сообщения: 300
Зарегистрирован: 18 фев 2009, 14:32
Награды: 2
Версия LabVIEW: 8.5-2011
Откуда: Караганда
Контактная информация:

Re: C++/Qt

Сообщение grjgrj »

Forward писал(а):Тоже работал с Qt. Делал маленькие проекты под winCE и под Embedded Linux, возможно к концу года придется делать на нем большой проект.
Со сборкой пару раз натыкался на "гемморные варианты" (особенно со сборкой под АРМ), но ради кросс-платформенности все это можно простить, да и главное один раз это пройти.
Для коммерческих приложений Qt не бесплатен, если конечно нет желания открывать все исходники.
grjgrj писал(а):не вижу смысла изучать какие то экзотическое IDE
Qt - это набор классов и его можно использовать совместно с Visual Studio, используя майкросфтовский компилятор и все навороты студии и примочки к ней - типа Visual Assist X, Visual SVN, Compuware Devpartner и т.п. Большинство так и делает.
Из того что не очень нравится - при компиляции конечного приложения в статике оно занимает от 5 Мб и выше, если там присутствует GUI, либо нужно тащить за собой длл-ки. Хотя на сегодняшний день это конечно объем несерьезный :).
Еще как альтернативу Qt пробовал wxwidgets (http://www.wxwidgets.org): он полностью бесплатен, конечное приложение работает быстрее Qt-го, он использует нативные элементы ОС, приложение меньше весит и меньше требует, но с т.з. скорости и простоты создания приложений он значительно уступает Qt, + классов там поменьше.
Ясно, спасибо, значит я до него еще просто не дорос :), но буду знать, если нужно будем для WinCE писать и :labview: Mobile не подойдет.
Аватара пользователя
Eugen Graf

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

Re: C++/Qt

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

Forward писал(а): Для коммерческих приложений Qt не бесплатен, если конечно нет желания открывать все исходники.
Начиная с одной из последних версий была добавлена лицензия LGPL. То разделение, которое было раньше, на GPL и LGPL ещё осталось, но теперь можно создать коммерческую прогу используя LGPL.

А IDE под названием Qt Creator ничего так, по-моему всё сделано удобно, никаких минусов по отношению к VS (в котором я пробовал программировать много раньше) или NetBeans (с которого я вообще то недавно начал) не замечено.

Размеры EXE при статической линковке да, большие, но здесь ничего не поделаешь. В :labview: вообще обязательно нужен инсталлятор, который как мы знаем, намного больше. В общем здесь проблемы не вижу.

Сейчас поделал примерчики, нашёл функции для многопоточного программирования, обмена информацией между потоками, так же поддержку последовательного онтерфейса и TCP/IP, всё есть, на первый взгляд мало отличается от :labview: . Те же самые Open/Close/Read/Write.
Очень понравилась система сигналов и слотов (обработчик событий). Вот не знаю стоит ли мне использовать QQueue + QMutex или же оставаться в системе сигналов и слотов для межпоточного обмена информацией.
Аватара пользователя
Eugen Graf

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

Re: C++/Qt

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

Разбираюсь потихоньку, узнал о многопоточности, межпоточный обмен данными с помощью сигналов и слотов, нарыл библиотеку для работы с последовательным портом. Сейчас делаю LVP Terminal :cool:
Вложения
LVP_Terminal.png
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4421
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 24 раза
Поблагодарили: 9 раз
Контактная информация:

Re: C++/Qt

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

Будешь создавать QT Portal? :wink:
Аватара пользователя
Forward

Activity Tutorials Black
professional
professional
Сообщения: 337
Зарегистрирован: 03 мар 2008, 12:41
Награды: 3
Версия LabVIEW: 2010
Откуда: Кишинев
Контактная информация:

Re: C++/Qt

Сообщение Forward »

eg писал(а):Начиная с одной из последних версий была добавлена лицензия LGPL. То разделение, которое было раньше, на GPL и LGPL ещё осталось, но теперь можно создать коммерческую прогу используя LGPL.
Да, здорово, не знал...
eg писал(а):А IDE под названием Qt Creator ничего так, по-моему всё сделано удобно, никаких минусов по отношению к VS (в котором я пробовал программировать много раньше) или NetBeans (с которого я вообще то недавно начал) не замечено.
ИМХО, главный плюс студии - Visual Assist X, это - мегавещь!
eg писал(а):Размеры EXE при статической линковке да, большие, но здесь ничего не поделаешь. В :labview: вообще обязательно нужен инсталлятор, который как мы знаем, намного больше. В общем здесь проблемы не вижу.
Я как-то столкнулся с тем, что у меня не хватило флэша для моего приложения. У контроллера был флэш 4 или 5 Мб. Хотя на сегодняшний день это все конечно смешно. Все решается без проблем.
Indey писал(а):Будешь создавать QT Portal? :wink:
:D Может забить домен пока не поздно?
Аватара пользователя
Eugen Graf

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

Re: C++/Qt

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

Проверьте мою первую прогу написаную с Qt плиз. Это терминал для последовательного интерфейса (как тот, что я когдато делал на LabVIEW), но пока что сильно упрощённый.
Вложения
LVPTerminal.zip
(5.11 МБ) 561 скачивание
Аватара пользователя
grjgrj

Gold Bronze
professional
professional
Сообщения: 300
Зарегистрирован: 18 фев 2009, 14:32
Награды: 2
Версия LabVIEW: 8.5-2011
Откуда: Караганда
Контактная информация:

Re: C++/Qt

Сообщение grjgrj »

Все отлично работает, открывает порт, отправляет и принимает данные. Но когда закрываю программу (предварительно закрыв порт) выходи стандартная ошибка Windows. Вот принскрин
Ошибка при закрытии
Ошибка при закрытии
И еще вопрос, не можешь выложить исходники, чтобы посмотреть насколько это все просто делается? или другой пример. А то тут нужно прогу маленькую написать на :labview: установщик нереально много будет весить.
P.S. тестилось на Windows XP SP3
Аватара пользователя
Eugen Graf

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

Re: C++/Qt

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

Да, конечно сорсы могу выложить. Если нужно могу и пояснить что к чему. На самом деле всё достаточно легко.
Так же выложил всё в русском Qt форуме(там пояснения и проф. критика):
http://www.prog.org.ru/topic_14556_0.html
Вложения
LVPTerminal.zip
(283.53 КБ) 304 скачивания
Аватара пользователя
Eugen Graf

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

Re: C++/Qt

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

Напишу немного о реализации. Сразу поясню что прога была написана исключительно в ознакомительных целях с Qt и реализована непрофессионально.

Прога состоит из 6 модулей (каждый модуль это header и cpp файлы). Конечно можно было обойтись одним файлом main.cpp, но мы же знаем, что нужно программировать модулярно. И так модули:

Main

В ней находится главная функция с которой программа начинает своё выполнение.

MainWidget

Сборка лицевой панели главного окна программы.

SettingsWidget

Верхняя часть окна, состоящая из двух комбобоксов (Port + Baud) и кнопки Open.

DataOutputWidget

Нижняя часть окна для отображения и ввода данных.

MyTextEdit

Нужен был для переопределения ивента класса QTextEdit, чтобы отловить нажатия на клавиши клавиатуры для ввода данных.

SerialThread

Собственно отдельный поток для считывания данных с порта и отправки данных в порт.
Аватара пользователя
Eugen Graf

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

Re: C++/Qt

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

Что касается лицевой панели, то можно было всё сделать не в ручную, а использовать Qt Designer, но мне хотелось (и мне посоветовали) для начала его не использовать, а разобраться с ручной сборкой лицевой панели.

Начнём с main.cpp:

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

#include <QApplication>
#include <QWidget>

#include "SerialThread.h"
#include "MainWidget.h"
#include "SettingsWidget.h"

int main(int argc, char *argv[])
{
      QApplication app(argc, argv);

      MainWidget mw;
      mw.setWindowTitle("LVP Terminal");
      mw.setMinimumSize(800, 600);
      mw.show();

      SerialThread serialThread;
      QObject::connect(&mw, SIGNAL(quit()), &serialThread, SLOT(stopThread()));
      QObject::connect(mw.settings, SIGNAL(start(QString,QString)), &serialThread, SLOT(open(QString,QString)));
      QObject::connect(mw.settings, SIGNAL(stop()), &serialThread, SLOT(close()));
      QObject::connect(&serialThread, SIGNAL(RX(QString)), mw.dout, SLOT(newRXData(QString)));
      QObject::connect(mw.dout, SIGNAL(newTXData(QString)), &serialThread, SLOT(TX(QString)));
      return app.exec();
}
1. Инклюдируем нужные и используемые хедеры модулей
2. Инициализируем прогу
3. Конфигурируем главное окно и показываем его
4. Инициализируем отдельный поток SerialThread
5. Соединяем сигналы и слоты (об этом ниже)
6. Запускаем прогу (точнее передаём управление программой Qt)

Сигналы и слоты - отличная система коммуникации в программе между модулями/потоками.
Сигналы (по нашему event) можно использовать как и предопределённые системой, либо создать собственный (по нашему user event).
Слоты это функции реагирования на сигналы. В самом сигнале можно передавать любые данные слоту.
Connect соединяет сигналы со слотами. Так же можно соединить сигнал с сигналом, тогда один сигнал будет инициировать второй.
Аватара пользователя
Eugen Graf

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

Re: C++/Qt

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

MainWidget.h

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

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>

#include "SettingsWidget.h"
#include "DataOutputWidget.h"

class MainWidget : public QWidget
 {
    Q_OBJECT

 public:
     MainWidget(QWidget *parent = 0);
     SettingsWidget *settings;
     DataOutput *dout;
 protected:
     void closeEvent(QCloseEvent *event);
 signals:
     void quit(void);
 };

#endif // MAINWIDGET_H
1. инклюдируем используемые модули
2. дефинируем класс MainWidget, который переопределяет(перезагружает) класс QWidget из библиотеки Qt. То есть он является производным класса основной библиотеки
3. макрос Q_Object нужно добавлять всегда, если используются сигналы или слоты в классе (это нужно компилятору)
4. дефинируем мемберы public, для открытого доступа к ним из других классов
5. перезагружаем closeEvent protected (нажатие на красный крестик в правом верхнем углу окна), добавив в него сигнал (в cpp файле)


MainWidget.cpp

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

#include <QGridLayout>

#include "MainWidget.h"


MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent = 0)
{
    settings = new SettingsWidget(this);
    dout = new DataOutput(this);

    QGridLayout *layout = new QGridLayout;
    layout->addWidget(settings, 0, 0);
    layout->addWidget(dout, 1, 0);
    setLayout(layout);
}

void MainWidget::closeEvent(QCloseEvent *event)
{
    emit quit();
}
1. Инклюдируем модули, SettingsWidget.h и DataOutputWidget.h уже инклюдированы в MainWidget.h
2. parent = 0 означает что MainWidget принадлежит главному окну
3. Инициализируем два подвиджета, при этом говорим что они принадлежат не главному окну, а этому виджету (this)
4. Создаём layout для расположения в нём подвиджетов
5. Добавляем подвиджеты в layout
6. emit означает инициацию сигнала quit()
Ответить

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