3.1 создание кнопки
В программах Qt одним из наиболее часто используемых элементов управления является кнопка.Сначала давайте посмотрим, как создать кнопку
QPushButton * btn = новый QPushButton; заголовочный файл #include
//Установить отца
btn->setParent(this);
//установить текст
btn->setText("Демасия");
// место перемещения
btn->move(100,100);
//Второе творение
QPushButton * btn2 = new QPushButton("Сунь Укун",это);
//Повторно указываем размер окна
this->resize(600,400);
//Устанавливаем заголовок окна
this->setWindowTitle("Первый элемент");
// ограничение размера окна
this->setFixedSize(600,400);
В приведенном выше коде кнопка на самом деле является объектом класса QPushButton.Если вы просто создаете объект, он не может отображаться в окне, поэтому нам нужно полагаться на родительское окно, то есть указать родителя для использования Функция setParent.Установите текст, отображаемый на кнопке, используя setText, переместите положение кнопки с помощью перемещения
Для окна мы можем изменить заголовок setWindowTitle верхнего левого окна, повторно указать размер окна: resize или установить фиксированный размер окна setFixedSize;
3.2 объектная модель(дерево объектов)
Когда объект создается в Qt, предоставляется указатель объекта Parent Давайте объясним, что делает родитель.
-
QObject организован в виде дерева объектов.
- Когда вы создаете объект QObject, вы увидите, что конструктор QObject получает указатель QObject в качестве параметра, и этот параметр является родительским, который является указателем родительского объекта.
Это эквивалентно,При создании объекта QObject вы можете указать родительский объект, и созданный нами объект QObject будет автоматически добавлен в список children() его родительского объекта.
-
- При уничтожении родительского объекта все объекты в этом списке также будут уничтожены. (Обратите внимание, что родительский объект здесь не является родительским классом в смысле наследования!)
Этот механизм весьма полезен в программировании с графическим интерфейсом. Например, кнопка имеет объект QShortcut (горячая клавиша) в качестве дочернего элемента. Когда мы удаляем кнопку, этот ярлык должен быть удален. Это разумно.
-
QWidget — это родительский класс всего, что может отображаться на экране.
- QWidget Унаследовано от QObject и, следовательно, также унаследовано это отношение дерева объектов. Дочерний компонент автоматически становится дочерним компонентом родительского компонента.. Следовательно, он появится в системе координат родителя, обрезанный границами родителя. Например, когда пользователь закрывает диалог, приложение удаляет его, затем, мы надеемся, что кнопки, значки и т. д., принадлежащие этому диалогу, должны быть удалены вместе. Это так, потому что это подкомпоненты диалога.
- Конечно,Мы также можем сами удалять дочерние объекты, и они автоматически удаляются из списка родительских объектов.Например, когда мы удаляем панель инструментов, главное окно, в котором она расположена, автоматически удаляет панель инструментов из списка подобъектов и автоматически настраивает отображение экрана.
Qt вводит понятие дерева объектов, которое в определенной степени решает проблему памяти.
- Когда объект QObject создается в куче, Qt также создает для него дерево объектов. Однако порядок объектов в дереве объектов не определен. Это означает, что порядок уничтожения этих объектов также не определен.
- Когда любой объект QObject в дереве объектов удаляется, если у объекта есть родитель, он автоматически удаляется из списка дочерних элементов () родителя; если есть дочерние элементы, каждый дочерний объект автоматически удаляется. Qt гарантирует, что ни один QObject не будет удален дважды, что определяется порядком уничтожения.
Qt поддерживает такое же поведение, если QObject создается в стеке. Как правило, это не должно быть проблемой. Взгляните на следующий фрагмент кода:
{
QWidget window;
QPushButton quit("Quit", &window);
}
window как родительский компонент и quit как дочерний компонент являются подклассами QObject (на самом деле они оба являются подклассами QWidget, который является подклассом QObject). Этот код правильный, деструктор quit не вызывается дважды, потому что стандарт C++ требует,Порядок уничтожения локальных объектов должен быть обратным порядку их создания.. Поэтому, когда этот код выйдет за пределы области видимости, он сначала вызовет деструктор quit, чтобы удалить его из списка дочерних объектов окна родительского объекта, а затем вызовет деструктор window.
Однако, если мы используем следующий код:
{
QPushButton quit("Quit");
QWidget window;
quit.setParent(&window);
}
Ситуация другая, и есть проблема с порядком уничтожения. Мы видим, что в приведенном выше коде окно, которое является родительским объектом, будет уничтожено первым, потому что это последний созданный объект. В процессе деструкции он будет вызывать деструктор каждого объекта в списке подобъектов, то есть quit в это время уничтожается. Затем код продолжает выполняться.После того, как окно будет уничтожено, quit также будет уничтожен, потому что quit также является локальной переменной, и, конечно, ее нужно уничтожить, когда она выходит за пределы области видимости. Однако это уже второй вызов деструктора quit, C++ не позволяет вызывать деструктор дважды, поэтому программа вылетает.
Из этого мы видим, что, хотя механизм дерева объектов Qt в определенной степени помогает нам решить проблему с памятью, он также вводит некоторые примечательные вещи. Эти детали, вероятно, время от времени будут всплывать в процессе дальнейшей разработки, чтобы беспокоить вас, поэтому лучше с самого начала выработать полезную привычку.В Qt старайтесь указывать родительский объект при построении, и смело создавайте его на куча.
3.3 Qtсистема координат окна
Принимая верхний левый угол за начало отсчета (0,0), X увеличивается вправо, а Y увеличивается вниз.
Для вложенных окон координатыотносительно родительского окнаГоворя о.