<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF82:Qt/KDE - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF82:Qt/KDE&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Wed, 13 May 2026 23:45:03 GMT</lastBuildDate>
		<item>
			<title>Yaleks: викификация</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF82:Qt/KDE&amp;diff=5984&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация&lt;/p&gt;
&lt;a href=&quot;http://wiki2.linuxformat.ru/index.php?title=LXF82:Qt/KDE&amp;amp;diff=5984&amp;amp;oldid=5983&quot;&gt;(Различия между версиями)&lt;/a&gt;</description>
			<pubDate>Sun, 14 Dec 2008 13:45:26 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF82:Qt/KDE</comments>		</item>
		<item>
			<title>Yaleks: Новая: {{Цикл/Qt/KDE}} == Создаем стандартное KDE-приложение == ''ЧАСТЬ 5 Сегодня '''Андрей Боровский''' расскажет вам, к...</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF82:Qt/KDE&amp;diff=5983&amp;oldid=prev</link>
			<description>&lt;p&gt;Новая: {{Цикл/Qt/KDE}} == Создаем стандартное KDE-приложение == ''ЧАСТЬ 5 Сегодня '''Андрей Боровский''' расскажет вам, к...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/Qt/KDE}}&lt;br /&gt;
== Создаем стандартное KDE-приложение ==&lt;br /&gt;
''ЧАСТЬ 5 Сегодня '''Андрей Боровский''' расскажет вам, как создаются настоящие KDE-приложения. Ну, или почти настоящие...''&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
|Если в чем-то уверен – проверь еще раз.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;Девиз параноика.&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Изображение:Img 82 98 1.jpg|thumb|Рисунок 1. Программа “images”.]]&lt;br /&gt;
В прошлый раз мы научились создавать простейшие&lt;br /&gt;
KDE-приложения, а также выполнять переводы приложений&lt;br /&gt;
KDE на разные языки. Было показано, как можно заставить&lt;br /&gt;
наше приложение использовать ресурсы другого приложения и как&lt;br /&gt;
добавлять переводы к уже существующим программам. В принципе,&lt;br /&gt;
изложенных навыков достаточно, чтобы заново выполнить перевод всей&lt;br /&gt;
среды KDE (сделать, например, перевод с особым цинизмом). Однако,&lt;br /&gt;
приложения из прошлой статьи не выполняли никакой полезной работы,&lt;br /&gt;
в том числе потому, что у них отсутствовал сколько-нибудь развитый&lt;br /&gt;
пользовательский интерфейс. В этой статье мы не будем заниматься&lt;br /&gt;
переводами (если захотите, можете выполнить их сами), зато напишем&lt;br /&gt;
«почти настоящее» приложение KDE, использующее меню, панель быстрого доступа и другие интерфейсные элементы, предоставляемые KDE.&lt;br /&gt;
Наше приложение «почти» (а не совсем) настоящее потому, что оно все&lt;br /&gt;
еще игнорирует некоторые важные функции среды KDE, однако его уже&lt;br /&gt;
можно использовать в практических целях. Работающее приложение&lt;br /&gt;
(исходные тексты вы найдете на диске) выглядит вполне серьезно (рис.&lt;br /&gt;
1). Программа позволяет просматривать графические файлы, а также&lt;br /&gt;
применять к изображениям преобразования: из цветного в черно-белое,&lt;br /&gt;
изменение контраста и интенсивности (соответствующая функция называется именно так – intensity).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img 82 99 1.png|thumb|Рисунок 2. Взаимодействие классов приложения.]]&lt;br /&gt;
Мы начнем разработку нашего приложения в среде KDevelop, используя заготовку Application framework (надеюсь, вы помните, как ее&lt;br /&gt;
найти). Назовем наш проект images. В результате выполнения соответствующего мастера будет создана директория images с поддиректориями&lt;br /&gt;
и много файлов .cpp, .h и других типов. Это обилие может напугать начинающего программиста, но на самом деле все не так страшно. Application&lt;br /&gt;
framework представляет собой заготовку классического офисного приложения KDE. У него есть строка меню, панель быстрого доступа, строка&lt;br /&gt;
состояния и центральная область, которая используется для ввода/вывода данных (в терминологии «офисного» программирования эта область&lt;br /&gt;
называется представлением (view). Все эти элементы в нашем приложении уже присутствуют. Самые важные и интересные файлы для нас&lt;br /&gt;
– images.h/cpp и imagesview.h/cpp. Эти файлы содержат определения классов images и imagesView соответственно. Имя первого класса&lt;br /&gt;
совпадает с именем проекта и приложения, имя второго класса получено&lt;br /&gt;
из первого добавлением View. Класс images является потомком класса&lt;br /&gt;
KMainWindow, реализующего главное окно офисного приложения. Окно&lt;br /&gt;
KMainWindow позволяет легко управлять такими элементами интерфейса как главное меню, панель инструментов, строка состояния и, конечно, представление. Представление реализовано в классе imagesView.&lt;br /&gt;
Объект класса images выполняет роль главного визуального элемента&lt;br /&gt;
для объекта app, класса KApplication. Объект app объявлен в файле&lt;br /&gt;
main.cpp, в котором реализована функция main() нашего приложения&lt;br /&gt;
(нам не нужно модифицировать этот файл). Объекты menuBar, toolBar&lt;br /&gt;
и statusBar (все они являются членами класса KMainWindow) представляют соответственно строку меню, панель инструментов и строку состояния. Схема взаимодействия классов приложения не должна выглядеть&lt;br /&gt;
очень сложной (рис. 2, под именами классов подписаны имена объектов&lt;br /&gt;
этих классов, объявленных в классе images). Класс images выполняет&lt;br /&gt;
роль связующего звена между элементами пользовательского интерфейса и представлением данных imagesView. Методы этого класса являются&lt;br /&gt;
обработчиками событий интерфейса и вызывают соответствующие методы класса представления.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|center|&lt;br /&gt;
|Заголовок=ЕДИНЫЕ ДЕЙСТВИЯ&lt;br /&gt;
|Содержание=Концепция единых действий должна быть хорошо знакома тем, кто&lt;br /&gt;
программировал в Borland Delphi и C++ Builder. В приложениях с графическим интерфейсом, как правило, одну и ту же команду можно&lt;br /&gt;
вызвать несколькими способами (из основного меню, с панели инструментов, из контекстного меню). При этом во всех формах вызова&lt;br /&gt;
команды обычно используются одни и те же элементы – пиктограмма,&lt;br /&gt;
всплывающая подсказка, и, конечно, функция-обработчик команды.&lt;br /&gt;
До появления концепции единых действий (actions) программистам&lt;br /&gt;
приходилось выполнять много повторяющейся работы: для каждого&lt;br /&gt;
элемента интерфейса нужно было явным образом указывать пиктограмму, подсказку и обработчик команды.&lt;br /&gt;
&lt;br /&gt;
Далее сложности нарастали: если в определенном состоянии программы команду требовалось заблокировать, необходимо было отслеживать состояния всех элементов интерфейса, связанных с этой&lt;br /&gt;
командой. Как вы уже догадались, концепция единых действий существенно упрощает работу программиста. В рамках этой концепции все&lt;br /&gt;
общие элементы команды объединяются в один объект (в случае KDE,&lt;br /&gt;
объект класса KAction). Создав объект KAction для определенной&lt;br /&gt;
команды, мы указываем объекту, в каких элементах интерфейса должен присутствовать вызов этой команды. Об остальном объект KAction&lt;br /&gt;
позаботится сам. Если мы свяжем этот объект с одним из меню, будет&lt;br /&gt;
создана строка меню, если с панелью инструментов – будет создана&lt;br /&gt;
кнопка и т.п. Если в какой-то момент команда должна быть заблокирована, нам достаточно вызвать метод setEnabled(FALSE) для объекта&lt;br /&gt;
KAction для того, чтобы все визуальные представления команды были&lt;br /&gt;
заблокированы. Аналогично выполняется и разблокирование команды.&lt;br /&gt;
Можно сказать, что объект KAction – это центр управления всеми элементами интерфейса, связанными с соответствующей командой.&lt;br /&gt;
|Ширина=}}&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы открыть в KDevelop файлы исходных текстов, нужно&lt;br /&gt;
открыть вкладку Группы файлов, расположенную у левого края главного&lt;br /&gt;
окна среды, и выбрать в ней группу Sources. Перед вами появится список&lt;br /&gt;
файлов исходных текстов. Откройте нужный файл щелчком мыши.&lt;br /&gt;
&lt;br /&gt;
В файле imagesview.h внесите изменения в объявление класса&lt;br /&gt;
imagesView так, чтобы он стал потомком класса QLabel (напомню, что&lt;br /&gt;
класс QLabel способен выводить изображения). Класс imagesView&lt;br /&gt;
является также потомком класса imagesIface, но эта «наследственная линия» нас сейчас не интересует, и мы оставим ее без изменений.&lt;br /&gt;
Естественно, в файл imagesview.h следует добавить директиву&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;#include &amp;lt;qpixmap.h&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
Удалим из объявления imagesView ненужные члены и добавим нужные. После этого объявление класса будет выглядеть так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;class imagesView : public QLabel, public imagesIface&lt;br /&gt;
{&lt;br /&gt;
Q_OBJECT&lt;br /&gt;
public:&lt;br /&gt;
imagesView(QWidget *parent);&lt;br /&gt;
virtual ~imagesView();&lt;br /&gt;
void toBlacknWhite();&lt;br /&gt;
void setContrast(int c);&lt;br /&gt;
void setIntensity(int i);&lt;br /&gt;
};&amp;lt;/source&amp;gt;&lt;br /&gt;
Помимо конструктора и деструктора у класса imagesView появились&lt;br /&gt;
три новых метода. Эти методы выполняют преобразования изображения,&lt;br /&gt;
хранящегося в imagesView. Метод toBlacknWhite() выполняет преобразование палитры из цветной в черно-белую, метод setContrast()&lt;br /&gt;
позволяет настроить контрастность изображения, а с помощью метода&lt;br /&gt;
setIntensity() можно изменить интенсивность.&lt;br /&gt;
&lt;br /&gt;
Теперь перейдем в файл imagesview.cpp. Добавим в этот файл две&lt;br /&gt;
директивы включения заголовочных файлов:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;#include &amp;lt;kpixmap.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kpixmapeffect.h&amp;gt;&lt;br /&gt;
Теперь приступим к реализации методов:&lt;br /&gt;
imagesView::imagesView(QWidget *parent)&lt;br /&gt;
: QLabel(parent),&lt;br /&gt;
DCOPObject(&amp;quot;imagesIface&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);&lt;br /&gt;
}&lt;br /&gt;
imagesView::~imagesView()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
void imagesView::toBlacknWhite()&lt;br /&gt;
{&lt;br /&gt;
if (pixmap() == NULL)&lt;br /&gt;
{&lt;br /&gt;
kdDebug() &amp;lt;&amp;lt; k_funcinfo &amp;lt;&amp;lt; &amp;quot;Trying to modify an empty pixmap&amp;quot; &amp;lt;&amp;lt;&lt;br /&gt;
endl;&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
KPixmap kpm(* pixmap());&lt;br /&gt;
KPixmapEffect::toGray(kpm, FALSE);&lt;br /&gt;
setPixmap(kpm);&lt;br /&gt;
}&lt;br /&gt;
void imagesView::setContrast(int c)&lt;br /&gt;
{&lt;br /&gt;
if (pixmap() == NULL)&lt;br /&gt;
{&lt;br /&gt;
kdDebug() &amp;lt;&amp;lt; k_funcinfo &amp;lt;&amp;lt; &amp;quot;Trying to modify an empty pixmap&amp;quot; &amp;lt;&amp;lt;&lt;br /&gt;
endl;&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
KPixmap kpm(* pixmap());&lt;br /&gt;
KPixmapEffect::contrast(kpm, (c – 50)*5);&lt;br /&gt;
setPixmap(kpm);&lt;br /&gt;
}&lt;br /&gt;
void imagesView::setIntensity(int i)&lt;br /&gt;
{&lt;br /&gt;
if (pixmap() == NULL)&lt;br /&gt;
{&lt;br /&gt;
kdDebug() &amp;lt;&amp;lt; k_funcinfo &amp;lt;&amp;lt; &amp;quot;Trying to modify an empty pixmap&amp;quot; &amp;lt;&amp;lt;&lt;br /&gt;
endl;&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
KPixmap kpm(* pixmap());&lt;br /&gt;
KPixmapEffect::intensity(kpm, (i-50)/10);&lt;br /&gt;
setPixmap(kpm);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=АЛЬТЕРНАТИВЫ QT DESIGNER&lt;br /&gt;
|Содержание=В свое время Linux-разработчиками было начато немало проектов,&lt;br /&gt;
предназначенных для расширения возможностей визуального программирования Qt. Некоторые из этих проектов (их еще можно найти&lt;br /&gt;
на сайтах Qt Community) в идеале должны были приблизиться по&lt;br /&gt;
удобству и простоте разработке к таким средствам, как Delphi. Однако,&lt;br /&gt;
проверку временем и популярностью выдержали лишь некоторые из&lt;br /&gt;
них, являющиеся простыми надстройками над Qt Designer. В вашем&lt;br /&gt;
дистрибутиве Linux, скорее всего, присутствуют два таких альтернативных редактора пользовательского интерфейса: KDevelop Designer&lt;br /&gt;
и Kommander. KDevelop Designer отличается от Qt Designer примерно&lt;br /&gt;
также, как KPixmap от QPixmap, то есть, практически ничем. Стоит&lt;br /&gt;
упомянуть также «динамический редактор диалогов» Kommander,&lt;br /&gt;
который создает самостоятельные диалоговые окна и окна мастеров,&lt;br /&gt;
для использования, например, в сценариях оболочки. В этом редакторе можно не только сконструировать окно со всеми дочерними визуальными элементами, но и проверить, как работают связки сигнал-слот в новом окне.&lt;br /&gt;
|Ширина=300px}}&lt;br /&gt;
В конструкторе класса мы устанавливаем горизонтальное и вертикальное выравнивание для содержимого метки.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы понять, как работают три метода, выполняющих&lt;br /&gt;
преобразования изображения, рассмотрим классы KDE KPixmap и&lt;br /&gt;
KPixmapEffect. Первый из этих классов представляет собой улучшенный вариант QPixmap, второй класс предназначен для применения различных эффектов к изображению, хранящемуся в KPixmap. Эффекты&lt;br /&gt;
реализованы в виде статических методов класса KPixmapEffect. Методы&lt;br /&gt;
модифицируют содержимое переданного им объекта (а не создают&lt;br /&gt;
новый). Для выполнения обработки изображения нам приходится преобразовывать QPixmap в KPixmap. Фактически наш класс imagesView&lt;br /&gt;
представляет собой модифицированный вариант QLabel, способный&lt;br /&gt;
выполнять преобразования над загруженным изображением. Для вывода сообщения об ошибке (которая никогда не должна возникнуть) мы&lt;br /&gt;
используем функцию kdDebug(), которая возвращает нам объект потока&lt;br /&gt;
C++ для вывода отладочных сообщений (можно было бы воспользоваться&lt;br /&gt;
и printf(), но это же все-таки C++!). Макрос k_funcinfo выводит информацию о функции, из которой был вызван. Функция kdDebug() и макрос&lt;br /&gt;
k_funcinfo объявлены в заголовочном файле kdebug.h. В том же файле объявлен макрос k_lineinfo, который ограничивается вводом информации о файле строке исходного текста, в которой был вызван.&lt;br /&gt;
&lt;br /&gt;
Прежде чем мы перейдем к написанию класса images, ответственного за поведение интерфейса нашей программы, нам понадобится&lt;br /&gt;
создать один дополнительный элемент интерфейса – диалоговое окно&lt;br /&gt;
для настройки параметров изображения. Это окно изображено на приведенном выше снимке экрана. Оно содержит горизонтальный ползунок&lt;br /&gt;
(объект класса QSlider) и две кнопки – OK и Cancel. Будет логично, если&lt;br /&gt;
для создания диалогового окна мы воспользуемся методами визуального программирования, и спроектируем окно в самой среде KDevelop,&lt;br /&gt;
используя встроенный в нее редактор KDevelop Designer (см. врезку).&lt;br /&gt;
В окне Automake Manager, щелкните правой кнопкой мыши по строке&lt;br /&gt;
images (Программа в bin) и выберите команду Создать файл.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img 82 100 1.png|thumb|Рисунок 3. Окно создания нового файла.]]&lt;br /&gt;
[[Изображение:Img 82 100 2.png|thumb|Рисунок 4. Проект диалогового окна.]]&lt;br /&gt;
В открывшемся диалоговом окне (рис. 3) укажите имя нового файла&lt;br /&gt;
– SettingsDialog и тип – Dialog (ui). После этого будет открыт редактор&lt;br /&gt;
окон, подобный Qt Designer, однако для того, чтобы добраться до окна&lt;br /&gt;
формы, придется «разгрести» множество служебных окон (при разрешении 1024x768 окно формы оказывается полностью «похороненным» под&lt;br /&gt;
ними). Перенесите в окно формы две кнопки PushButton и ползунок&lt;br /&gt;
Slider и объедините их в группы (рис. 4). Сигнал clicked() кнопки OK&lt;br /&gt;
соедините со слотом accept() класса Form1 (для тех, кто забыл, напомним, что соответствующее окно вызывается командой Соединения...&lt;br /&gt;
контекстного меню или с помощью клавиши F3). Сигнал clicked() кнопки Cancel следует соединить со слотом reject() класса Form1. Вызов&lt;br /&gt;
слотов accept() и reject() приводит к закрытию диалогового окна. При&lt;br /&gt;
этом значение, которое окно передает программе после своего закрытия,&lt;br /&gt;
определяет, какая из кнопок была нажата.&lt;br /&gt;
&lt;br /&gt;
Теперь вернитесь в Automake Manager, щелкните правой кнопкой&lt;br /&gt;
мыши по имени файла SettingsDialog.ui и в контекстном меню выберите команду Создать или выбрать класс реализации....&lt;br /&gt;
&lt;br /&gt;
На самом деле мы создаем не класс реализации, а наследуем&lt;br /&gt;
от класса формы. В открывшемся окне введите имя нового класса – SettingsDialogImpl. Закройте окна созданных файлов&lt;br /&gt;
settingsdialogimpl.h и settingsdialogimpl.cpp. В редакторе форм&lt;br /&gt;
создайте новый слот (команда Слоты... контекстного меню) void&lt;br /&gt;
sliderMoved(int i) и соедините его с сигналом sliderMoved(int) объекта slider1. Теперь закройте окно визуального редактора (не забыв сохранить файл SettingsDialog.ui) и откройте файл settingsdialogimpl.h.&lt;br /&gt;
В объявление класса SettingsDialogImpl добавьте закрытую переменную _sliderpos и метод getSliderValue():&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;class SettingsDialogImpl: public Form1 {&lt;br /&gt;
Q_OBJECT&lt;br /&gt;
public:&lt;br /&gt;
SettingsDialogImpl(QWidget *parent = 0, const char *name = 0);&lt;br /&gt;
public slots:&lt;br /&gt;
int getSliderValue();&lt;br /&gt;
protected slots:&lt;br /&gt;
void sliderMoved(int i);&lt;br /&gt;
private:&lt;br /&gt;
int _sliderpos;&lt;br /&gt;
};&amp;lt;/source&amp;gt;&lt;br /&gt;
В файл settingsdialogimpl.cpp добавьте реализацию метода&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;getSliderValue()и слота sliderMoved():&lt;br /&gt;
void SettingsDialogImpl::sliderMoved(int i)&lt;br /&gt;
{&lt;br /&gt;
_sliderpos = i;&lt;br /&gt;
}&lt;br /&gt;
int SettingsDialogImpl::getSliderValue()&lt;br /&gt;
{&lt;br /&gt;
return _sliderpos;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
На этом разработка диалогового окна закончена. В файл images.&lt;br /&gt;
cpp необходимо добавить директиву&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;#include &amp;quot;settingsdialogimpl.h&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь мы можем приступить к написанию, а точнее, к модификации&lt;br /&gt;
класса images. Дело в том, что этот класс, связующее звено нашего приложения, довольно сложен и значительная его часть была сгенерирована&lt;br /&gt;
автоматически, так что лучше всего трансформировать класс, созданный&lt;br /&gt;
по умолчанию, в тот класс, который нам нужен, путем постепенных изменений. Что мы хотим изменить в классе images? Мы хотим удалить все&lt;br /&gt;
ненужное. Наше приложение предназначено для редактирования существующих графических файлов, но не для создания новых, поэтому удалим метод fileNew() Кроме того, дабы не усложнять наш проект сверх&lt;br /&gt;
меры, мы удалим все, что связано с выводом данных на печать, в том&lt;br /&gt;
числе метод filePrint() и поле m_printer. На поле m_printer ссылается конструктор images, в него тоже нужно внести изменения. Удалим&lt;br /&gt;
методы saveProperties() и readProperties() – они нам сейчас не&lt;br /&gt;
нужны. Также следует удалить содержимое методов load(), fileSave() и&lt;br /&gt;
fileSaveAs(), а сами методы – оставить. Если удаление всего ненужного&lt;br /&gt;
выполнено грамотно, приложение должно скомпилироваться и запуститься. Возможно, вы заметили, что хотя код, выполняющий команды&lt;br /&gt;
File|New и File|Print удален, пункт меню и кнопка быстрого доступа остались. Для того, чтобы удалить их, нужно прейти в метод setupActions()&lt;br /&gt;
и удалить строки&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;KStdAction::openNew(this, SLOT(fileNew()), actionCollection());&lt;br /&gt;
KStdAction::print(this, SLOT(filePrint()), actionCollection());&amp;lt;/source&amp;gt;&lt;br /&gt;
Что делали две удаленные строки? Они добавляли в приложения два&lt;br /&gt;
стандартных действия (см. врезку). Для стандартных действий система&lt;br /&gt;
сама предоставляет пиктограмму, название и клавишу быстрого доступа.&lt;br /&gt;
Статическим методам класса KStdAction передается указатель на класс,&lt;br /&gt;
реализующий обработку команды, слот, обрабатывающий команду, а&lt;br /&gt;
также указатель на коллекцию действий actionCollection (возвращается&lt;br /&gt;
методом actionCollection()). Программа будет работать даже если слотов, связанных с действиями, не существует, только в стандартный поток&lt;br /&gt;
вывода будет выведено предупреждающее сообщение. Такова динамическая природа модели сигнал/слот.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что мы не прибегаем к визуальному программированию при проектировании главного окна нашего офисного приложения.&lt;br /&gt;
Дело в том, что для разработки главного окна визуальное программирование нам и не нужно, поскольку вид этого окна однозначно определен&lt;br /&gt;
принципами построения приложения «офисного» типа.&lt;br /&gt;
&lt;br /&gt;
Теперь подумаем о том, что следует добавить в класс images. В главную строку меню приложения мы добавим пункт Processing, который&lt;br /&gt;
будет открывать подменю, содержащее команды обработки изображения To Black &amp;amp; White (в черно-белый), Contrast (контраст) и Intensity&lt;br /&gt;
(интенсивность). Кнопки новых команд нужно добавить на панель быстрого доступа. Все эти изменения должны быть отражены в классе images,&lt;br /&gt;
отвечающем за интерфейс. Ну и конечно, в images нужно добавить код,&lt;br /&gt;
выполняющий новые команды. Именно в таком порядке мы и будем вносить изменения в класс.&lt;br /&gt;
&lt;br /&gt;
Весь код, отвечающий за добавление новых элементов интерфейса,&lt;br /&gt;
мы сгруппируем в новом методе setup_Controls(). В среде KDevelop&lt;br /&gt;
новые методы классов можно добавить вручную, а можно – автоматически. Откройте вкладку Классы, расположенную с правой стороны главного&lt;br /&gt;
окна KDevelop. Раскройте группу src, щелкните правой кнопкой мыши по&lt;br /&gt;
классу images и в открывшемся контекстном меню выберите команду&lt;br /&gt;
Добавить метод.... Откроется окно создания нового метода, похожее на&lt;br /&gt;
окно создания нового слота в Qt Designer.&lt;br /&gt;
&lt;br /&gt;
После добавления нового метода можно приступать к его реализации. В методе setup_Controls() мы создаем подменю Processing&lt;br /&gt;
главного меню, добавляем разделительную полосу на панель быстрого&lt;br /&gt;
доступа (просто для красоты), создаем и настраиваем три объекта действия (объекты классы KAction), и делаем соответствующие команды&lt;br /&gt;
доступными в меню и на панели быстрого доступа. Рассмотрим все эти&lt;br /&gt;
этапы подробнее.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;void images::setup_Controls()&lt;br /&gt;
{&lt;br /&gt;
KPopupMenu * procMenu = new KPopupMenu(); //Processing&lt;br /&gt;
menuBar()-&amp;gt;insertItem(i18n(&amp;quot;&amp;amp;Processing&amp;quot;), procMenu, 0, 1);&amp;lt;/source&amp;gt;&lt;br /&gt;
Создаем меню Processing. Подменю главного меню должно быть&lt;br /&gt;
объектом класса KPopupMenu. Для того, чтобы указать, что новое&lt;br /&gt;
всплывающее меню принадлежит главному меню, мы вызываем метод&lt;br /&gt;
insertItem() поля menuBar (к которому мы получаем доступ с помощью&lt;br /&gt;
одноименного метода). Кроме указателя на объект класса KPopupMenu&lt;br /&gt;
методу insertItem() передается имя нового меню, его идентификатор&lt;br /&gt;
id и индекс – позиция в главной строке меню (значению 1 соответствует&lt;br /&gt;
вторая позиция, после File). Идентификатор должен быть положительным&lt;br /&gt;
числом. Если insertItem() передать отрицательное значение идентификатора, insertItem() вернет значение нового уникального идентификатора для меню.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;toolBar()-&amp;gt;insertLineSeparator(3);&amp;lt;/source&amp;gt;&lt;br /&gt;
Добавляем линию-разделитель&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;KAction * command = new KAction(i18n(“To &amp;amp;Black &amp;amp;&amp;amp; White”),&lt;br /&gt;
QIconSet(QPixmap(“c1.xpm”)), 0, this,&lt;br /&gt;
SLOT(proc_toBlacknWhite()),&lt;br /&gt;
actionCollection(), “bw_command”);&amp;lt;/source&amp;gt;&lt;br /&gt;
Создаем объект-действие для команды To Black &amp;amp; White. Файл&lt;br /&gt;
c1.xpm содержит пиктограмму команды (этот файл должен быть доступен программе во время выполнения). Класс QIconSet преобразует переданный ему графический файл в набор пиктограмм различный размеров&lt;br /&gt;
и форм (в том числе, в черно-белую пиктограмму для заблокированной&lt;br /&gt;
команды). Слот proc_toBlacknWhite() будет содержать код обработки&lt;br /&gt;
команды. Последний параметр – имя объекта-команды. Имена могут быть&lt;br /&gt;
у всех объектов Qt/KDE, наследующих QObject, но это первый случай,&lt;br /&gt;
когда они нам действительно пригодятся.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;command-&amp;gt;setToolTip(i18n(“Transforms image palette to grayscale”));&lt;br /&gt;
command-&amp;gt;setEnabled(FALSE);&amp;lt;/source&amp;gt;&lt;br /&gt;
В этих строках мы добавляем всплывающую подсказку и указываем, что по умолчанию команда заблокирована. Последнее нужно для&lt;br /&gt;
того, чтобы пользователь не пытался обрабатывать еще не существующее&lt;br /&gt;
изображение. Правда, методы класса imagesView все равно этого не&lt;br /&gt;
допустят, но лучше перестраховаться (см. эпиграф).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;command-&amp;gt;plug(procMenu);&lt;br /&gt;
command-&amp;gt;plug(toolBar(), -1);&amp;lt;/source&amp;gt;&lt;br /&gt;
С помощью метода plug() мы указываем объекту действия, что&lt;br /&gt;
соответствующая команда должна быть доступна в меню procMenu и на&lt;br /&gt;
панели быстрого доступа.&lt;br /&gt;
&lt;br /&gt;
Добавление двух остальных команд выполняется аналогично.&lt;br /&gt;
Добавим вызов метода setup_Controls() в конструктор images после&lt;br /&gt;
вызова setupGUI(). Теперь можно запустить программу и полюбоваться&lt;br /&gt;
на новый интерфейс. Правда, слоты для новых команд еще не созданы,&lt;br /&gt;
так что новые команды пока не работают. Прежде чем создать слоты, вернемся в конструктор images и добавим в него строки&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;actionCollection()-&amp;gt;setHighlightingEnabled(TRUE);&lt;br /&gt;
connect(actionCollection(),SIGNAL(actionStatusText(const QString&amp;amp;)),statusBar(), SLOT(message ( const QString&amp;amp; )));&lt;br /&gt;
connect(actionCollection(),SIGNAL(clearStatusText()),statusBar(), SLOT(clear()));&amp;lt;/source&amp;gt;&lt;br /&gt;
после вызова statusBar()-&amp;gt;show(). Это стандартная последовательность вызовов, предназначенная для того, чтобы всплывающие подсказки&lt;br /&gt;
отображались в строке состояния. Теперь мы можем добавить слот proc_toBlacknWhite(), и слоты для двух других команд: proc_Contrast()&lt;br /&gt;
и proc_Intensity(). В коде этих слотов (см. исходные тексты на диске)&lt;br /&gt;
для нас нет почти ничего нового, отметим только один момент. Для того,&lt;br /&gt;
чтобы разблокировать/заблокировать команды пользовательского&lt;br /&gt;
интерфейса, нужно получить доступ к соответствующему объекту&lt;br /&gt;
действия. Доступ к коллекции объектов мы получаем с помощью&lt;br /&gt;
метода actionCollection(), а сами объекты можем найти по имени – строке, переданной конструктору Kaction.&lt;br /&gt;
&lt;br /&gt;
Мы научились создавать приложения KDE со стандартным&lt;br /&gt;
графическим интерфейсом. Но в мире программирования KDE&lt;br /&gt;
это – только начало. В следующих статьях мы узнаем, как создавать&lt;br /&gt;
KDE-приложения специальных типов, а также познакомимся с некоторыми полезными службами KDE, такими как менеджер сессий.&lt;/div&gt;</description>
			<pubDate>Sun, 14 Dec 2008 13:44:32 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF82:Qt/KDE</comments>		</item>
	</channel>
</rss>