" title="Написать письмо">Написать письмо
Много статей не имеет срока устаревания. Есть смысл смотреть и 2011, и даже 2008 год.
Политика сайта: написать статью, а потом обновлять ее много лет.
Теперь сайт отображается корректно и на мобильных аппаратах.

Рекламодателям! Перестаньте спамить мне на почту с предложениями о размещении рекламы на этом сайте. Я никогда спамером/рекламщиком не был и не буду!
Ваш IP: 54.156.82.247
Часто ли вы даете деньги на развитие бесплатных проектов?
 

Статистика

Пользователи : 1
Статьи : 970
Просмотры материалов : 2888443
 
Бесплатная среда программирования Qt: нюансы (21.08.2017). Печать E-mail
2017 - Август
21.08.2017 20:50
Save & Share
После полугода работы в Qt Creator v.3.5.1 пришло время сделать некоторые выводы. Каждая среда имеет свои тонкости функционирования; и если ранее думал, что самая глючная среда это Borland C++ Builder v.6.0 - то тут Qt переплюнула и его. Если отвлечься и сказать о самой логичной и безглючной среде - то это IBM Lotus Domino Designer, в которую входит язык LotusScript.
В защиту Qt сразу стоит сказать:
- Qt позиционирует себя как бесплатная среда разработки даже для организаций (GPL, LGPL - оплачивается только лицензия техподдержки, если есть желание). В связи с этим приобретает все большую популярность. Ежики плакали, но продолжали жрать кактус: потому что он бесплатный;
- заявлена кроссплатформенность: полная совместимость исходного кода в разных средах Windows/Linux/Unix.

Переход на Qt порождает ломку при миграции: из Linux перенята парадигма "сигналы-слоты", на понимание которой уйдет достаточно много времени. Образно, сигнал - вызываемый метод объекта или функция, слот - метод объекта или функция, которая сработает при вызывании сигнала. Соединяются сигналы и столы функцией connect, для которой тоже не все очевидно. Чтобы только ее было видно в других файлах, нужно постараться. Потом начинаются проблемы с видимостью сигналов и слотов. Потом выясняется, что сигнал и слот должны иметь одинаковое количество и тип входных параметров (согласно справке, нелогичные условия). Любая ошибка приводит к неработоспособности связки "сигнал-слот", компилятор на эту тему ничего не сообщает. Пример корректного выполнения:
connect(ui->action_PrintScreen, SIGNAL(triggered(bool)), this, SLOT(vScreenShot()));
При нажатии на графическом интерфейсе кнопки "Скриншот" сработает метод triggered, который повлечет за собой выполнение функции vScreenShot. Сразу смущает, что triggered имеет входной параметр bool, а функция не имеет - и при этом все работает. Вот и разногласие со справкой, а в справке попадаются нерабочие примеры примерно каждый сотый. А вот если функции vScreenShot сообщить входной параметр, отличный от bool - функция уже не отработает (не вызовется). В общем, только набиванием шишек эта концепция в голове откладывается правильным образом.

Даже если ломка пройдена - впереди ждут много глюков, и именно им посвящена лавина трехэтажного мата (выдержка из готовой программы по работе с платами ввода/вывода):
- проект не работает при нахождении в русскоязычной папке;
- галка "теневая сборка" при переносе проекта с ПК на ПК включается сама - должна быть выключена вручную после переноса, иначе будут проблемы с QFile;
- функции-заплатки для Qt представлены в файле qt.cpp, в т.ч. iMessageBox и dRound - т.к. стандартные работают коряво;
- иконка проекта выставляется в файле проекта, в DISTFILES +=: RC_ICONS += Icon.ico;
- в том же разделе прописывается версия проекта: VERSION=1.0.0.0 #Мажор, минор, релиз, билд;
- проверка на численность: QString::toFloat(&bCorrect);
- скрытие кнопки Maximize формы невозможно - решается фиксированными minimumSize, maximumSize;
- переименование любых файлов проекта производить только в среде программирования;
- жуткие проблемы с ui: чтобы он был виден в сторонних файлах - обязательно функция помещается в класс Form_Main,
а "Form_Main::" приписывается как префикс к функции в стороннем файле;
- при использовании connect число и тип параметров SIGNAL должно быть равно количеству и типу параметров SLOT. Указываются только типы входных параметров. Из-за этого приходится передавать параметры в виде глобальных переменных или создавать свой класс QConnect с нужными свойствами;
- при миграции проекта с Windows на Linux требуется соблюдение условий:
    - опция "Current Directory" в Projects->Manage Kits->Build & Run->General->Projets Directory должна быть изменена;
    - имя проекта не должно содержать скобок и должно заключаться в двойные кавычки;
    - добавление постфикса "-32" в строку Projects->Build Settings->Build Steps->Effective qmake call. Пример: qmake /home/Samokontrol_KPA_Linux/Samokontrol_KPA_Linux.pro -r -spec linux-g++-32 CONFIG+=debug.
