Alt linux Программирование на языке С++ в среде Qt Creator Е. Р. Алексеев, Г. Г. Злобин, Д. А. Костюк, О. В. Чеснокова, А. С. Чмыхало Москва alt linux 2015



Download 5,27 Mb.
Pdf ko'rish
bet175/193
Sana24.02.2022
Hajmi5,27 Mb.
#227496
1   ...   171   172   173   174   175   176   177   178   ...   193
Bog'liq
Book-qtC


Глава 14. Создание элементов графического интерфейса
Рис. 14.1: Анализ памяти с помощью Valgrind.
Это происходит из-за того, что для lSomeWidget была выделена динамиче-
ская память, но не была корректно высвобождена с помощью оператора delete.
Для того, чтобы корректно освободить память, модифицируем последние строки
программы:
i n t e x i t C o d e = l A p p l i c a t i o n . e x e c ( ) ;
//(1) Память в динамически-распределяемой памяти (heap)
delete lSomeWidget ;
return e x i t C o d e ;
Скомпилируем программу — после повторного анализа сообщение об утечке
памяти исчезнет. Конечно, в этом примере утечка памяти не приводит к нега-
тивным последствиям. Выделение памяти происходит только раз и после завер-
шения работы вся использованная оперативная память высвобождается опера-
ционной системой. Но в крупных проектах утечки памяти могут стать серьёзной
проблемой. Инструменты для анализа памяти, такие как Valgrind, позволяют
локализовать и исправить их.
Можно выделить память для родительского объекта в стеке. Память для
объектов, созданных в стеке, освобождается автоматически как только объект
выходит за пределы области видимости. Поэтому объекты, созданные в стеке,
удаляются как только они выходят из области видимости. Для того, чтобы осво-
бодить память автоматически, достаточно только родительский объект создать в
стеке. Как только родительский объект удаляется, будут автоматически удалены
и все дочерние объекты. Мы можем модифицировать последний пример таким
образом, чтобы память для родительского объекта была выделена в стеке. Для
этого закомментируйте все части программы обозначенные (1) и измените текст
программы:
//(2) Память в стеке
SomeWidget lSomeWidget ;
//Задаём родительский виджет с помощью конструктора
QLabel ∗ l L a b e l = new QLabel(&lSomeWidget ) ;
//Задаём родительский виджет с помощью метода QObject : : s e t P a r e n t ( )
QPushButton ∗ lPushButton = new QPushButton ;
lPushButton−>s e t P a r e n t (&lSomeWidget ) ;
. . . . .
//(2) Память в стеке
lSomeWidget . r e s i z e ( 1 5 0 , 5 0 ) ;
lSomeWidget . show ( ) ;
При описании собственных классов необходимо учитывать следующие реко-
мендации:
Программирование на языке С++ в среде Qt Creator


14.3. События (Events). Обработка событий (Event handling)
383
• задавать для конструкторов класса параметр, который принимает указа-
тель на родительский объект и имеет значение по умолчанию 0;
• создавать дополнительный конструктор, который принимает только пара-
метр с указателем на родительский объект;
• параметр с указателем на «родителя» желательно должен быть первым па-
раметром среди параметров со значением по умолчанию (если параметров
со значением по умолчанию несколько);
• используйте ключевое слово this как указатель на родительский объект
при создании объектов внутри своего класса. Например:
#include 
c l a s s CustomWidget : public QWidget
{
Q_OBJECT
public :
e x p l i c i t CustomWidget ( QWidget ∗ p a r e n t = 0 ) ;
} ;
//Конструктор
CustomWidget : : CustomWidget ( QWidget ∗ p a r e n t ) : QWidget ( p a r e n t )
{
//Задаём родительский виджет — t h i s то есть экземпляр класса CustomWidget
QPushButton ∗ lPushButton = new QPushButton ( t h i s ) ;
lPushButton−>setGeometry ( 5 0 , 5 0 , 2 0 0 , 3 0 ) ;
}
14.3
События (Events). Обработка событий (Event handling)
В Qt существует механизм, который позволяет обрабатывать различные собы-
тия, происходящие в системе и в самой программе. Визуальные элементы поль-
зовательского интерфейса получают события от устройств ввода информации,
которыми управляет пользователь: мышки, клавиатуры и т.п.. Также события
могут поступать от объектов изнутри приложения. Таким образом бывают:
• события, возникшие спонтанно и поступающие от оконной системы, такие
как нажатие клавиш, движения мышкой, манипуляции с окном программы
(spontaneous events);
• события, отправленные изнутри программы, созданные объектами в про-
грамме и направленные в цикл обработки событий (posted events) или на-
прямую к другому объекту (sent events).
Спонтанные события и большинство внутренних событий поступают в цикл обра-
ботки событий (event loop). Этот цикл последовательно рассматривает каждое
из событий и отправляет на обработку конкретному объекту. Каждый объект
в свою очередь имеет возможность обрабатывать событие, которое поступает к
нему.
Каждое событие в Qt существует в виде объекта, унаследованного от QEvent.
Когда событие поступает на обработку, то для объекта-обработчика выполняет-
ся виртуальный метод QObject::event(). Этот метод обычно вызывает другой
метод-обработчик события, который для большинства событий является отдель-
ным. Это необходимо для удобства и гибкости, поскольку таким образом есть
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.


384
Download 5,27 Mb.

Do'stlaringiz bilan baham:
1   ...   171   172   173   174   175   176   177   178   ...   193




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish