C++/Qt
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
C++/Qt
Привет!
На днях заинтересовался языком программирования C++. Мои требования к языку/компилятору/среде разработки были следующими:
бесплатность (включая создание комерческих приложений)
распространённость (форумы, блоги, примеры)
гибкость (наличие библиотек)
несложность работы с пользовательским интерфейсом (программирование GUI)
межплатформенность (виндовс, линукс, контроллеры, сотовые телефоны, PDA)
В общем инсталяция прошла на ура, примеры и уроки выполнять и понимать получается, отличный русскоязычный форум нашёл, библиотек выше крыши, кросплатформенность несложных примеров протестил в линуксе, GUI создать легко, все лицензии использованых инструментов под LGPL. Всё подходит.
Думаю и дальше продолжать заниматься этим, пока как хобби, а потом посмотрим.
В общем впечатления только положительные, всем советую:
http://qt.nokia.com/products/
На днях заинтересовался языком программирования C++. Мои требования к языку/компилятору/среде разработки были следующими:
бесплатность (включая создание комерческих приложений)
распространённость (форумы, блоги, примеры)
гибкость (наличие библиотек)
несложность работы с пользовательским интерфейсом (программирование GUI)
межплатформенность (виндовс, линукс, контроллеры, сотовые телефоны, PDA)
В общем инсталяция прошла на ура, примеры и уроки выполнять и понимать получается, отличный русскоязычный форум нашёл, библиотек выше крыши, кросплатформенность несложных примеров протестил в линуксе, GUI создать легко, все лицензии использованых инструментов под LGPL. Всё подходит.
Думаю и дальше продолжать заниматься этим, пока как хобби, а потом посмотрим.
В общем впечатления только положительные, всем советую:
http://qt.nokia.com/products/
-
Pavel Krivozubov
- professor
- Сообщения: 4422
- Зарегистрирован: 07 фев 2008, 16:39
- Награды: 3
- Версия LabVIEW: 7.0 - 2013
- Откуда: г. Электросталь
- Благодарил (а): 24 раза
- Поблагодарили: 9 раз
- Контактная информация:
Re: C++/Qt
Прикольно)
Ну и как после LabVIEW идет процесс изучения текстового языка? Есть ли трудности в освоении?
Ну и как после LabVIEW идет процесс изучения текстового языка? Есть ли трудности в освоении?
Правила форума
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
-
grjgrj
- professional
- Сообщения: 300
- Зарегистрирован: 18 фев 2009, 14:32
- Награды: 2
- Версия LabVIEW: 8.5-2011
- Откуда: Караганда
- Контактная информация:
Re: C++/Qt
Я тоже решил С++ изучать, но не вижу смысла изучать какие то экзотическое IDE, предпочитаю более популярные среды. Сейчас потихоньку в свободное время осваиваю Visual Studio C++. У них тоже есть бесплатные версии и поддержка для КПК и сматфонов. И при трудоустройстве по крайне мере у нас спрашивают именно его. У C++/Qt на мой взгляд только два плюса: кросс платформенный и бесплатность.
-
Forward
- professional
- Сообщения: 337
- Зарегистрирован: 03 мар 2008, 12:41
- Награды: 3
- Версия LabVIEW: 2010
- Откуда: Кишинев
- Контактная информация:
Re: C++/Qt
Тоже работал с Qt. Делал маленькие проекты под winCE и под Embedded Linux, возможно к концу года придется делать на нем большой проект.
Со сборкой пару раз натыкался на "гемморные варианты" (особенно со сборкой под АРМ), но ради кросс-платформенности все это можно простить, да и главное один раз это пройти.
Для коммерческих приложений Qt не бесплатен, если конечно нет желания открывать все исходники.
Из того что не очень нравится - при компиляции конечного приложения в статике оно занимает от 5 Мб и выше, если там присутствует GUI, либо нужно тащить за собой длл-ки. Хотя на сегодняшний день это конечно объем несерьезный :).
Еще как альтернативу Qt пробовал wxwidgets (http://www.wxwidgets.org): он полностью бесплатен, конечное приложение работает быстрее Qt-го, он использует нативные элементы ОС, приложение меньше весит и меньше требует, но с т.з. скорости и простоты создания приложений он значительно уступает Qt, + классов там поменьше.
Со сборкой пару раз натыкался на "гемморные варианты" (особенно со сборкой под АРМ), но ради кросс-платформенности все это можно простить, да и главное один раз это пройти.
Для коммерческих приложений Qt не бесплатен, если конечно нет желания открывать все исходники.
Qt - это набор классов и его можно использовать совместно с Visual Studio, используя майкросфтовский компилятор и все навороты студии и примочки к ней - типа Visual Assist X, Visual SVN, Compuware Devpartner и т.п. Большинство так и делает.grjgrj писал(а):не вижу смысла изучать какие то экзотическое IDE
Из того что не очень нравится - при компиляции конечного приложения в статике оно занимает от 5 Мб и выше, если там присутствует GUI, либо нужно тащить за собой длл-ки. Хотя на сегодняшний день это конечно объем несерьезный :).
Еще как альтернативу Qt пробовал wxwidgets (http://www.wxwidgets.org): он полностью бесплатен, конечное приложение работает быстрее Qt-го, он использует нативные элементы ОС, приложение меньше весит и меньше требует, но с т.з. скорости и простоты создания приложений он значительно уступает Qt, + классов там поменьше.
-
grjgrj
- professional
- Сообщения: 300
- Зарегистрирован: 18 фев 2009, 14:32
- Награды: 2
- Версия LabVIEW: 8.5-2011
- Откуда: Караганда
- Контактная информация:
Re: C++/Qt
Ясно, спасибо, значит я до него еще просто не дорос :), но буду знать, если нужно будем для WinCE писать и Mobile не подойдет.Forward писал(а):Тоже работал с Qt. Делал маленькие проекты под winCE и под Embedded Linux, возможно к концу года придется делать на нем большой проект.
Со сборкой пару раз натыкался на "гемморные варианты" (особенно со сборкой под АРМ), но ради кросс-платформенности все это можно простить, да и главное один раз это пройти.
Для коммерческих приложений Qt не бесплатен, если конечно нет желания открывать все исходники.
Qt - это набор классов и его можно использовать совместно с Visual Studio, используя майкросфтовский компилятор и все навороты студии и примочки к ней - типа Visual Assist X, Visual SVN, Compuware Devpartner и т.п. Большинство так и делает.grjgrj писал(а):не вижу смысла изучать какие то экзотическое IDE
Из того что не очень нравится - при компиляции конечного приложения в статике оно занимает от 5 Мб и выше, если там присутствует GUI, либо нужно тащить за собой длл-ки. Хотя на сегодняшний день это конечно объем несерьезный :).
Еще как альтернативу Qt пробовал wxwidgets (http://www.wxwidgets.org): он полностью бесплатен, конечное приложение работает быстрее Qt-го, он использует нативные элементы ОС, приложение меньше весит и меньше требует, но с т.з. скорости и простоты создания приложений он значительно уступает Qt, + классов там поменьше.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: C++/Qt
Начиная с одной из последних версий была добавлена лицензия LGPL. То разделение, которое было раньше, на GPL и LGPL ещё осталось, но теперь можно создать коммерческую прогу используя LGPL.Forward писал(а): Для коммерческих приложений Qt не бесплатен, если конечно нет желания открывать все исходники.
А IDE под названием Qt Creator ничего так, по-моему всё сделано удобно, никаких минусов по отношению к VS (в котором я пробовал программировать много раньше) или NetBeans (с которого я вообще то недавно начал) не замечено.
Размеры EXE при статической линковке да, большие, но здесь ничего не поделаешь. В вообще обязательно нужен инсталлятор, который как мы знаем, намного больше. В общем здесь проблемы не вижу.
Сейчас поделал примерчики, нашёл функции для многопоточного программирования, обмена информацией между потоками, так же поддержку последовательного онтерфейса и TCP/IP, всё есть, на первый взгляд мало отличается от . Те же самые Open/Close/Read/Write.
Очень понравилась система сигналов и слотов (обработчик событий). Вот не знаю стоит ли мне использовать QQueue + QMutex или же оставаться в системе сигналов и слотов для межпоточного обмена информацией.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: C++/Qt
Разбираюсь потихоньку, узнал о многопоточности, межпоточный обмен данными с помощью сигналов и слотов, нарыл библиотеку для работы с последовательным портом. Сейчас делаю LVP Terminal
-
Pavel Krivozubov
- professor
- Сообщения: 4422
- Зарегистрирован: 07 фев 2008, 16:39
- Награды: 3
- Версия LabVIEW: 7.0 - 2013
- Откуда: г. Электросталь
- Благодарил (а): 24 раза
- Поблагодарили: 9 раз
- Контактная информация:
Re: C++/Qt
Будешь создавать QT Portal?
Правила форума
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
-
Forward
- professional
- Сообщения: 337
- Зарегистрирован: 03 мар 2008, 12:41
- Награды: 3
- Версия LabVIEW: 2010
- Откуда: Кишинев
- Контактная информация:
Re: C++/Qt
Да, здорово, не знал...eg писал(а):Начиная с одной из последних версий была добавлена лицензия LGPL. То разделение, которое было раньше, на GPL и LGPL ещё осталось, но теперь можно создать коммерческую прогу используя LGPL.
ИМХО, главный плюс студии - Visual Assist X, это - мегавещь!eg писал(а):А IDE под названием Qt Creator ничего так, по-моему всё сделано удобно, никаких минусов по отношению к VS (в котором я пробовал программировать много раньше) или NetBeans (с которого я вообще то недавно начал) не замечено.
Я как-то столкнулся с тем, что у меня не хватило флэша для моего приложения. У контроллера был флэш 4 или 5 Мб. Хотя на сегодняшний день это все конечно смешно. Все решается без проблем.eg писал(а):Размеры EXE при статической линковке да, большие, но здесь ничего не поделаешь. В вообще обязательно нужен инсталлятор, который как мы знаем, намного больше. В общем здесь проблемы не вижу.
Может забить домен пока не поздно?Indey писал(а):Будешь создавать QT Portal?
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: C++/Qt
Проверьте мою первую прогу написаную с Qt плиз. Это терминал для последовательного интерфейса (как тот, что я когдато делал на LabVIEW), но пока что сильно упрощённый.
- Вложения
-
- LVPTerminal.zip
- (5.11 МБ) 564 скачивания
-
grjgrj
- professional
- Сообщения: 300
- Зарегистрирован: 18 фев 2009, 14:32
- Награды: 2
- Версия LabVIEW: 8.5-2011
- Откуда: Караганда
- Контактная информация:
Re: C++/Qt
Все отлично работает, открывает порт, отправляет и принимает данные. Но когда закрываю программу (предварительно закрыв порт) выходи стандартная ошибка Windows. Вот принскрин
P.S. тестилось на Windows XP SP3
И еще вопрос, не можешь выложить исходники, чтобы посмотреть насколько это все просто делается? или другой пример. А то тут нужно прогу маленькую написать на установщик нереально много будет весить.P.S. тестилось на Windows XP SP3
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: C++/Qt
Да, конечно сорсы могу выложить. Если нужно могу и пояснить что к чему. На самом деле всё достаточно легко.
Так же выложил всё в русском Qt форуме(там пояснения и проф. критика):
http://www.prog.org.ru/topic_14556_0.html
Так же выложил всё в русском Qt форуме(там пояснения и проф. критика):
http://www.prog.org.ru/topic_14556_0.html
- Вложения
-
- LVPTerminal.zip
- (283.53 КБ) 308 скачиваний
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: C++/Qt
Напишу немного о реализации. Сразу поясню что прога была написана исключительно в ознакомительных целях с Qt и реализована непрофессионально.
Прога состоит из 6 модулей (каждый модуль это header и cpp файлы). Конечно можно было обойтись одним файлом main.cpp, но мы же знаем, что нужно программировать модулярно. И так модули:
Main
В ней находится главная функция с которой программа начинает своё выполнение.
MainWidget
Сборка лицевой панели главного окна программы.
SettingsWidget
Верхняя часть окна, состоящая из двух комбобоксов (Port + Baud) и кнопки Open.
DataOutputWidget
Нижняя часть окна для отображения и ввода данных.
MyTextEdit
Нужен был для переопределения ивента класса QTextEdit, чтобы отловить нажатия на клавиши клавиатуры для ввода данных.
SerialThread
Собственно отдельный поток для считывания данных с порта и отправки данных в порт.
Прога состоит из 6 модулей (каждый модуль это header и cpp файлы). Конечно можно было обойтись одним файлом main.cpp, но мы же знаем, что нужно программировать модулярно. И так модули:
Main
В ней находится главная функция с которой программа начинает своё выполнение.
MainWidget
Сборка лицевой панели главного окна программы.
SettingsWidget
Верхняя часть окна, состоящая из двух комбобоксов (Port + Baud) и кнопки Open.
DataOutputWidget
Нижняя часть окна для отображения и ввода данных.
MyTextEdit
Нужен был для переопределения ивента класса QTextEdit, чтобы отловить нажатия на клавиши клавиатуры для ввода данных.
SerialThread
Собственно отдельный поток для считывания данных с порта и отправки данных в порт.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: C++/Qt
Что касается лицевой панели, то можно было всё сделать не в ручную, а использовать Qt Designer, но мне хотелось (и мне посоветовали) для начала его не использовать, а разобраться с ручной сборкой лицевой панели.
Начнём с main.cpp:
1. Инклюдируем нужные и используемые хедеры модулей
2. Инициализируем прогу
3. Конфигурируем главное окно и показываем его
4. Инициализируем отдельный поток SerialThread
5. Соединяем сигналы и слоты (об этом ниже)
6. Запускаем прогу (точнее передаём управление программой Qt)
Сигналы и слоты - отличная система коммуникации в программе между модулями/потоками.
Сигналы (по нашему event) можно использовать как и предопределённые системой, либо создать собственный (по нашему user event).
Слоты это функции реагирования на сигналы. В самом сигнале можно передавать любые данные слоту.
Connect соединяет сигналы со слотами. Так же можно соединить сигнал с сигналом, тогда один сигнал будет инициировать второй.
Начнём с 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();
}
2. Инициализируем прогу
3. Конфигурируем главное окно и показываем его
4. Инициализируем отдельный поток SerialThread
5. Соединяем сигналы и слоты (об этом ниже)
6. Запускаем прогу (точнее передаём управление программой Qt)
Сигналы и слоты - отличная система коммуникации в программе между модулями/потоками.
Сигналы (по нашему event) можно использовать как и предопределённые системой, либо создать собственный (по нашему user event).
Слоты это функции реагирования на сигналы. В самом сигнале можно передавать любые данные слоту.
Connect соединяет сигналы со слотами. Так же можно соединить сигнал с сигналом, тогда один сигнал будет инициировать второй.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: C++/Qt
MainWidget.h
1. инклюдируем используемые модули
2. дефинируем класс MainWidget, который переопределяет(перезагружает) класс QWidget из библиотеки Qt. То есть он является производным класса основной библиотеки
3. макрос Q_Object нужно добавлять всегда, если используются сигналы или слоты в классе (это нужно компилятору)
4. дефинируем мемберы public, для открытого доступа к ним из других классов
5. перезагружаем closeEvent protected (нажатие на красный крестик в правом верхнем углу окна), добавив в него сигнал (в cpp файле)
MainWidget.cpp
1. Инклюдируем модули, SettingsWidget.h и DataOutputWidget.h уже инклюдированы в MainWidget.h
2. parent = 0 означает что MainWidget принадлежит главному окну
3. Инициализируем два подвиджета, при этом говорим что они принадлежат не главному окну, а этому виджету (this)
4. Создаём layout для расположения в нём подвиджетов
5. Добавляем подвиджеты в layout
6. emit означает инициацию сигнала quit()
Код: Выделить всё
#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
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();
}
2. parent = 0 означает что MainWidget принадлежит главному окну
3. Инициализируем два подвиджета, при этом говорим что они принадлежат не главному окну, а этому виджету (this)
4. Создаём layout для расположения в нём подвиджетов
5. Добавляем подвиджеты в layout
6. emit означает инициацию сигнала quit()