- при миграции проекта с Linux на Windows требуется соблюдение условий:
    - имя проекта не должно содержать точек и должно заключаться в двойные кавычки;
    - часть библиотек может не скомпилироваться нормально, что ставит под угрозу саму задачу миграции;
    - Qt - НЕ КРОССПЛАТФОРМЕННАЯ СРЕДА! При миграции с Windows на Linux даже цвета у кнопок и радиобаттонов исчезли!
        Исправляется записью в main.cpp "qAppl.setStyle("windows");";
    - так и не удалось заставить корректно работать валидаторы (проверка диапазона).
        Частичную работу обеспечивает смена локали: "QLocale::setDefault(QLocale(QLocale::English, QLocale::CyrillicScript, QLocale::UnitedStates));";
        Т.к. InputMask некорректна в использовании при присвоении данных - поля остаются без валидации;
- QTimer способен срабатывать раньше своего периода! В теле функции таймера приходится его притормаживать.

Это лишь самые вопиющие из ошибок, не говоря уже о мелких. Все приводит к тому, что приходится потратить много времени, чтобы создать проект-пустышку, чтобы использовать для новых разработок. Qt.cpp, содержащий замену штатным глючным функциям. Необходимые строки в файле проекта и иных местах для обеспечения кросплатформенности ПО. И т.д.

Пока данная пустышка не выкладывается, т.к. для очистка существующего проекта потребуется время.

Итог: если переломаться и изучить эту среду - возможно, переход на нее даст плоды в будущем за счет той же бесплатности и допиленной кроссплатформенности. Однако когда таймер начал вызываться раньше своего периода - чаша терпения почти переполнилась.

(добавлено 23.08.2017) Забыл еще прикольные глюки этой среды, сегодня один такой долбанул:
- можно спокойно выйти за пределы статичного массива, не получив никаких сообщений типа Overflow - и в результате перестанет работать какой-нибудь QStringList, не имеющий к массиву никакого отношения;
- дебаггер отображает неверную информацию по unsigned long int, когда якобы 2 числа разные - а на деле они одинаковые. В итоге пришлось эти переменные записывать в файл - и только там они отобразились корректно.

(добавлено 25.09.2017) Что создание второй формы в проекте, что обмен данными между формами - нетривиален, неочевиден, непонятен. Нигде еще такого гемора не видел.

(добавлено 01.11.2017) Сделать программу, написанную в Qt, независимой от самой Qt - невозможно. Перенос библиотек .so в папку /usr/lib приводит лишь к тому, что ПО не запускается из-за отсутствия плагина XCB, входящего в состав Qt и недоступного для отдельного скачивания. Статическая линковка библиотек Qt (некоторые умельцы смогли-таки это сделать), со слов других программистов, является незаконной (неприменима к лицензиям GPL и LGPL). Поэтому на все ПК, использующие ПО на Qt, обязаны иметь установленную Qt.
Обновлено ( 01.11.2017 20:10 )
 
 

Последние новости

©2008-2017. All Rights Reserved. Разработчик - " title="Сергей Белов">Сергей Белов. Материалы сайта предоставляются по принципу "как есть". Автор не несет никакой ответственности и не гарантирует отсутствие неправильных сведений и ошибок. Вся ответственность за использование материалов лежит полностью на читателях. Размещение материалов данного сайта на иных сайтах запрещено без указания активной ссылки на данный сайт-первоисточник (ГК РФ: ст.1259 п.1 + ст.1274 п.1-3).