<?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>LXF109:KDE4 - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF109:KDE4&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Thu, 14 May 2026 03:16:03 GMT</lastBuildDate>
		<item>
			<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF109:KDE4&amp;diff=8655&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''KDE 4''' Создаем приложения для самого современного рабочего стола в Linux.&lt;br /&gt;
&lt;br /&gt;
==Сияющая Plasma==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/KDE4}}&lt;br /&gt;
&lt;br /&gt;
: '''ЧАСТЬ 2''' Пожалуй, ни одна из технологий KDE 4 не привлекла к себе столько внимания, как эта. '''Андрей Боровский''' докажет, что написать собственный плазмоид совсем не сложно.&lt;br /&gt;
&lt;br /&gt;
Если вы уже работали в графической среде KDE 4, то просто не могли не заметить плазмоиды. Для тех, кто все же&lt;br /&gt;
не знает, что это такое, поясним. Плазмоиды представляют собой улучшенный и украшенный вариант апплетов, известных пользователям KDE с незапамятных времен. Свое название плазмоиды получили от системы ''Plasma'', которая призвана существенно расширить возможности рабочего стола KDE и улучшить его внешний вид. Функциональность ''Plasma'', в свою очередь,&lt;br /&gt;
основана на новых возможностях библиотеки ''Qt 4'', прежде всего – на системе ''Graphics View Framework'' ([[LXF105:Qt4|LXF105]]). Помимо нее, ''Plasma'' использует новые средства для работы с OpenGL, появившиеся в ''Qt 4''. С точки зрения программиста, ''Plasma'' представляет собой API, основная часть которого реализована в библиотеке&lt;br /&gt;
''libplasma''.&lt;br /&gt;
&lt;br /&gt;
Все это будет подробно рассмотрено ниже. Сейчас же мы попробуем ответить на вопрос: стоит ли вам, как разработчику, изучать плазмоиды и заниматься их написанием. Излишне пояснять, что далеко не каждая программа может (или должна) быть выполнена в виде плазмоида. На сегодняшний день их написано немало (список приложений данного типа, известных&lt;br /&gt;
команде KDE, можно найти по адресу http://techbase.kde.org/Projects/Plasma/Plasmoids), так что некоторые тенденции уже очевидны.&lt;br /&gt;
Поскольку плазмоиды «живут» на рабочем столе или на панели&lt;br /&gt;
задач, основная их часть предназначена для того, чтобы информировать пользователя о различных событиях в системе или за ее&lt;br /&gt;
пределами (к этой категории относятся часы, измерители сетевого трафика, RSS-читалки и т.п.). Меньшая по численности группа&lt;br /&gt;
плазмоидов предназначена для решения несложных, но часто востребованных задач (калькуляторы, словари, быстрый запуск программ). Встречаются, впрочем, и плазмоиды-игры, плазмоиды для просмотра комиксов и другая экзотика. С одной стороны – область&lt;br /&gt;
применения плазмоидов ограничена. С другой, их написание – та&lt;br /&gt;
сфера, в которой начинающий программист, одержимый потоком&lt;br /&gt;
оригинальных идей, может проявить себя. Стоит также отметить,&lt;br /&gt;
что идея плазмоидов понравилась не только создателям рабочего&lt;br /&gt;
стола, и постепенно проникает и в другие области KDE-строения.&lt;br /&gt;
&lt;br /&gt;
Как и все другие расширения KDE, с технической точки зрения плазмоиды представляют собой разделяемые библиотеки.&lt;br /&gt;
Программирование плазмоидов – дело нетрудное, а вот их отладка –&lt;br /&gt;
довольно нудный процесс. Когда мы отлаживаем обычные приложения, нам часто приходится перезапускать их; когда мы отлаживаем&lt;br /&gt;
расширения ''Plasma'', нам порой приходится перезапускать Плазму.&lt;br /&gt;
Впрочем, и это нетрудно сделать – перезагружать ''X''-сервер, по&lt;br /&gt;
крайней мере, не придется. К тому же для отладки плазмоидов&lt;br /&gt;
существует специальный инструмент – ''plasmoidviewer''.&lt;br /&gt;
&lt;br /&gt;
===Покажите мне код!===&lt;br /&gt;
&lt;br /&gt;
Основой любого плазмоида является класс, наследующий&lt;br /&gt;
'''Plasma::Applet''' или одному из его потомков. В библиотеке ''libplasma''&lt;br /&gt;
определены '''Plasma::GLApplet''' – специальный класс для создания&lt;br /&gt;
плазмоидов, использующих OpenGL, и '''Plasma::PopupApplet''' – каркас для создания «всплывающих» плазмоидов. Все они происходят от '''QGraphicsWidget'''. От него же ведут свою родословную&lt;br /&gt;
несколько классов, предназначенных для отображения данных&lt;br /&gt;
внутри плазмоида: '''Plasma::Flash''' (вывод текста или графики в&lt;br /&gt;
течение некоторого промежутка времени), '''Plasma::Icon''' (пиктограмма), '''Plasma::Meter''' (для отображения шкал уровня в различных форматах), '''Plasma::SignalPlotter''' (отрисовка нескольких графиков, меняющихся с течением времени) и '''Plasma::WebContent''',&lt;br /&gt;
который способен отображать содержимое web-страниц, заданных файлом или ссылкой.&lt;br /&gt;
&lt;br /&gt;
Наш первый плазмоид распечатывает содержимое файла '''/proc/cpuinfo''' в своем окне (это не самое интересное, что можно сделать&lt;br /&gt;
с помощью ''Plasma'', но все не Hello World). Ниже приводится объявление класса плазмоида (полные исходные тексты вы, как всегда,&lt;br /&gt;
найдете на диске).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=csharp&amp;gt;&lt;br /&gt;
  class SysInfo_1 : public Plasma::Applet {&lt;br /&gt;
     Q_OBJECT&lt;br /&gt;
  public:&lt;br /&gt;
     SysInfo_1(QObject *parent, const QVariantList &amp;amp;args);&lt;br /&gt;
     ~SysInfo_1();&lt;br /&gt;
     void paintInterface(QPainter *painter,&lt;br /&gt;
     const QStyleOptionGraphicsItem *option, const QRect&amp;amp;contentsRect);&lt;br /&gt;
     void init();&lt;br /&gt;
     private:&lt;br /&gt;
     Plasma::Svg m_svg;&lt;br /&gt;
  };&lt;br /&gt;
  K_EXPORT_PLASMA_APPLET(sysinfo_1, SysInfo_1)&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Как видно, он содержит объявления четырех основных методов,&lt;br /&gt;
которые обычно перекрываются в классах-потомках '''Plasma::Applet''' –&lt;br /&gt;
конструктора, деструктора, '''paintInterface()''' и '''init()'''. Из них нам реально понадобятся только два – конструктор и '''paintInterface()'''.&lt;br /&gt;
&lt;br /&gt;
Макрос '''K_EXPORT_PLASMA_APPLET()''' выполняет рутинную&lt;br /&gt;
работу по подготовке созданного нами класса к экспорту из библиотеки плазмоида. Первый его аргумент – имя библиотеки (без&lt;br /&gt;
указания номера версии и расширения '''.so'''), второй – имя класса плазмоида. Ради удобства, а также для того, чтобы избежать&lt;br /&gt;
некоторых неочевидных ошибок, я рекомендую использовать единую систему имен для всех файлов проекта плазмоида. Например,&lt;br /&gt;
если целевая библиотека будет носить имя '''sysinfo_1.x.so''', файлы &lt;br /&gt;
с объявлением и определением класса плазмоида мы назовем&lt;br /&gt;
'''sysinfo_1.h''' и '''sysinfo_1.cpp''', соответственно. Файл описания плазмоида получит имя '''sysinfo_1.desktop'''.&lt;br /&gt;
&lt;br /&gt;
Несколько слов о заголовочных файлах. В разных версиях ''libplasma'', соответствующих различным версиям KDE 4, их имена &lt;br /&gt;
могут варьироваться. В той системе, в которой я писал эти примеры, заголовочные файлы имеют вид: '''&amp;lt;plasma/applet.h&amp;gt;''', '''&amp;lt;plasma/widgets/lineedit.h&amp;gt;'''. В вашей системе они могут выглядеть так же,&lt;br /&gt;
а могут – и иначе, например: '''&amp;lt;Plasma/Applet&amp;gt;''', '''&amp;lt;Plasma/Widgets/LineEdit&amp;gt;'''. ''CMake'' сам по себе тут не поможет, ведь он не станет править ваши исходные тексты ['''можно, правда, воспользоваться интроспекцией и условными директивами препроцессора, – прим. ред.''']! Так что вам придется провести собственное исследование директории '''/usr/include/'''. Помните также, что интерфейс ''libplasma'' продолжает меняться. Примеры, подготовленные для этой статьи, используют некий общий знаменатель для всех версий API  ''libplasma'' (начиная с KDE 4.0.*). Кроме того, в тексты примеров&lt;br /&gt;
добавлены вызовы методов, определенных в более поздних версиях KDE. Эти вызовы закомментированы, и к ним даны пояснения.&lt;br /&gt;
Если вы пользуетесь KDE 4.1 или KDE 4.2, можете раскомментировать их и сравнить результаты.&lt;br /&gt;
&lt;br /&gt;
Как вы, конечно, поняли, самый интересный метод в классе&lt;br /&gt;
'''SysInfo_1 – paintInterface()'''. Он выполняет отрисовку интерфейса &lt;br /&gt;
плазмоида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=csharp&amp;gt;&lt;br /&gt;
  void SysInfo_1::paintInterface(QPainter *p, const QStyleOptionGraphicsItem *option, const QRect &amp;amp;contentsRect) {&lt;br /&gt;
    p-&amp;gt;setRenderHint(QPainter::SmoothPixmapTransform);&lt;br /&gt;
    p-&amp;gt;setRenderHint(QPainter::Antialiasing);&lt;br /&gt;
    m_svg.resize((int)contentsRect.width(), (int)contentsRect.height());&lt;br /&gt;
    m_svg.paint(p, (int)contentsRect.left(), (int)contentsRect.top());&lt;br /&gt;
    QFile file(&amp;quot;/proc/cpuinfo&amp;quot;);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    QByteArray ba = file.readAll();&lt;br /&gt;
    file.close();&lt;br /&gt;
    QString s(ba);&lt;br /&gt;
    p-&amp;gt;save();&lt;br /&gt;
    p-&amp;gt;setPen(Qt::white);&lt;br /&gt;
    p-&amp;gt;drawText(contentsRect, Qt::AlignTop | Qt::AlignLeft, s);&lt;br /&gt;
    p-&amp;gt;restore();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Метод '''paintInterface()''' вызывается системой ''Plasma'' каждый раз,&lt;br /&gt;
когда нужно перерисовать плазмоид. Помимо прочего, ему передается указатель на объект '''QPainter''' (переменная '''p''') и ссылка на объект, обозначающий прямоугольную область вывода изображения, учитывающую отступы от края окна плазмоида (переменная '''contentsRect'''). В простейшем случае отрисовка интерфейса сводится к выводу графики с помощью объекта '''p'''.&lt;br /&gt;
&lt;br /&gt;
В процессе отображения интерфейса плазмоида активно используются функции ''libplasma'', предназначенные для работы&lt;br /&gt;
с форматом SVG. Это неудивительно, если вспомнить, что плазмоиды можно масштабировать и вращать прямо на рабочем столе (разумеется, при работе с '''QPainter''' вы можете использовать любые графические функции, но для того, чтобы ваш плазмоид&lt;br /&gt;
выглядел профессионально, следует предусмотреть возможность масштабирования и вращения). Помимо прочего, использование&lt;br /&gt;
SVG позволяет настраивать внешний вид плазмоида, не внося изменений в его код, что должны высоко оценить авторы тем для&lt;br /&gt;
оформления KDE 4. За работу с SVG в ''libplasma'' отвечает класс '''Plasma::Svg''' (мы сохраняем объект данного типа в переменной&lt;br /&gt;
'''m_svg'''). Класс '''Plasma::Svg''' может не только преобразовывать данные из формата SVG в растровое изображение: он также «знает», где искать стандартные файлы изображений KDE, и может отрисовывать отдельные фрагменты файлов SVG, заданные своими&lt;br /&gt;
идентификаторами. Последнее свойство очень полезно, так как позволяет хранить графические элементы сложного интерфейса&lt;br /&gt;
приложения в одном файле, даже если они должны отображаться независимо друг от друга. Мы используем объект '''m_svg''' для&lt;br /&gt;
отрисовки элементов окна плазмоида. Содержимое файла '''/proc/cpuinfo''' выводится на экран с помощью метода '''drawText()''' объекта '''QPainter'''. Хотя это и не обязательно, правила хорошего тона требуют вызвать метод '''save()''' объекта '''QPainter''' перед выводом собственной графики и метод '''restore()''' по окончании процесса&lt;br /&gt;
&lt;br /&gt;
Метод '''init()''' выполняется системой ''Plasma'' после вызова конструктора, причем только один раз. В нем можно поместить код,&lt;br /&gt;
инициализирующий элементы плазмоида после того, как объект уже создан. Если в ходе этого процесса возникла ошибка,&lt;br /&gt;
вы можете вызвать метод объекта-апплета '''setFailedToLaunch()'''. Первый его аргумент имеет тип '''bool''' (значение '''true''' указывает, что в процессе инициализации плазмоида произошла ошибка). Второй параметр типа «строка» позволяет сообщить системе, что же именно стряслось. Вызов '''setFailedToLaunch()''' – вежливый способ аварийного завершения плазмоида. В тот же файл, где мы храним реализации методов его класса, необходимо добавить строчку&lt;br /&gt;
&lt;br /&gt;
  #include &amp;quot;sysinfo_1.moc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===И что получилось?===&lt;br /&gt;
&lt;br /&gt;
Еще нам нужно создать файл описания плазмоида с расширением '''.desktop'''. Кстати, он требуется не только плазмоидам, но и вообще&lt;br /&gt;
любым расширениям KDE. В '''.desktop'''- файле хранится описание  расширения, а также инструкции для его загрузки системой. Наш&lt;br /&gt;
 файл расширения ('''sysinfo_1.desktop''') выглядит так:&lt;br /&gt;
&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Name=&amp;quot;Plasmoid Demo&amp;quot;&lt;br /&gt;
 Comment=&amp;quot;Plasmoid Demo&amp;quot;&lt;br /&gt;
 Type=Service&lt;br /&gt;
 X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
 X-KDE-Library=sysinfo_1&lt;br /&gt;
 X-KDE-PluginInfo-Author=Andrei Borovsky&lt;br /&gt;
 X-KDE-PluginInfo-Email=anb@symmetrica.net&lt;br /&gt;
 X-KDE-PluginInfo-Name=sysinfo_1&lt;br /&gt;
 X-KDE-PluginInfo-Version=0.1&lt;br /&gt;
 X-KDE-PluginInfo-Website=http://symmetrica.net&lt;br /&gt;
 X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
 X-KDE-PluginInfo-Depends=&lt;br /&gt;
 X-KDE-PluginInfo-License=GPL&lt;br /&gt;
 X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
&lt;br /&gt;
Параметру '''Name''' присваивается имя расширения, предназначенное для показа пользователю. Под ним плазмоид будет &lt;br /&gt;
известен, например, утилите добавления виджетов на рабочий &lt;br /&gt;
стол. Параметр '''Comment''' содержит описание. Поле '''Type''' сообщает&lt;br /&gt;
системе, что данное расширение относится к типу «сервис». Среди &lt;br /&gt;
других важных параметров стоит отметить '''X-KDE-ServiceTypes, X-KDE-Library''' (имя библиотеки расширения) и '''X-KDE-PluginInfo-Name''' (имя плазмоида, используемое системой). Все остальное в данном файле – «лирика».&lt;br /&gt;
&lt;br /&gt;
Нам остается только создать файл инструкций для ''CMake'' (см. [[LXF109:CMake|эту статью]]).&lt;br /&gt;
&lt;br /&gt;
 project(sysinfo_1)&lt;br /&gt;
 find_package(KDE4 REQUIRED)&lt;br /&gt;
 include(KDE4Defaults)&lt;br /&gt;
 find_package(Plasma REQUIRED)&lt;br /&gt;
 add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS})&lt;br /&gt;
 include_directories(${KDE4_INCLUDES} )&lt;br /&gt;
 set(sysinfo_1_SRCS sysinfo_1.cpp)&lt;br /&gt;
 kde4_add_plugin(sysinfo_1 ${sysinfo_1_SRCS})&lt;br /&gt;
 target_link_libraries(sysinfo_1 ${PLASMA_LIBS} ${KDE4_KDEUI_LIBS})&lt;br /&gt;
 install(TARGETS sysinfo_1 DESTINATION ${PLUGIN_INSTALL_DIR})&lt;br /&gt;
 install(FILES sysinfo_1.desktop DESTINATION ${SERVICES_INSTALL_DIR})&lt;br /&gt;
&lt;br /&gt;
Новых для нас элементов в этом файле не так уж и много. Мы&lt;br /&gt;
загружаем пакет ''Plasma'', без которого плазмоид, естественно,&lt;br /&gt;
компилироваться не может. Команда '''kde4_add_plugin()''' указывает,&lt;br /&gt;
что целью сборки является расширение KDE 4 (а не исполняемый&lt;br /&gt;
файл, как в прошлый раз). Теперь вы можете скомандовать&lt;br /&gt;
&lt;br /&gt;
 cmake &amp;lt;project_dir&amp;gt;&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
В результате в каталоге проекта появится поддиректория '''lib''', в&lt;br /&gt;
которой будет создан файл '''sysinfo_1.so'''. Далее можно было бы&lt;br /&gt;
перейти в режим root и скомандовать&lt;br /&gt;
&lt;br /&gt;
{{Врезка |Содержание=[[Изображение:LXF109_82_1.jpg|300px|Рис. 1]] Рис. 1  Добавление плазмоида на рабочий стол.| Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
но тут нас поджидает одна неприятная неожиданность. Хотя в&lt;br /&gt;
нашем проекте ''CMake'' и есть инструкции для генерации цели '''install''' в&lt;br /&gt;
''Make''-файле, и соответствующий раздел будет создан, инсталляция&lt;br /&gt;
плазмоида по умолчанию выполняется не туда, куда следует (этот&lt;br /&gt;
эффект замечен и в KDE 4.0.x, и в KDE 4.1). Например, в моей системе библиотека '''sysinfo_1.so''' по умолчанию устанавливается в '''/usr/local/lib/kde4/''', а файл '''sysinfo_1.desktop''' – в '''/usr/local/share/kde4/services/'''. Система не станет искать новый плазмоид в этих директориях, а значит, и не найдет. Правильные каталоги (для моей системы) – это '''/usr/lib/kde4/''' и '''/usr/share/kde4/services/''' соответственно.&lt;br /&gt;
Чтобы заставить плазмоид работать, можно скопировать файлы '''.so'''&lt;br /&gt;
и '''.desktop''' в указанные директории вручную, а можно попробовать&lt;br /&gt;
запустить команду ''cmake'' с ключом '''-DCMAKE_INSTALL_PREFIX=/usr/lib/kde4/.'''&lt;br /&gt;
&lt;br /&gt;
Увидеть установленный плазмоид в работе можно после перезапуска ''Plasma'' (или с помощью утилиты ''plasmoidviewer'', о которой будет сказано ниже). Выполняется он очень просто – двумя командами из окна консоли от имени обычного пользователя:&lt;br /&gt;
&lt;br /&gt;
  kquitapp plasma&lt;br /&gt;
  plasma&lt;br /&gt;
&lt;br /&gt;
Не вздумайте закрывать окно консоли, скомандовав ''kquitapp plasma''! В этом случае вы рискуете остаться один на один с серым&lt;br /&gt;
экраном, и вот тогда уже для продолжения работы придется перезапускать систему. После рестарта ''Plasma'' апплет '''Add Widget''' должен «увидеть» новый плазмоид (рис. 1), а мы сможем добавить наше&lt;br /&gt;
творение на рабочий стол и прочитать содержимое файла '''/proc/cpuinfo''' (рис. 2).&lt;br /&gt;
&lt;br /&gt;
{{Врезка |Содержание=[[Изображение:LXF109_82_2.jpg|300px|Рис. 2]] Рис. 2 Плазмоид в деле. | Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
===Управляемый виджет===&lt;br /&gt;
&lt;br /&gt;
Большинство плазмоидов KDE 4 делают практически то же, что и&lt;br /&gt;
наш «первый блин» – просто показывают пользователю какие-то данные. Справедливости ради надо сказать, что плазмоиды редко отображают статичную информацию, как в нашем примере: чаще данные считываются из какого-то динамического источника&lt;br /&gt;
с регулярными интервалами. KDE 4 предоставляет специальный механизм для работы с такими источниками данных (об этом&lt;br /&gt;
мы поговорим в следующей статье). Сейчас же мы напишем еще&lt;br /&gt;
один простой плазмоид, но на сей раз добавим в него элементы&lt;br /&gt;
управления, а точнее, один-единственный виджет – строку ввода.&lt;br /&gt;
Плазмоид будет выполнять набранные в нем команды Linux (как&lt;br /&gt;
это всегда бывает в учебных программах, функциональность не&lt;br /&gt;
оригинальна, но реализация – поучительна). За основу в нашем&lt;br /&gt;
примере взят плазмоид ''applet-runner'', написанный Себастьяном&lt;br /&gt;
Кжижковяком [Sebastian Krzyszkowiak].&lt;br /&gt;
&lt;br /&gt;
Изначальный вариант плазмоида был рассчитан на KDE 4.0.x. Я&lt;br /&gt;
добавил в него вызов некоторых методов, реализованных в более&lt;br /&gt;
поздних версиях KDE 4, но на всякий случай закомментировал их,&lt;br /&gt;
снабдив соответствующими пояснениями. Если вы работаете с более&lt;br /&gt;
новой версией KDE 4 и хотите поэкспериментировать, можете раскомментировать эти вызовы.&lt;br /&gt;
&lt;br /&gt;
При написании плазмоидов с элементами управления возникает соблазн воспользоваться стандартными виджетами из библиотек&lt;br /&gt;
''Qt/KDE'', однако на данном этапе развития KDE 4 это может привести&lt;br /&gt;
к краху системы. Помимо прочего, следует учесть, что для стандартного объекта-виджета трудно подобрать достойного «родителя». Главный класс плазмоида является потомком '''QGraphicsWidget''',&lt;br /&gt;
который не происходит от '''QWidget. QGraphicsWidget''' появился в&lt;br /&gt;
библиотеке ''Qt 4.2'' как компромиссное решение, которое позднее&lt;br /&gt;
утратило свою актуальность. С самого начала разработчики ''Graphics View Framework'' понимали, что программисты захотят встраивать&lt;br /&gt;
виджеты в графические сцены, однако механизм для этого в ''Qt 4.2''&lt;br /&gt;
реализован не был (он появился в ''Qt 4.4''). Вместо него разработчики&lt;br /&gt;
ввели класс '''QGraphicsWidget''', который, как и все классы-элементы&lt;br /&gt;
графической сцены, является потомком класса '''QGraphicsItem''', но&lt;br /&gt;
при этом содержит ряд методов, подобных методам класса '''QWidget'''.&lt;br /&gt;
Предполагалось, что класс '''QGraphicsWidget''' поможет программистам портировать виджеты на систему '''QGraphicsItem'''. Позднее&lt;br /&gt;
разработчики пришли к более логичному решению – встраиванию&lt;br /&gt;
уже готовых «настоящих» виджетов, потомков класса '''QWidget''', но&lt;br /&gt;
система ''Plasma'', по крайней мере, в нынешнем своем воплощении,&lt;br /&gt;
реализует более ранний подход.&lt;br /&gt;
&lt;br /&gt;
Так или иначе, в настоящее время в апплетах для ''Plasma'' рекомендуется использовать виджеты, определенные в библиотеке&lt;br /&gt;
'''libplasma: Plasma::CheckBox, Plasma::ComboBox, Plasma::GroupBox, Plasma::Label, Plasma::LineEdit, Plasma::TextEdit, Plasma::PushButton, Plasma::RadioButton'''. Все эти классы, в конечном счете, являются&lt;br /&gt;
потомками класса '''QGrapihcsItem''' (а не '''QWidget'''), однако с виджетами, которые они реализуют, нельзя выполнять многие операции, допустимые при работе с объектами других классов-потомков&lt;br /&gt;
'''QGrapihcsItem'''.&lt;br /&gt;
&lt;br /&gt;
{{Врезка |Содержание=[[Изображение:LXF109_83_1.jpg|300px|Рис. 3]]Рис. 3. Плазмоид с элементами управления.| Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Наш плазмоид использует виджет '''Plasma::LineEdit''' для ввода команд. В моей системе этот виджет объявлен в заголовочном файле '''&amp;lt;plasma/widgets/lineedit.h&amp;gt;''', а вашей он может&lt;br /&gt;
быть объявлен в файле '''&amp;lt;Plasma/Widgets/LineEdit&amp;gt;'''. Объект класса&lt;br /&gt;
'''Plasma::LineEdit''' создается в методе '''init()''' главного объекта плазмоида (наконец-то он нам пригодился!):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;spurce lang=cpp&amp;gt;&lt;br /&gt;
  void PlasmaRunner::init() {&lt;br /&gt;
    pole = new Plasma::LineEdit(this);&lt;br /&gt;
    pole-&amp;gt;setPlainText(&amp;quot;&amp;quot;);&lt;br /&gt;
    pole-&amp;gt;setDefaultTextColor(QColor(&amp;quot;black&amp;quot;));&lt;br /&gt;
    connect(pole, SIGNAL(editingFinished()), this, SLOT(run()));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Мы работаем с '''Plasma::LineEdit''' как с обычным виджетом –&lt;br /&gt;
создаем объект, настраиваем его внешний вид, связываем сигнал объекта-виджета со слотом. В более поздних версиях KDE 4&lt;br /&gt;
у класса '''Plasma::LineEdit''' появляется метод ''setStyleSheet()'', который позволяет настраивать внешний вид с помощью стандартного описания стиля. Если вы работаете в такой версии KDE 4, можете&lt;br /&gt;
использовать его для придания строке ввода желаемого экстерьера, мы же воздержимся ради универсальности.&lt;br /&gt;
&lt;br /&gt;
Метод '''paintInterface()''' плазмоида с элементами управления&lt;br /&gt;
интересен тем, что объединяет отображение виджета с выводом&lt;br /&gt;
графики (в нашем случае – поясняющей подписи) с помощью объекта '''QPainter''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
  void PlasmaRunner::paintInterface(QPainter *p,&lt;br /&gt;
          const QStyleOptionGraphicsItem *option, const QRect &amp;amp;contentsRect) {&lt;br /&gt;
    p-&amp;gt;setRenderHint(QPainter::SmoothPixmapTransform);&lt;br /&gt;
    p-&amp;gt;setRenderHint(QPainter::Antialiasing);&lt;br /&gt;
    p-&amp;gt;save();&lt;br /&gt;
    p-&amp;gt;setPen(Qt::black);&lt;br /&gt;
    if (formFactor() == Plasma::Planar || formFactor() == Plasma::MediaCenter) {&lt;br /&gt;
    p-&amp;gt;drawText(contentsRect, Qt::AlignTop, i18n(&amp;quot;Run command:&amp;quot;));&lt;br /&gt;
    pole-&amp;gt;setGeometry(QRectF(0, 20, contentsRect.width(), contentsRect.height() ));&lt;br /&gt;
  } else {&lt;br /&gt;
    pole-&amp;gt;setGeometry(QRectF(0, 5, contentsRect.width(),contentsRect.height() ));&lt;br /&gt;
  }&lt;br /&gt;
    p-&amp;gt;restore();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Остальные элементы интерактивного плазмоида (рис. 3) похожи на рассмотренные ранее. Чтобы посмотреть, как выглядит и&lt;br /&gt;
работает плазмоид, вовсе не обязательно перезапускать ''Plasma''.&lt;br /&gt;
Специальная утилита ''plasmoidviewer'' позволяет загрузить собранный и установленный плазмоид в обычном окне программы&lt;br /&gt;
KDE (рис. 4). Перед запуском программы ''plasmoidviewer'' следует вызвать программу ''kbuildsycoca4'', которая обновит кэш KDE 4.&lt;br /&gt;
Аргументом ''plasmoidviewer'' должно быть имя плазмоида, но не то,&lt;br /&gt;
которое отображается в апплете '''Add Widgets''', а то, которое указано в параметре '''X-KDE-PluginInfo-Name .desktop'''-файла.&lt;br /&gt;
&lt;br /&gt;
{{Врезка |Содержание=[[Изображение:LXF109_83_2.jpg|300px|Рис. 4]]Рис. 4. Утилита ''plasmoidviewer''.| Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Как было сказано выше, стандартные виджеты ''Qt'' слабо интегрированы в систему плазмоидов. А можно ли использовать расширения ''libplasma'' в обычных ''Qt''-программах вместе с системой ''Graphics View Framework''? Теоретически – да, практически – нет, по крайней мере, пока. Объекты класса '''Plasma::SignalPlotter''' можно заставить&lt;br /&gt;
работать в обычной программе; другие элементы ''libplasma'' либо не&lt;br /&gt;
работают, либо приводят к краху приложения. Будем надеяться, что&lt;br /&gt;
ситуация улучшится в будущих версиях KDE. '''LXF'''&lt;/div&gt;</description>
			<pubDate>Thu, 03 Sep 2009 07:14:02 GMT</pubDate>			<dc:creator>Crazy Rebel</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:LXF109:KDE4</comments>		</item>
	</channel>
</rss>