Подробно обяснение изготвяне на джаджа през qpaintevent

Поради големия брой на подобни въпроси от начинаещи до използвайте QPainter. и хората се чудят "как да се направи нещо свое на джаджа", мога да се регистрирам за основните понятия за рисуване.

Нека започнем с основното правило - да се възползва от джаджа можете да пренебрегнете неговия метод paintEvent (QPaintEvent *).

Причината за първостепенни преначертаване този код работи в тази функция, ще се стартира всеки път, когато това е необходимо, за да прехвърлите показването на приспособлението. Преначертае, в действителност, трябва да се случва много често - когато промените геометрията на джаджа (например, ние се протегна през прозореца, а с него и протегна нашата джаджа), когато приспособлението е покрит / perestaot_perekryvatsya / izmenilos_perekryvanie други джаджи - това са основните причини за автоматична пребоядиса повикване.

Между другото, автоматична пребоядисване разговор не винаги е достатъчно, но самите ние може да доведе до пребоядисване, като се обадите на метода на актуализация () за приспособлението.

Обобщавайки, можем да кажем следното: ако искаме да се направи нещо на джаджа - ние трябва да създадете своя собствена джаджа, и да го замени метод paintEvent (QPaintEvent *). След това, ние създаваме обект от нашия клас.

1. Създаваме джаджа, която ви позволява да се направи за себе си:

#ifndef QPAINTWIDGET_H
#define QPAINTWIDGET_H

клас QPaintWidget. обществен QWidget
<
Q_OBJECT
публично.
QPaintWidget (QWidget * майка = 0);
защитени.
анулира paintEvent (QPaintEvent *);
>;

QPaintWidget. QPaintWidget (QWidget * родител). QWidget (изходен)
<
>

анулира QPaintWidget. paintEvent (QPaintEvent *) <
QPainter р (това); // създаване на нов обект художник
стр. setPen (Q-pen (Qt червено 1. Qt SolidLine) ...); // Рисуване Настройки
стр. drawLine (0. 0. ширина (), височина ()); // тегли чертата
>

p.setPen (Q-pen (Qt :: червено, 1, Qt :: SolidLine)); - Адаптивни рисунка. по-скоро се каже, че е необходимо да се направи червени плътни линии 1 пиксел.

p.drawLine (0,0, ширина (), височина ()); - начертаете линия от точката (0,0) (по подразбиране е в горния ляв ъгъл на програмката, но това може да се променя) до точката с координати (ширина, височина).

В резултат на това ние dobomsya, че имаме на джаджа винаги ще привлече диагонал червена линия.


2. Малко обяснение на координатната система:

По подразбиране джаджа има координатна система с произхода в горния ляв ъгъл ((0,0)). X ос отнася до право, Y ос е насочена надолу. Въпреки това, винаги можете да промените функцията setWindow () - детайли QtAssistant.


3. Остава да се създаде обект от нашия клас.

Аз създадох един проект със стандартен прозорец MainWindow. Тогава той сложи на вертикалната му оформление (но, разбира се, може да бъде всеки на всички - това е просто за удобство на само един от начините да поставите джаджа на друга джаджа), който ще постави нашата джаджа в нея.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

// наш клас
#include "qpaintwidget.h"

пространство от имена Ui <
клас MainWindow;
>

клас MainWindow. обществен QMainWindow <
Q_OBJECT
публично.
MainWindow (QWidget * майка = 0);

защитени.
анулира changeEvent (QEvent * д);

частни.
Ui. MainWindow * UI;

// указател към обект от нашия клас
QPaintWidget * WGT;
>;

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow. MainWindow (QWidget * родител).
QMainWindow (изходен),
UI (нов UI. MainWindow)
<
UI -> setupUi (това);

// Създаване на графичен
WGT = нов QPaintWidget (това);

// И ние го поставете в layaut
UI -> verticalLayout -> addWidget (WGT);
>

MainWindow ()
<
// почиства
WGT -> deleteLater ();
изтриване на потребителския интерфейс;
>

нищожен MainWindow. changeEvent (QEvent * д)
<
QMainWindow. changeEvent (д);
превключвател (д -> тип ()) <
При QEvent. LanguageChange.
UI -> retranslateUi (това);
прекъсване;
подразбиране.
прекъсване;
>
>

Какво се случва? Cozdaotsya джаджа QPaintWidget * WGT. контролира размера на оформлението. Веднага след като имаше размер на климата, джаджа се нарича paintEvent метод (QPaintEvent *), в която ние в тази джаджа, да диагонала в червено.

Разбира се, това е достатъчно рядко. Ако наистина искаме нещо да се направи за една джаджа (например, графики), а след това в хода са малко по-различни алгоритми.

5.1. В нашата джаджа обект QImage създаде и пишат размери синхронизация функция на анализа на процесите на размерите на приспособлението. Това ще бъде нашата т.нар, Back Buffer - на фона на буфера да рисува.

5.2. Когато имаме нужда от нещо, което да се направи - ние го направи на тази "картина". Рисуване може да отнеме дълго време, може да бъде кратък - можем да направим този код в отделна нишка - не е проблем. Просто в резултат на потока ще QImage обект, за да се боядиса всичко, което е необходимо (за сега ще се изчислява и е съставен - ние ще надуеш процентът на напредък).

5.3. Ако е необходимо, ние привличаме веднъж привлече фон буфер в нашия джаджа (QImage обекта, където всичко е съставен имаме нужда) метод QPainter :: drawImage (.) Вътрешна paintEvent функция (QPaintEvent *). По този начин, ние dobomsya какво ще се прави е гладко и не изтеглите основния поток.

Надявам се, че тази малка HOWTO ще намали драстично броя на въпросите, чрез теглене на QPainter.