Хань Юаньсюй, Юй Чэн, Шэнь Кайян
Введение в Qt
Qt — это кроссплатформенная среда приложений C++ с графическим интерфейсом. Еще в 1991 г. два партнера Trolltech приступили к разработке такой платформы, а в 2008 г. компания Nokia, которая была в самом разгаре, с оптимизмом смотрела на потенциал Qt в области встраиваемых систем и потратила много денег на ее приобретение в качестве основного продукта. носитель нового поколения операционных систем для смартфонов.Из-за поражения Nokia на рынке смартфонов Qt пришлось отпустить, и, наконец, Qt был продан последним владельцем в 2012 году.DigiaПоглощения. После нескольких лет разработки Qt не только имеет полную графическую библиотеку C++, но и значительно улучшает способность Qt разрабатывать кросс-платформенные приложения.
Qt может одновременно поддерживать разработку настольных приложений, встроенных и мобильных приложений, и даже может выполнять мобильную разработку, охватывающую все существующие основные платформы. Вам нужно только один раз написать код и перекомпилировать его перед выпуском на другую платформу.
Какие продукты разрабатываются с помощью Qt?
Благодаря набору библиотек графического интерфейса и богатым API-библиотекам, которые поддерживают собственные платформы Windows, Mac, Linux и другие, Qt является хорошим выбором для разработки кроссплатформенных настольных приложений. В отличие от некоторых отличных настольных программ в Китае, которые предпочитают разрабатывать мультиплатформенные библиотеки GUI самостоятельно, многие отличные настольные приложения за границей предпочитают использовать для разработки кроссплатформенные библиотеки GUI. Например, в Кремниевой долине есть известное приложение для управления документами.DropBox, собственный инструмент социального чата MicrosoftSkype,картинаЖажда СкоростиСтраница с графическим интерфейсом такой большой игры и даже офисное программное обеспечение, выпущенное отечественной компанией-разработчиком программного обеспечения Kingsoft.WPS Office, и конечно нашAlphaBox.
Почему AlphaBox выбрала Qt?
Потому что Qt может не только эффективно выполнять разработку контента GUI на разных платформах, но и эффективно выполнять некоторые задачи на системном уровне. Вот почему AlphaBox решила использовать Qt для разработки.
AlphaBoxНа самом деле он содержит два основных процесса, один из которых является механизмом диска синхронизации — базовый процесс синхронизации, построенный на языке C, мы называем егоdaemon; Остальные графические страницы и модули, взаимодействующие с операционной системой, разрабатываются с помощью Qt. Богатые кросс-платформенные компоненты графического интерфейса, предоставляемые Qt, могут гарантировать, что в различных операционных системахAlphaBoxОба красивы и соответствуют стилю операционной системы собственного производства Qt.IDE — Создатель QtОн предоставляет набор очень простых в использовании инструментов графического интерфейса. Даже новичок, который новый для Qt, может легко нарисовать нужную страницу и завершить логику основной страницы. Кроме того, благодаряC++К счастью, Qt имеет очень надежный механизм связи с операционной системой.AlphaBoxОн может легко выполнять такие операции, как точный мониторинг изменений файлов в операционной системе и создание локальной базы данных для записи данных.Objective-C,C#Другие языки смешиваются для достижения вызовов расширений системного уровня, что мы и можем сделать вFinderа такжеWindowsПричины разного состояния файлов синхродиска можно посмотреть в диспетчере ресурсов.
Преимущество QT
Отличные кроссплатформенные характеристики
Поддержка QTWindows,Linux/Unix,Mac OS X,Android,BlackBerry,QNXи другие платформы, а также обеспечивает единую среду разработки для этих различных платформ.
объектно-ориентированный
C++ полностью объектно-ориентирован, что очень похоже на разработку Objective-c. А Qt является расширением языка, основанного на C++.Все мы знаем, что C++ имеет много преимуществ, таких как скорость, простота и объектная ориентация, поэтому Qt естественным образом наследует преимущества C++.
Хороший механизм инкапсуляции Qt делает Qt очень модульным и многоразовым, что очень удобно для пользователей при разработке и доставке товаров. Qt предоставляет безопасный тип для сигналов/слотов (сигналов и слотов) вместо обратного вызова, что упрощает работу друг с другом.
Богатый API
Qt включает более 250 классов C++, а также предоставляет коллекции на основе шаблонов, сериализацию, файлы, устройства ввода/вывода, управление каталогами, классы даты/времени. Он даже включает обработку регулярных выражений.
Поддержка рендеринга 2D/3D графики, поддержка OpenGL.
Обширная документация по разработке.
Поддержка XML
Интеграция механизма Webkit может обеспечить бесшовную интеграцию локального интерфейса и веб-контента, Но что действительно выделяет Qt среди множества виджетов в мире свободного программного обеспечения (таких как Lesstif, Gtk, EZWGL, Xforms, fltk и т. д.), так это тяжеловесное программное обеспечение KDE, основанное на Qt.
Сигнально-щелевой механизм
Qt предоставляетСигнала такжеканавкаМеханизмы выполнения операций в ответ на совещание, любой механизм связи для завершения двух объектов QT. При этом сигнал будет касаться определенной ситуации или действия, он эквивалентен приемной канам и функции обработки сигналов.
Почему метод не вызывается напрямую. используется в серединеSignalа такжеканавкаМеханизм не лишний?
На самом деле так и в нашей жизни.С начальником легко разговаривать, а начальник ставит задачи помощникам.Но помощники ставят задачи начальнику, и вы можете себе представить какие будут последствия.В предыдущем постановлении класс, такое определенно не должно было случиться. Поэтому в многоуровневой идее функции, которые мы вызываем, тоже такие.Верхний слой может вызывать функции нижнего слоя и того же слоя, но функция нижнего слоя не может вызывать функцию верхнего слоя, иначе иерархия программы будет нарушена, в результате чего получится сложная структура, которую трудно поддерживать и управлять.
Итак, как мы можем достичь управления вверх?Что, если есть задачи, возложенные на босса?
Босс настроит организацию, то есть функцию, которая использует бесконечный цикл для запроса статуса помощника.Если помощнику действительно есть чем заняться, организация передаст новость начальнику для обработки. Но этот метод обработки немного сложен, простой и понятный способ, который мы хотим, состоит в том, что если у помощника есть событие, он может напрямую调用
Обработка функций босса.
Сказав так много, я на самом деле хочу сказать, что самое большое преимущество сигналов и слотов заключается в том, что они улучшают идею расслоения программы,Вызов с нижнего уровня на верхний может быть выполнен без изменения иерархии программы.. излучатьSignal, то верхний слой хочет ассоциироваться с нимSlotФункция ответит.
Теперь проблема с сигналами и слотами:
- Объект, отправляющий сигнал, отвечает только за отправку, но не знает, кто получит сигнал;
- Слот в самом объекте-получателе — это просто обычная функция-член, она не знает, на какой сигнал реагировать;
Для решения вышеперечисленных задач необходимо подключить соответствующие сигналы и слоты. Когда указанный сигнал излучается, объект, в котором расположен слот, может получить сигнал и вызвать соответствующую функцию слота для выполнения указанной обработки.
Как подключить сигналы и слоты
1. Сигнал может быть подключен к другому сигналу
connect (Object1,SIGNAL(signal1),Object2,SIGNAL(signal2));
Представляет Object1Сигнал 1Отправить может вызвать Object2Сигнал 1Отправить.
2. Один и тот же сигнал можно подключить к нескольким слотам:
connect (Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));
connect (Object1,SIGNAL(signal2),Object3,SIGNAL(slot1));
3. Один и тот же слот может реагировать на несколько сигналов:
connect (Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));
connect (Object3,SIGNAL(signal2),Object2,SIGNAL(slot2));
4. Соединение можно удалить:
Этот случай редко используется, потому что при удалении объекта Qt автоматически удаляет все соединения, связанные с этим объектом.
disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
Тем не менее, наиболее часто используемые способы подключения:
connect (Object1,SIGNAL(signal),Object2,SIGNAL(slot));
в,signal– сигнал объекта Object1,slotСлот для Объекта2.
####намекать: Механизм сигналов и слотов аналогичен вызову обычных функций, при неправильном использовании он также может генерировать бесконечный цикл во время выполнения программы. Следовательно, при определении функции слота необходимо соблюдать осторожность, чтобы избежать косвенного образования бесконечного цикла, то есть повторной передачи того же сигнала, полученного в слоте.
Если сигнал связан с несколькими слотами, порядок, в котором связанные слоты активируются при испускании сигнала, будет случайным.
Определения макросов нельзя использовать вsignalа такжеslotв параметрах.
Количество и тип параметров для сигналов и слотов должны быть одинаковыми.
Преимущества сигнального и слотового механизма
безопасность типа
Сигнатуры связанных сигналов и слотов должны быть эквивалентны. То есть тип параметра и номер параметра сигнала совпадают с типом параметра и номером параметра слота, принимающего сигнал. Однако количество параметров слота может быть меньше количества параметров сигнала, но отсутствующий параметр должен быть последним одним или несколькими параметрами параметра сигнала. Если сигнатуры сигнала и слота не совпадают, компилятор сообщит об ошибке.
слабо связанный
Механизм сигналов и слотов значительно уменьшает связь объектов Qt. Объекту Qt, отправляющему сигнал, не нужно знать, какой объект получает его сигнал, все, что ему нужно сделать, это послать сигнал в соответствующее время, и ему не нужно знать или заботиться о том, получен ли его сигнал, не говоря уже о том, чтобы знать, какой слот какого объекта получил сигнал.
Точно так же слоты объектов Qt не должны быть связаны с тем, какие сигналы связаны сами с собой.Если сигналы и слоты связаны, Qt может гарантировать, что будет вызван соответствующий слот. Даже если связанный объект удаляется во время выполнения. Приложение тоже не вылетает.
Эффективность сигнала и слота
Механизм сигналов и слотов повышает гибкость связи между объектами, конечно, при увеличении гибкости будет определенная потеря производительности. По сравнению с вашей функцией обратного вызова механизм сигналов и слотов работает немного медленнее. В общем, вызов функции слота путем передачи сигнала будет работать в 10 раз медленнее, чем прямой вызов невиртуальной функции.
причина:
- Объект, принимающий сигнал, должен быть локализован.
- Безопасно пройти все ассоциации.
- Упорядочивание/рассортировка переданных аргументов.
- при многопоточности. Сигналы могут быть поставлены в очередь.
Однако по сравнению с новой операцией создания объектов кучи и операцией удаления объектов кучи текущая стоимость сигналов и слотов составляет лишь часть их стоимости. Ущерб производительности, вызванный механизмом сигналов и слотов, незначителен для приложений реального времени; он того стоит по сравнению с гибкостью и простотой, которые обеспечивают сигналы и слоты.
Введение в систему компоновки Qt
система компоновки
Как разработчик iOS, я был свидетелем постоянного совершенствования системы верстки iOS, от абсолютной верстки, автоматического изменения размера до автоматической верстки, что делает эффективность работы разработчика все выше и выше, а интерфейс проекта становится все более читабельным и простым в обслуживании. , инструменты визуального интерфейса в IDE очень мощные. Многие пользователи сети «в шутку» называют разработчиков iOS «мастерами перетаскивания пользовательского интерфейса». Видно, что система макета интерфейса в разработке iOS эффективна. Таким образом, миссия отличного макета система позволяет разработчикам тратить меньше времени на создание более удобного в сопровождении интерфейса.
Аналогичным образом, в Qt система обеспечивает мощный наборной механизм для макета и набирает представления в окне. После предварительного исследования макета QT я должен выразить свое восхищение простотой, эффективностью и мощностью системы макета QT.
Особенности системы раскладки
В Qt систему компоновки можно сделать
- Расположение дочерних элементов управления
- Получить размер формы по умолчанию
- Получить минимальный размер формы
- Верстка и верстка при изменении размера формы
- Макет и макет при изменении содержимого (размер шрифта текста и т.д., скрыть или показать, удалить)
Структура системы компоновки
Qt предоставляет класс QLayout и его подклассы для компоновки интерфейса.Структура следующая:
QLayout — это абстрактный базовый класс в системе компоновки, унаследованный от QObject и QLayoutItem, четыре подкласса которых
- QBoxLayout (макет коробки)
- QFormLayout (макет формы)
- QGridLayout (сетка)
- QStackedLayout (макет стека)
В реальных сценариях использования часто бывает необходимо объединить несколько макетов для завершения дизайна интерфейса, Далее четыре макета будут представлены отдельно.
Макет блока QBoxLayout
Блочная компоновка предоставляет два подкласса для работы с компоновкой горизонтального (QHBoxLayout) и вертикального (QVBoxLayout) направлений, которые могут отображать представления в строке или столбце.Проще говоря, это позволяет размещать элементы управления, например, в нашем AlphaBox верхний аватар, имя и кнопка обновления выстроены в линию, это горизонтальный макет блока:
Думаете, я буду говорить о том, как реализовать эту штуку? Нет, я просто хочу взять в качестве примера вертикальную компоновку блоков и использовать самый простой пример, чтобы представить использование макета блоков. Во-первых, создайте QWidget на основе интерфейса и добавим, что нам нужно использовать файл заголовка:
#include <QVBoxLayout>
#include <QPushButton>
и добавьте следующий код в конструктор
// 添加两个按钮
QPushButton *okBtn = new QPushButton;
okBtn ->setText(tr("我在上面, 我最牛"));
QPushButton *celBtn = new QPushButton;
celBtn->setText(tr("我在下面, 我不服"));
// 创建一个垂直箱式布局, 将两个按钮扔进去
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(okBtn);
layout->addWidget(celBtn);
// 设置界面的布局为垂直箱式布局
setLayout(layout);
Запустите его, чтобы увидеть эффект, что? Это работает? Что с координатами? Что с размерами?
Две кнопки двигались вверх-вниз и послушно встали в вертикальном направлении, настолько они мощные и беззаботные.
Макет формы QFormLayout
Мощный AlphaBox очень общителен и может легко делиться вашими данными с другими пользователями.Когда мы поделимся, будет такой интерфейс:
Увидев этот интерфейс, вы можете подумать, что это очень просто, можно реализовать несколько горизонтальных макетов блоков, но более умный Qt предоставляет более эффективный способ помочь вам завершить такой интерфейс, то есть QFormLayout.
В книгах, которые я использовал для изучения Qt, я переводил QFormLayout в макет формы.Я лично думаю, что более уместно перевести его в макет формы, потому что мощь QFormLayout заключается в том, что он может завершить работу пользователя с самой быстрой скоростью. Построение интерфейса формы ввода.
Итак, давайте демистифицируем AlphaBox и посмотрим, как реализован такой интерфейс.
Сначала перетащите макет формы в виджет.
Дважды щелкните, чтобы добавить строку в форму.
Я считаю, что когда вы видите это изображение, вы уже можете понять, как используется макет формы, предоставляя метки в качестве ориентиров для пользовательского ввода и предоставляя типы полей в качестве элементов управления для пользовательского ввода.Как разработчик iOS, я знаю такой интерфейс. утомительный объем работы, необходимый для его создания.Когда я впервые открыл этот интерфейс, я был ошеломлен тем, как интерфейс был создан таким образом.
- В соответствии с рисунком создайте первую строку формы, с которой будет совместно использоваться поле ввода пользователя, и вы можете заполнить текст-заполнитель для поля ввода.
- Дважды щелкните макет формы, чтобы создать строку с типом поля QComboBox (множественное поле выбора) Заполните разрешенные разрешения.
- Установите для всего макета виджета вертикальный макет блока
- Перетащите горизонтальный макет под макет формы (горизонтальный макет)
- Добавьте горизонтальную прокладку в макет блока и перетащите две кнопки, чтобы завершить макет интерфейса.
Быстро или нет? Быстро или нет! Быстро или нет!!!
Точно так же, если вы используете макет формы с чистым кодом, вы можете использоватьaddRow()
метод добавления строки.
Макет сетки QGridLayout
Фактически, мощный AlphaBox такой, мы можем поделиться им с несколькими пользователями, и ниже будет список, показывающий список общих пользователей и разрешений.В настоящее время макет формы не может нас удовлетворить, и у нас есть попросить новый любимый QGridLayout - макет сетки.
Макет сетки, как следует из названия, может делить интерфейс на строки и столбцы для управления макетом и размещать элементы управления в каждой ячейке.Две строки и три столбцаРеализована сетка.
Конечно, для более сложных интерфейсов эффективность использования раскладки Qt тоже очень высока.Я сделал демонстрацию раскладки для обмена внешними ссылками, которая умеет генерировать ссылку для скачивания внутренних данных и делиться ею с кем угодно для скачивания.
В этом интерфейсе я использовал макет сетки на вкладке, макет показан на рисунке:
Как видно из рисунка, компоновка сетки так же проста, как манипулирование Excel, расположение ячеек, объединение ячеек и т. д.
В этом интерфейсе свойства QLayout используются более гибко для завершения компоновки и компоновки интерфейса.
Точно так же в коде вы можете использовать следующие API для добавления элемента управления в представление сетки, которое занимает несколько строк и столбцов, начиная с нескольких строк и столбцов:
void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan)
Макет стека QStackedLayout
Например, в AlphaBox мы можем напрямую просматривать облачные файлы и управлять ими через браузер облачных файлов.В процессе загрузки будет интерфейс для поворота хризантем.
Сообщение об ошибке при сбое загрузки:
и когда загрузка прошла успешно:
Обычно интерфейс приложения будет иметь разное содержимое в зависимости от разных состояний, тогда вы можете использовать макет стека QStackedLayout, макет стека обеспечивает стек страниц, каждая страница имеет полностью независимый макет интерфейса.Это может быть очень ясно для интерфейса разных состояний для управление макетом.
В инструменте визуального макета Qt компоновка стека интерфейса завершается с помощью Stacked Widget.
Щелкните правой кнопкой мыши для выполнения таких операций, как вставка, удаление и сортировка страниц.
наконец
В следующей статье мы начнем с создания проекта и более подробно расскажем о разработке Qt по модулям, так что следите за обновлениями!