Страница 1 из 3
C++/Qt
Добавлено: 03 авг 2010, 01:59
Eugen Graf
Привет!
На днях заинтересовался языком программирования C++. Мои требования к языку/компилятору/среде разработки были следующими:
бесплатность (включая создание комерческих приложений)
распространённость (форумы, блоги, примеры)
гибкость (наличие библиотек)
несложность работы с пользовательским интерфейсом (программирование GUI)
межплатформенность (виндовс, линукс, контроллеры, сотовые телефоны, PDA)
В общем инсталяция прошла на ура, примеры и уроки выполнять и понимать получается, отличный русскоязычный форум нашёл, библиотек выше крыши, кросплатформенность несложных примеров протестил в линуксе, GUI создать легко, все лицензии использованых инструментов под LGPL. Всё подходит.
Думаю и дальше продолжать заниматься этим, пока как хобби, а потом посмотрим.
В общем впечатления только положительные, всем советую:
http://qt.nokia.com/products/
Re: C++/Qt
Добавлено: 03 авг 2010, 06:28
Pavel Krivozubov
Прикольно)
Ну и как после LabVIEW идет процесс изучения текстового языка? Есть ли трудности в освоении?
Re: C++/Qt
Добавлено: 03 авг 2010, 07:53
grjgrj
Я тоже решил С++ изучать, но не вижу смысла изучать какие то экзотическое IDE, предпочитаю более популярные среды. Сейчас потихоньку в свободное время осваиваю Visual Studio C++. У них тоже есть бесплатные версии и поддержка для КПК и сматфонов. И при трудоустройстве по крайне мере у нас спрашивают именно его. У C++/Qt на мой взгляд только два плюса: кросс платформенный и бесплатность.
Re: C++/Qt
Добавлено: 03 авг 2010, 09:56
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, + классов там поменьше.
Re: C++/Qt
Добавлено: 03 авг 2010, 12:03
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 писать и
Mobile не подойдет.
Re: C++/Qt
Добавлено: 03 авг 2010, 13:23
Eugen Graf
Forward писал(а):
Для коммерческих приложений Qt не бесплатен, если конечно нет желания открывать все исходники.
Начиная с одной из последних версий была добавлена лицензия LGPL. То разделение, которое было раньше, на GPL и LGPL ещё осталось, но теперь можно создать коммерческую прогу используя LGPL.
А IDE под названием Qt Creator ничего так, по-моему всё сделано удобно, никаких минусов по отношению к VS (в котором я пробовал программировать много раньше) или NetBeans (с которого я вообще то недавно начал) не замечено.
Размеры EXE при статической линковке да, большие, но здесь ничего не поделаешь. В
вообще обязательно нужен инсталлятор, который как мы знаем, намного больше. В общем здесь проблемы не вижу.
Сейчас поделал примерчики, нашёл функции для многопоточного программирования, обмена информацией между потоками, так же поддержку последовательного онтерфейса и TCP/IP, всё есть, на первый взгляд мало отличается от
. Те же самые Open/Close/Read/Write.
Очень понравилась система сигналов и слотов (обработчик событий). Вот не знаю стоит ли мне использовать QQueue + QMutex или же оставаться в системе сигналов и слотов для межпоточного обмена информацией.
Re: C++/Qt
Добавлено: 05 авг 2010, 20:34
Eugen Graf
Разбираюсь потихоньку, узнал о многопоточности, межпоточный обмен данными с помощью сигналов и слотов, нарыл библиотеку для работы с последовательным портом. Сейчас делаю LVP Terminal
Re: C++/Qt
Добавлено: 06 авг 2010, 07:01
Pavel Krivozubov
Будешь создавать QT Portal?
Re: C++/Qt
Добавлено: 06 авг 2010, 12:00
Forward
eg писал(а):Начиная с одной из последних версий была добавлена лицензия LGPL. То разделение, которое было раньше, на GPL и LGPL ещё осталось, но теперь можно создать коммерческую прогу используя LGPL.
Да, здорово, не знал...
eg писал(а):А IDE под названием Qt Creator ничего так, по-моему всё сделано удобно, никаких минусов по отношению к VS (в котором я пробовал программировать много раньше) или NetBeans (с которого я вообще то недавно начал) не замечено.
ИМХО, главный плюс студии - Visual Assist X, это - мегавещь!
eg писал(а):Размеры EXE при статической линковке да, большие, но здесь ничего не поделаешь. В
вообще обязательно нужен инсталлятор, который как мы знаем, намного больше. В общем здесь проблемы не вижу.
Я как-то столкнулся с тем, что у меня не хватило флэша для моего приложения. У контроллера был флэш 4 или 5 Мб. Хотя на сегодняшний день это все конечно смешно. Все решается без проблем.
Indey писал(а):Будешь создавать QT Portal?
Может забить домен пока не поздно?
Re: C++/Qt
Добавлено: 11 авг 2010, 20:22
Eugen Graf
Проверьте мою первую прогу написаную с Qt плиз. Это терминал для последовательного интерфейса (как тот, что я когдато делал на LabVIEW), но пока что сильно упрощённый.
Re: C++/Qt
Добавлено: 12 авг 2010, 07:09
grjgrj
Все отлично работает, открывает порт, отправляет и принимает данные. Но когда закрываю программу (предварительно закрыв порт) выходи стандартная ошибка Windows. Вот принскрин
- Ошибка при закрытии
И еще вопрос, не можешь выложить исходники, чтобы посмотреть насколько это все просто делается? или другой пример. А то тут нужно прогу маленькую написать на
установщик нереально много будет весить.
P.S. тестилось на Windows XP SP3
Re: C++/Qt
Добавлено: 12 авг 2010, 11:17
Eugen Graf
Да, конечно сорсы могу выложить. Если нужно могу и пояснить что к чему. На самом деле всё достаточно легко.
Так же выложил всё в русском Qt форуме(там пояснения и проф. критика):
http://www.prog.org.ru/topic_14556_0.html
Re: C++/Qt
Добавлено: 12 авг 2010, 14:36
Eugen Graf
Напишу немного о реализации. Сразу поясню что прога была написана исключительно в ознакомительных целях с Qt и реализована непрофессионально.
Прога состоит из 6 модулей (каждый модуль это header и cpp файлы). Конечно можно было обойтись одним файлом main.cpp, но мы же знаем, что нужно программировать модулярно. И так модули:
Main
В ней находится главная функция с которой программа начинает своё выполнение.
MainWidget
Сборка лицевой панели главного окна программы.
SettingsWidget
Верхняя часть окна, состоящая из двух комбобоксов (Port + Baud) и кнопки Open.
DataOutputWidget
Нижняя часть окна для отображения и ввода данных.
MyTextEdit
Нужен был для переопределения ивента класса QTextEdit, чтобы отловить нажатия на клавиши клавиатуры для ввода данных.
SerialThread
Собственно отдельный поток для считывания данных с порта и отправки данных в порт.
Re: C++/Qt
Добавлено: 12 авг 2010, 14:46
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 соединяет сигналы со слотами. Так же можно соединить сигнал с сигналом, тогда один сигнал будет инициировать второй.
Re: C++/Qt
Добавлено: 12 авг 2010, 15:03
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()