Създайте свои собствени джаджи QT
Когато започнах да се проучи Qt библиотеката. много полезно да се покаже един пример за една джаджа, която показва бягане линия. Такъв пример е описан в тази статия, ние ще се справим с него:
- сигнализация механизъм и Qt слотове;
- Qt организация на обекти в дървовидна структура осигурява автоматична deallocation фрактура родител обект;
- за обработка на събитието в Qt.
В резултат на това ние ще създадете свой собствен джаджа, и да го свържете към стандартните контроли.
Собствен Qt джаджа
QObject клас
Библиотеката Qt е набор от най-различните класове, много от тях са потомци на QObject клас. който ви позволява да:
- използва Qt сигнали и механизъм слотове;
- организира обекти в дървовидна структура;
- допълнителна информация за вида на обекта (обект мета данни);
- преместване на обекта в отделен поток [1];
- справят събития (QEvent);
- използвате вграден таймер QObject;
Механизъм сигнали и слотове Qt
Сигнали и механизъм Slots позволява обектите да комуникират. Например, промяната на текста в рамките на полето за въвеждане (QLineEdit) сигнал се генерира textChanged. които могат да се справят с всеки друг обект, с манипулатор функция се нарича слот. За да може в случай на управляващия сигнал, получи няколко слота, достатъчно, за да ги свържете свържете функция.
В примера, когато генериране на сигнал обект valueChanged speedSpinBox активиран слот setSpeed runline обект.
Един сигнал може да бъде свързан с няколко слота. сигнали и слотове механизъм дава възможност за чат обекти, разположени в различни потоци. Последният аргумент на метода може да бъде свързване тип връзка, която да позволява преминаването синхронните и асинхронните обработка на сигнали. типа на връзката по подразбиране Qt :: AutoConnection. означава асинхронна обработка, ако източникът и сигнален процесор се намира в един поток и синхронни (сигнали, натрупани в поточна линия), в противен случай. За да използвате този механизъм в началото на описанието на класа трябва да бъде Q_OBJECT макро.
Обява показва, че нашата работа линия има два слота, за да промените текста низ и скоростта на движение, но не генерира някакъв сигнал.
Автоматично събиране на боклука в Qt
При използване на Qt библиотеки обекти често образуват дървовидна структура с връзка "родител-дете". Всеки обект може да бъде назначен на родител, като се обадите setParent. получите списък с дъщерните предмети от деца или, например, да търсите чрез детето се противопоставя. Обикновено обект родител се предава като параметър конструктор дете обект.
С унищожаването на родителя, рекурсивно изтрива всички деца обекти. Понякога този процес се нарича автоматично събиране на боклука (както спомена заделяме ръце, и унищожи самите обекти).
В нашия пример създава основния прозорец (MainWidget клас), която включва първокласни обекти QSpinBox. QLineEdit и RunLine. Очевидно е, че инвестира QLineEdit няма смисъл "да напусне жив", след като основния прозорец е затворен, т.е. целия живот на полето за въвеждане не е по-къс от този на основния прозорец, така че основния прозорец може да бъде родител на обекта в съответствие с него. Ситуацията не винаги е толкова очевидно, когато за установяване на отношения "родител-дете" в Qt трябва да се ръководи именно от жизнения цикъл на обекти.
Диаграма използва Qt класове
findChild findChildren и методи позволяват да се намери детето се противопоставя сред тези, които се изисква да имат предварително определен тип и име (име може да се настрои метод setObjectName). Информация за вида и наименованието на обекта, се нарича мета-обект.
Информацията за мета-обект се използва също, например, когато се обаждате qobject_cast функция. проверка на обекта принадлежи към определен тип.
C ++ компилатор не знае нищо за имената на обекти (класове в C ++ проста структура), сигнали, слотове, събития и т.н. Във връзка с това, всеки път, когато я изпрати съставяне на Qt-програма, първо се подава на входа на компилатора мета-обект (MOC). която инициира МЕТА обекти и генерира код разбираемо обикновен компилатор.
за обработка на събитието в Qt
След работа с други библиотеки като WinAPI може да е трудно да се разбере разликата между сигнала и събитието, то е в източника на експозиция:
- Ако натиснете бутона, бутонът дръжки събитие (QKeyEvent / QMouseEvent, QTouchEvent търси от натиснат.), Бутонът генерира сигнал;
- ако имахме мишката върху прозореца, елементите по мишката, получени за това събитие QHoverEvent. В допълнение, за да се справят случай QPaintEvent. защото площ на прозореца под мишката е преобразена.
От тези примери става ясно, че сигналът обект трябва да бъдат генерирани при промяната на вътрешното състояние и събитието винаги идва от външната среда. Източникът на събитието може да бъде указател, както и бутона на мишката колело, клавиатура, сензорен екран, AC адаптер, или, например, системния таймер.
Когато получите събитията в приложението, то се простира толкова дълго, тъй като тя се обработва (ако има такъв обект, за да се справят с едно събитие, то трябва да го приемам метод, който да не се разпространи по-нататък).
Например, ние кликнали върху spinboksa бутона, събитието получава първата MainWidget. но тъй като лечение на него, той не може, тогава той преминава към подчинен елемент, кликването е направено, на която (при spinboksu) spinboks преминава бутона събитие, което обработва го и разговори приемат метод. генериране на сигнал, се натисне.
Пример отразява механизъм събитие обработка на същността, обаче, някои от междинните съединения също може да се справи събитието (в този случай, като се придвижи към т. Прекъсване на обработка и прехвърляне случай се обработва по-нататък). събитие виртуален метод може да се използва за изпълнение на такова поведение. В допълнение, обектът може да генерира събития и методи sendEvent postEvent.
Лично аз мисля, че генерирането на събития, които не е правилният подход. Може би трябва да се използва в някои много специфични случаи, не е възможно да се използват сигнали и слотове (не се виждат такива ситуации). няколко вида обработка събитие, както и събития от други обекти в метода преобразува кода на събитие в овесена каша и че не е добро. Използвайте събитията правилно.
таймер Обработка събития
Библиотеката Qt има 3 вида на таймер - построена през QObject, QTimer и QBasicTimer. Всички тези таймери подразбиране работят на нишката, в която те са били създадени, т.е. те не могат да работят по време на изпълнение на други кодове в тях ток, и по този начин, тяхната точност зависи от обема на работа и зърнистост (детайлност, сложността на функции) поток. Ако имате нужда от точност, таймерът трябва да бъде преместен в отделна нишка.
Най-удобния за тях е QTimer, се препоръчва да се използват официалните документи - тя генерира предварително определена честота на сигнала. По-подробно описание и пример за използване QTimer може да се намери в следващата статия [2].
QBasicTimer е ниско ниво, периодично (генерира събития нагоре, докато не бъде спрян) таймер. Всички интерфейсни таймери са 4 метод - isActive връща истина, ако таймерът работи, таймерът се връща timerId Identifier (необходима в случай манипулатор обект получава събития от различни таймери и трябва да се прави разлика между тях). Методи на спирката и пускане и спиране на таймера е започнало, съответно. метод стартът като аргументи за периода в милисекунди, което събития трябва да бъдат генерирани и указател към манипулатор на обект събитие, за което трябва да бъде преодоляно метод timerEvent.
Таймерите интерфейс, вградени в QObject е много прилича QBasicTimer. Те също са периодични и генериране на събития, а не сигнали. Започнете таймер реализира метод startTimer, който получава честотата и се връща на таймер за самоличност. Таймерът работи и генерира събития толкова дълго, докато не се разрушава от killTimer (приемане на идентификатор таймер като аргумент).
Нашата работа линия трябва да се премести на редовни интервали, за да отговаря на това изискване е най-удобно да се използва таймер. Прилагаме вграден таймер, за да дам един пример за обработка на събитието в Qt.
Създаване на Qt потребителски интерфейс
QWidget клас е основата за всички приспособления (контроли). Този клас съдържа множество полета и методи, например, методи за преоразмеряване или движещ се обект. Widgets могат да бъдат вложени (визуално, а не с монтаж отношението "родител-дете" обсъдено по-горе), контейнерът с джаджа може да използвате за управление на разположението (QLayout).
Обявата MainWidget дизайнер представени по-горе са използвани за управление на QGridLayout, което позволява да се постави вложени приспособления на мрежата, може да се използва в допълнение или QVBoxLayout QHBoxLayout (за поставяне приспособление в съответствие вертикално или хоризонтално, съответно). оформление мениджър контролира размера и позицията на вложени джаджи, когато размерът на джаджа контейнер. В допълнение, мениджърите могат да се настанят вложени. Поставете джаджи удобно визуално мишка, използвайки QtDesigner [2], но в тази статия ние наричаме addWidget ясно. В много от случаите, изрично употреба addWidget е възможно само, например, ако ние разработваме играта "Миночистач" и размера на игралното поле не е известен предварително.
метод addWidget QGridLayout клас отнема като аргументи на втория и третия координатите на горния ляв клетка от таблицата, в която да поставите джаджа е посочено в първия аргумент. Последните две са аргументите на броя на клетките вертикално и хоризонтално, което ще се приспособлението.
В обявите горе, може да забележите, че палатка клас наследява QLabel и призовава метод му setText. QLabel клас е предназначен за показване на текст или изображения е подклас на QFrame.QLabel тя ви позволява да използвате HTML тагове за съдържание дизайн, обаче, в тази статия използва само методът на setText (), за да зададете показва текста.
Клас QFrame простира QWidget способността да се покаже граница около една джаджа и е основа за контролите, които изискват специална конструкция. Наследници QFrame клас са, например, лентата с визуални елементи (QToolBox), превъртете джаджа видове (QAbstractScrollArea) или показване на текст / изображение джаджа (QLabel).