<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF110%3AKDE4</id>
		<title>LXF110:KDE4 - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF110%3AKDE4"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF110:KDE4&amp;action=history"/>
		<updated>2026-05-13T03:53:14Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF110:KDE4&amp;diff=8808&amp;oldid=prev</id>
		<title>Yaleks в 10:55, 4 октября 2009</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF110:KDE4&amp;diff=8808&amp;oldid=prev"/>
				<updated>2009-10-04T10:55:41Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 10:55, 4 октября 2009&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 12:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 12:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;4.1.x, стабилизируются надолго.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;4.1.x, стабилизируются надолго.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{{Врезка&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Заголовок=Скорая помощь&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Содержание=Файл /proc/meminfo, как&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;и все в директории /proc,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;является&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;виртуальным.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Он не хранится&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;на диске,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;а формируется&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;системой&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;в ответ на наши&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;запросы. Когда&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;мы читаем этот&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;файл, мы получаем данные&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;о состоянии&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;памяти&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;на момент&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;чтения.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Ширина=150px}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как отмечалось в предыдущей статье, информационные расширения Plasma используются в основном для отображения данных, меняющихся во времени – нагрузки на систему, сетевого трафика, прогнозов погоды и т.п. (хотя ничто не мешает использовать плазмоиды и&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как отмечалось в предыдущей статье, информационные расширения Plasma используются в основном для отображения данных, меняющихся во времени – нагрузки на систему, сетевого трафика, прогнозов погоды и т.п. (хотя ничто не мешает использовать плазмоиды и&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;для отображения статических данных, вряд ли пользователи захотят&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;для отображения статических данных, вряд ли пользователи захотят&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 190:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 209:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;/share/kde4/services/. Если эти значения устраивают вашу систему,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;/share/kde4/services/. Если эти значения устраивают вашу систему,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;то все в порядке (для проверки выясните, существует ли в вашей&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;то все в порядке (для проверки выясните, существует ли в вашей&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;системе директория /share/kde4/services/ и хранит ли она уже установленные .desktop-файлы). В моей системе KDE ищет файлы расширений в директориях с теми же именами, что заданы по умолчанию,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;системе директория /share/kde4/services/ и хранит ли она уже установленные .desktop-файлы). В моей системе KDE ищет файлы расширений в директориях с теми же именами, что заданы по умолчанию, но расположенных в /usr, поэтому в самом начале я меняю значение&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;но расположенных в /usr, поэтому в самом начале я меняю значение&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;переменной CMAKE_INSTALL_PREFIX.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;переменной CMAKE_INSTALL_PREFIX.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Изображение:LXF110 86 1.png|200px|thumb|Рис. 1. Утилита Plasma Engine Explorer.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Прежде чем писать для нашего поставщика данных апплет Plasma,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Прежде чем писать для нашего поставщика данных апплет Plasma,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;желательно убедиться, что он работает корректно (иначе мы не&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;желательно убедиться, что он работает корректно (иначе мы не&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 256:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 275:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В первом аргументе слоту dataUpdated() передается имя источника обновляемых данных, во втором – ссылка на объект&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В первом аргументе слоту dataUpdated() передается имя источника обновляемых данных, во втором – ссылка на объект&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Plasma::DataEngine::Data, который содержит сами данные. Схему взаимодействия между плазмоидом и поставщиком данных можно отобразить графически (рис. 2).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Plasma::DataEngine::Data, который содержит сами данные. Схему взаимодействия между плазмоидом и поставщиком данных можно отобразить графически (рис. 2).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Изображение:LXF110 87 1.png|200px|thumb|center|Рис. 2. Взаимодействие плазмоида с поставщиком данных.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Метод dataUpdated() в классе нашего апплета реализован просто:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Метод dataUpdated() в классе нашего апплета реализован просто:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 269:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 289:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;апплет перерисовывает свое окно (метод paintInterface() выводит значения переменных m_mf и m_bs).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;апплет перерисовывает свое окно (метод paintInterface() выводит значения переменных m_mf и m_bs).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Изображение:LXF110 87 2.png|200px|thumb|Рис. 3. Утилита Add Widgets.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Остановимся подробнее на классе Plasma::DataEngine::Data. Он&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Остановимся подробнее на классе Plasma::DataEngine::Data. Он&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;создан на основе ассоциативного контейнера QHash (LXF102). Для&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;создан на основе ассоциативного контейнера QHash (&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[[&lt;/ins&gt;LXF102&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;:Qt4|LXF102]]&lt;/ins&gt;). Для&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;извлечения данных из контейнера мы используем метод value().&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;извлечения данных из контейнера мы используем метод value().&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Первый аргумент – ключ (у нас – название источника данных), второй&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Первый аргумент – ключ (у нас – название источника данных), второй&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 286:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 307:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Add Widgets (рис 3).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Add Widgets (рис 3).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Изображение:LXF110 87 3.png|200px|thumb|Рис. 4. Плазмоид MemInfo.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Плазмоиды, возможно, не самая увлекательная, но весьма оригинальная черта новой версии KDE. В следующий же раз мы займемся&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Плазмоиды, возможно, не самая увлекательная, но весьма оригинальная черта новой версии KDE. В следующий же раз мы займемся&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вещами не увлекательными и не оригинальными, но необходимыми –&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вещами не увлекательными и не оригинальными, но необходимыми –&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;интернационализацией проектов KDE 4.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;интернационализацией проектов KDE 4.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF110:KDE4&amp;diff=8566&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/KDE4}} == Поставщики данных == : ''ЧАСТЬ 3 Плазмоид из проекта прошлого месяца был статичным и только з...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF110:KDE4&amp;diff=8566&amp;oldid=prev"/>
				<updated>2009-08-25T17:12:46Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/KDE4}} == Поставщики данных == : &amp;#039;&amp;#039;ЧАСТЬ 3 Плазмоид из проекта прошлого месяца был статичным и только з...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/KDE4}}&lt;br /&gt;
== Поставщики данных ==&lt;br /&gt;
: ''ЧАСТЬ 3 Плазмоид из проекта прошлого месяца был статичным и только зря занимал место на рабочем столе. Чтобы быть по-настоящему полезным, апплет должен отображать постоянно меняющиеся сведения – этим сегодня и займется '''Андрей Боровский'''.''&lt;br /&gt;
&lt;br /&gt;
Идеология разделения данных и интерфейса, заметно изменившая структуру Qt 4, теперь овладела умами разработчиков KDE. Для расширений Plasma предлагается единый&lt;br /&gt;
механизм доступа к данным – “data engines”, которые я буду называть «поставщиками данных». Получая данные из разных источников,&lt;br /&gt;
поставщики передают их апплетам KDE Plasma (плазмоидам) с помощью унифицированного интерфейса. Следует сразу оговориться, что&lt;br /&gt;
этот интерфейс до сих пор не принял законченную форму, так что в&lt;br /&gt;
примерах к данной статье мы рассмотрим сразу несколько вариантов,&lt;br /&gt;
которые следует применять в KDE 4.0.x и KDE 4.1.x (разумеется, ветка 4.0 уходит в прошлое, но на данный момент это может быть единственный работоспособный вариант KDE 4 для вашего дистрибутива).&lt;br /&gt;
Будем надеяться, что интерфейсы libplasma, используемые в KDE&lt;br /&gt;
4.1.x, стабилизируются надолго.&lt;br /&gt;
&lt;br /&gt;
Как отмечалось в предыдущей статье, информационные расширения Plasma используются в основном для отображения данных, меняющихся во времени – нагрузки на систему, сетевого трафика, прогнозов погоды и т.п. (хотя ничто не мешает использовать плазмоиды и&lt;br /&gt;
для отображения статических данных, вряд ли пользователи захотят&lt;br /&gt;
загромождать свои виртуальные рабочие столы такими апплетами).&lt;br /&gt;
В принципе, для создания динамического плазмоида не обязательно&lt;br /&gt;
использовать поставщики данных (мы ведь обошлись без них в прошлый раз, когда программировали статический плазмоид!). Можно&lt;br /&gt;
организовать обновление с помощью таймера, однако использование поставщиков данных не только более удобно и создает меньшую&lt;br /&gt;
нагрузку на систему, но и гарантирует нашему плазмоиду более долгую жизнь и широкое признание.&lt;br /&gt;
&lt;br /&gt;
Подобно всем расширениям KDE, поставщики данных представляют собой разделяемые библиотеки, экспортирующие несколько классов. Каждый поставщик имеет один или несколько источников данных (data sources). Источники выдают данные в виде пар «ключ – значение», причем один источник может предоставлять несколько таких&lt;br /&gt;
пар. Ключ – просто строка латинских символов, а значение может&lt;br /&gt;
принадлежать самым разным типам (для его передачи используется&lt;br /&gt;
QVariant). Все данные одного поставщика хранятся в глобальной хэш-таблице (контейнер QHash).&lt;br /&gt;
&lt;br /&gt;
В качестве примера мы рассмотрим поставщик данных, предоставляющий заинтересованным расширениям Plasma информацию о&lt;br /&gt;
состоянии оперативной памяти системы (ее мы почерпнем из файла&lt;br /&gt;
/proc/meminfo). Данные о нагрузке на память – это как раз тот тип&lt;br /&gt;
динамически меняющейся информации, для представления которой&lt;br /&gt;
удобно использовать плазмоиды. В частности, наш поставщик данных позволит апплетам получать информацию об объеме свободной&lt;br /&gt;
оперативной памяти и количестве выделенных буферов.&lt;br /&gt;
&lt;br /&gt;
=== Пишем библиотеку поставщика ===&lt;br /&gt;
Основной класс поставщика данных должен быть потомком&lt;br /&gt;
Plasma::DataEngine, который объявлен в заголовочном файле Plasma/DataEngine (или plasma/dataengine.h). Ниже приведен текст основного класса нашего поставщика данных, TestDataEngine:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;class TestDataEngine : public Plasma::DataEngine {&lt;br /&gt;
Q_OBJECT&lt;br /&gt;
public:&lt;br /&gt;
TestDataEngine(QObject* parent, const QVariantList&amp;amp; args);&lt;br /&gt;
void init();&lt;br /&gt;
protected:&lt;br /&gt;
bool sourceRequestEvent(const QString&amp;amp; name);&lt;br /&gt;
bool updateSourceEvent(const QString&amp;amp; source);&lt;br /&gt;
bool sourceRequested(const QString&amp;amp; name);&lt;br /&gt;
bool updateSource(const QString&amp;amp; source);&lt;br /&gt;
};&amp;lt;/source&amp;gt;&lt;br /&gt;
Ради обеспечения обратной совместимости класс TestDataEngine&lt;br /&gt;
спроектирован по принципу «два в одном». Дело в том, что интерфейс класса Plasma::DataEngine претерпел при переходе от libplasma&lt;br /&gt;
1.0.x к libplasma 1.1 некоторые изменения. В обеих версиях библиотеки нам приходится перекрывать два виртуальных метода: один&lt;br /&gt;
вызывается системой для создания источника данных, другой – для&lt;br /&gt;
обновления данных уже созданного источника. В разных версиях&lt;br /&gt;
библиотеки libplasma эти методы именуются по-разному. В старой&lt;br /&gt;
версии для регистрации источников данных используется метод&lt;br /&gt;
sourceRequested(), а для обновления – метод updateSource(). В новой&lt;br /&gt;
версии для тех же целей вызываются методы sourceRequestEvent() и&lt;br /&gt;
updateSourceEvent(). В классе TestDataEngine мы реализуем оба набора методов (благо они друг другу не мешают).&lt;br /&gt;
&lt;br /&gt;
Кроме перечисленных четырех методов, у нашего класса есть еще&lt;br /&gt;
конструктор и метод init(). Как следует из названия, система вызывает его для инициализации элементов поставщика данных, которые&lt;br /&gt;
нельзя настроить в конструкторе. Перейдем к реализации класса:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;TestDataEngine::TestDataEngine(QObject* parent, const QVariantList&amp;amp;args)&lt;br /&gt;
: Plasma::DataEngine(parent) {&lt;br /&gt;
setMinimumUpdateInterval(1000);&lt;br /&gt;
}&lt;br /&gt;
void TestDataEngine::init() {&lt;br /&gt;
updateSource(&amp;quot;MemFree&amp;quot;);&lt;br /&gt;
updateSource(&amp;quot;Buffers&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
bool TestDataEngine::sourceRequestEvent(const QString &amp;amp;name) {&lt;br /&gt;
return updateSourceEvent(name);&lt;br /&gt;
}&lt;br /&gt;
bool TestDataEngine::sourceRequested(const QString &amp;amp;name) {&lt;br /&gt;
return updateSourceEvent(name);&lt;br /&gt;
}&lt;br /&gt;
bool TestDataEngine::updateSource(const QString &amp;amp;name) {&lt;br /&gt;
return updateSourceEvent(name);&lt;br /&gt;
}&lt;br /&gt;
bool TestDataEngine::updateSourceEvent(const QString &amp;amp;name) {&lt;br /&gt;
QFile file(&amp;quot;/proc/meminfo&amp;quot;);&lt;br /&gt;
file.open(QIODevice::ReadOnly);&lt;br /&gt;
char line[256];&lt;br /&gt;
while (file.readLine(line, 256) != 0) {&lt;br /&gt;
QString s = line;&lt;br /&gt;
if (s.indexOf(name) &amp;gt;= 0) {&lt;br /&gt;
setData(name, s);&lt;br /&gt;
file.close();&lt;br /&gt;
return true;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
file.close();&lt;br /&gt;
return false;&lt;br /&gt;
}&lt;br /&gt;
K_EXPORT_PLASMA_DATAENGINE(testde, TestDataEngine)&lt;br /&gt;
#include &amp;quot;testde.moc&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
Разбор исходного текста начнем с метода updateSourceEvent(),&lt;br /&gt;
поскольку в нем сосредоточено все самое интересное. В единственном параметре этого метода система передает имя требуемого источника данных. Если метод updateSourceEvent() может обновить данные&lt;br /&gt;
запрашиваемого источника, он возвращает значение true, в противном случае – false.&lt;br /&gt;
&lt;br /&gt;
Данные о состоянии памяти в файле /proc/meminfo представлены&lt;br /&gt;
в виде пар&lt;br /&gt;
 ПАРАМЕТР=ЗНАЧЕНИЕ&lt;br /&gt;
Наш поставщик рассматривает каждый параметр как отдельный&lt;br /&gt;
источник данных, благодаря чему плазмоиды могут получать значения только интересующих их величин, игнорируя все остальное.&lt;br /&gt;
Таким образом, количество источников данных, предоставляемых&lt;br /&gt;
нашим поставщиком, соответствует количеству параметров в файле /proc/meminfo (на практике мы не делаем доступными все возможные источники данных). Получив имя источника, наш метод&lt;br /&gt;
updateSourceEvent() ищет в файле /proc/meminfo строку с соответствующим параметром. Если она найдена, метод возвращает значение true, иначе – false. Сами данные передаются вызывающему приложению с помощью метода setData() класса Plasma::DataEngine. Он&lt;br /&gt;
существует в двух перегруженных вариантах. Первый принимает три&lt;br /&gt;
параметра – имя источника данных, ключ и значение, второй – два&lt;br /&gt;
(имя источника и значение). Имя источника и ключ передаются в&lt;br /&gt;
строке QString, сами данные – в параметре типа QVariant.&lt;br /&gt;
&lt;br /&gt;
Чтобы понять дальнейшее, нужно ясно представлять себе, что&lt;br /&gt;
делает метод setData() – а он добавляет данные в глобальную таблицу. Если источник с указанным именем уже существует, связанные с&lt;br /&gt;
ним данные обновляются. Если источника не существует, он будет&lt;br /&gt;
создан. Далее апплет Plasma извлекает нужные данные из коллекции,&lt;br /&gt;
используя имя источника. Таким образом, метод setData() используется как для обновления данных уже существующего источника, так&lt;br /&gt;
и для создания нового. В нашем примере для регистрации источников&lt;br /&gt;
данных и обновления используется один и тот же код, так что методы&lt;br /&gt;
sourceRequestEvent(), sourceRequested(), updateSource() просто вызывают метод updateSourceEvent(). Напомню, что если вы пользуетесь&lt;br /&gt;
библиотеками KDE 4.1.x или более поздними, вы можете удалить объявления и реализации методов sourceRequested() и updateSource().&lt;br /&gt;
&lt;br /&gt;
Регистрация источников данных выполняется в методе init() (так,&lt;br /&gt;
по крайней мере, требует KDE 4.0.x). В этом методе мы два раза&lt;br /&gt;
вызываем метод updateSourceEvent(), один раз – для параметра&lt;br /&gt;
MemFree (свободная память), другой раз – для Buffers. В результате мы создаем два источника данных, MemFree и Buffers, которые&lt;br /&gt;
предоставляют доступ к значениям одноименных параметров файла&lt;br /&gt;
/proc/meminfo (мы могли бы зарегистрировать больше источников, но&lt;br /&gt;
для простоты примера ограничимся этими двумя).&lt;br /&gt;
&lt;br /&gt;
В конструкторе класса мы вызываем метод&lt;br /&gt;
setMinimumUpdateInterval(), который устанавливает минимальный&lt;br /&gt;
интервал обновления данных поставщика (в миллисекундах). Это&lt;br /&gt;
позволяет нам снизить нагрузку на систему, что особенно важно в тех&lt;br /&gt;
случаях, когда получение данных связано с серьезными затратами&lt;br /&gt;
ресурсов. Забегая вперед, отметим, что плазмоид может запрашивать&lt;br /&gt;
данные и с более высокой частотой, но их фактическое обновление&lt;br /&gt;
(вызов метода updateSourceEvent()) будет происходить не чаще, чем&lt;br /&gt;
было указано с помощью setMinimumUpdateInterval().&lt;br /&gt;
&lt;br /&gt;
Макрос K_EXPORT_PLASMA_DATAENGINE() спасает нас от необходимости рутинно объявлять вспомогательные классы, необходимые для экспорта главного класса поставщика данных. Его первый&lt;br /&gt;
аргумент – имя поставщика, под которым он будет известен системе&lt;br /&gt;
Plasma, второй – имя главного класса.&lt;br /&gt;
&lt;br /&gt;
Подобно плазмоиду, поставщик данных нуждается в .desktop-файле. Вот как может выглядеть его простой (без интернационализации) вариант для нашего тестового поставщика:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;[Desktop Entry]&lt;br /&gt;
Name=Test Data Engine&lt;br /&gt;
Comment=Test Data Engine&lt;br /&gt;
Type=Service&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/DataEngine&lt;br /&gt;
X-KDE-Library=plasma_engine_testde&lt;br /&gt;
X-Plasma-EngineName=testde&lt;br /&gt;
X-KDE-PluginInfo-Author=Andrei Borovsky&lt;br /&gt;
X-KDE-PluginInfo-Email=&lt;br /&gt;
X-KDE-PluginInfo-Name=testde&lt;br /&gt;
X-KDE-PluginInfo-Version=0.1&lt;br /&gt;
X-KDE-PluginInfo-Website=&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=LGPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&amp;lt;/source&amp;gt;&lt;br /&gt;
Параметру X-KDE-ServiceTypes присваивается значение Plasma/DataEngine (поставщик данных Plasma). X-KDE-Library устанавливается равным plasma_engine_testde (наш поставщик данных будет&lt;br /&gt;
размещен в библиотеке plasma_engine_testde.so), для X-Plasma-EngineName (имя, под которым поставщик данных будет доступен&lt;br /&gt;
Plasma) выбрано значение testde. Наконец, для X-KDE-PluginInfo-EnabledByDefault установлено значение true.&lt;br /&gt;
&lt;br /&gt;
Нам осталось написать файл CMakeLists.txt для сборки нашего&lt;br /&gt;
проекта. Вот он:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;project(plasma-testde)&lt;br /&gt;
set(CMAKE_INSTALL_PREFIX /usr/)&lt;br /&gt;
find_package(Qt4 REQUIRED)&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(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}&lt;br /&gt;
${KDE4_INCLUDES} )&lt;br /&gt;
set(testde_engine_SRCS testde.cpp)&lt;br /&gt;
kde4_add_plugin(plasma_engine_testde ${testde_engine_SRCS})&lt;br /&gt;
target_link_libraries(plasma_engine_testde ${KDE4_KDECORE_LIBS}&lt;br /&gt;
${PLASMA_LIBS})&lt;br /&gt;
install(TARGETS plasma_engine_testde DESTINATION ${PLUGIN_INSTALL_DIR})&lt;br /&gt;
install(FILES plasma-dataengine-testde.desktop DESTINATION&lt;br /&gt;
${SERVICES_INSTALL_DIR})&amp;lt;/source&amp;gt;&lt;br /&gt;
Как видно, он похож на мета-проект из предыдущей статьи, так&lt;br /&gt;
что подробно останавливаться на его содержимом мы не будем.&lt;br /&gt;
Отметим только необходимость правильно указывать директории&lt;br /&gt;
для установки библиотеки поставщика. По умолчанию переменная&lt;br /&gt;
PLUGIN_INSTALL_DIR, используемая в команде install(), содержит&lt;br /&gt;
значение /lib/kde4/. Подобно этому, переменная SERVICES_INSTALL_DIR (которая указывает путь для установки .desktop-файла) содержит&lt;br /&gt;
/share/kde4/services/. Если эти значения устраивают вашу систему,&lt;br /&gt;
то все в порядке (для проверки выясните, существует ли в вашей&lt;br /&gt;
системе директория /share/kde4/services/ и хранит ли она уже установленные .desktop-файлы). В моей системе KDE ищет файлы расширений в директориях с теми же именами, что заданы по умолчанию,&lt;br /&gt;
но расположенных в /usr, поэтому в самом начале я меняю значение&lt;br /&gt;
переменной CMAKE_INSTALL_PREFIX.&lt;br /&gt;
&lt;br /&gt;
Прежде чем писать для нашего поставщика данных апплет Plasma,&lt;br /&gt;
желательно убедиться, что он работает корректно (иначе мы не&lt;br /&gt;
будем знать, где ошиблись – в поставщике или в плазмоиде). Для&lt;br /&gt;
тестирования поставщика tested мы можем воспользоваться утилитой plasmaengineexplorer, которая играет в разработке поставщиков&lt;br /&gt;
данных ту же роль, что и plasmoidviewer для плазмоидов.&lt;br /&gt;
&lt;br /&gt;
После завершения сборки поставщика данных testde командуем&lt;br /&gt;
 sudo make install&lt;br /&gt;
далее перезапускаем Plasma с помощью последовательности&lt;br /&gt;
 kquitapp plasma&lt;br /&gt;
 plasma&lt;br /&gt;
и открываем утилиту plasmaengineexplorer (рис. 1).&lt;br /&gt;
&lt;br /&gt;
Раскрывающийся список в верхней части окна утилиты содержит&lt;br /&gt;
перечень установленных поставщиков данных. Если установка нашего&lt;br /&gt;
поставщика прошла успешно, в этом списке должен быть пункт testde.&lt;br /&gt;
В окне plasmaengineexplorer отображается список источников данных,&lt;br /&gt;
предоставляемых выбранным поставщиком. В нашем случае это два&lt;br /&gt;
источника данных, зарегистрированных в методе init(). Над окном с&lt;br /&gt;
перечнем источников данных расположены строка ввода и наборный&lt;br /&gt;
счетчик. Если вы хотите проверить, как выполняется обновление данных, укажите в строке ввода имя источника данных, а в наборном&lt;br /&gt;
счетчике – интервал обновления, и щелкните кнопку Request.&lt;br /&gt;
&lt;br /&gt;
=== Красивый интерфейс ===&lt;br /&gt;
Для окончательной победы над апплетами Plasma нам осталось написать плазмоид, использующий данные, предоставляемые поставщиком testde. Я назвал его meminfo, а полные исходные тексты можно&lt;br /&gt;
найти в файле meminfo.tar.gz на LXFDVD. На момент написания этой&lt;br /&gt;
статьи разработчики KDE еще не представили руководства по созданию плазмоидов такого типа, хотя wiki-затравка на сайте проекта&lt;br /&gt;
висит уже не первый месяц. Описание, которое приводится ниже,&lt;br /&gt;
составлено исключительно на основе исходных текстов плазмоидов,&lt;br /&gt;
поставляемых вместе с KDE. Возможно, используемые здесь интерфейсы будут меняться со временем. Перед тем, как сесть писать&lt;br /&gt;
собственный плазмоид, я советую вам изучить заголовочные файлы plasma/dataengine.h и plasma/dataenginemanager.h из последнего&lt;br /&gt;
релиза KDE, а также исходные тексты плазмоидов из него же (апплеты и поставщики данных содержатся в пакетах kdebase-workspace).&lt;br /&gt;
&lt;br /&gt;
Для подключения к поставщику данных необходимо создать&lt;br /&gt;
экземпляр его класса. Мы делаем это с помощью метода dataEngine(),&lt;br /&gt;
которому передается имя поставщика (альтернативный вариант –&lt;br /&gt;
вызов метода loadDataEngine() объекта Plasma::DataEngineManager).&lt;br /&gt;
В любом случае, вы получите указатель на объект класса&lt;br /&gt;
Plasma::DataEngine, который на самом деле является объектом главного класса загруженного поставщика данных (напомню, что все они&lt;br /&gt;
происходят от Plasma::DataEngine). В разных версиях KDE эти методы&lt;br /&gt;
работают несколько по-разному, так что не бойтесь экспериментировать. Если для получения указателя на объект поставщика класса&lt;br /&gt;
вы используете метод loadDataEngine(), то для повторного получения&lt;br /&gt;
указателя на этот объект следует вызывать метод dataEngine() объекта Plasma::DataEngineManager. После того, как мы получили доступ к&lt;br /&gt;
главному объекту поставщика данных, можно подключиться к нему,&lt;br /&gt;
используя метод connectSource(). Вот как это делается в плазмоиде&lt;br /&gt;
meminfo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;void MemInfo::init() {&lt;br /&gt;
dataEngine(&amp;quot;testde&amp;quot;)-&amp;gt;connectSource(&amp;quot;MemFree&amp;quot;, this, 1000);&lt;br /&gt;
dataEngine(&amp;quot;testde&amp;quot;)-&amp;gt;connectSource(&amp;quot;Buffers&amp;quot;, this, 1000);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Мы подключаемся к обоим источникам данных, которые регистрирует поставщик. В первом аргументе метода connectSource()&lt;br /&gt;
передается имя источника данных, во втором – указатель на объект&lt;br /&gt;
плазмоида, выполняющий визуализацию данных (то есть на главный&lt;br /&gt;
объект плазмоида, тот, что происходит от Plasma::Applet). В третьем&lt;br /&gt;
параметре указывается интервал обновления данных в миллисекундах. В нашем примере плазмоид задает тот же интервал обновления,&lt;br /&gt;
что и в поставщике данных, хотя это, напомню, необязательно. Что&lt;br /&gt;
происходит в процессе вызова метода connectSource()? Главный объект загруженного поставщика данных связывает один из своих сигналов со слотом dataUpdated(), каковой мы должны реализовать в главном классе плазмоида. Напомню, что слоты в Qt могут вызваться по&lt;br /&gt;
имени и списку аргументов, как и любые методы, помеченные макросом Q_INVOKABLE. Благодаря этому поставщик данных может вызывать слот, у которого нет прототипа в базовом классе Plasma::Applet.&lt;br /&gt;
Заголовок слота dataUpdated() должен выглядеть так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;void dataUpdated(const QString&amp;amp;, const Plasma::DataEngine::Data&amp;amp;)&amp;lt;/source&amp;gt;&lt;br /&gt;
В первом аргументе слоту dataUpdated() передается имя источника обновляемых данных, во втором – ссылка на объект&lt;br /&gt;
Plasma::DataEngine::Data, который содержит сами данные. Схему взаимодействия между плазмоидом и поставщиком данных можно отобразить графически (рис. 2).&lt;br /&gt;
&lt;br /&gt;
Метод dataUpdated() в классе нашего апплета реализован просто:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;void MemInfo::dataUpdated(const QString &amp;amp;name, const&lt;br /&gt;
Plasma::DataEngine::Data &amp;amp;data){&lt;br /&gt;
m_mf = data.value(&amp;quot;MemFree&amp;quot;, m_mf).toString();&lt;br /&gt;
m_bs = data.value(&amp;quot;Buffers&amp;quot;, m_bs).toString();&lt;br /&gt;
update();&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Мы извлекаем обновленные данные из контейнера&lt;br /&gt;
Plasma::DataEngine::Data и помещаем их в переменные типа QString&lt;br /&gt;
m_mf и m_bs, а затем вызываем метод update(), в результате чего&lt;br /&gt;
апплет перерисовывает свое окно (метод paintInterface() выводит значения переменных m_mf и m_bs).&lt;br /&gt;
&lt;br /&gt;
Остановимся подробнее на классе Plasma::DataEngine::Data. Он&lt;br /&gt;
создан на основе ассоциативного контейнера QHash (LXF102). Для&lt;br /&gt;
извлечения данных из контейнера мы используем метод value().&lt;br /&gt;
Первый аргумент – ключ (у нас – название источника данных), второй&lt;br /&gt;
(необязательный) аргумент – переменная, значение которой должен&lt;br /&gt;
вернуть метод value() в случае, если с заданным ключом не связаны&lt;br /&gt;
никакие данные. Иначе говоря, в строке&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;m_mf = data.value(&amp;quot;MemFree&amp;quot;, m_mf).toString();&amp;lt;/source&amp;gt;&lt;br /&gt;
мы присваиваем переменной m_mf значение, связанное с ключом&lt;br /&gt;
“MemFree”, если оно существует; в противном же случае сохраняем&lt;br /&gt;
прежнее значение m_mf. Все это нужно постольку, поскольку при&lt;br /&gt;
каждом вызове dataUpdate() методу передаются лишь те данные,&lt;br /&gt;
обновление которых послужило его причиной, то есть данные только&lt;br /&gt;
одного источника. С остальными элементами плазмоида мы уже знакомы. После применения CMake сборка апплета выполняется командой make, а установка – sudo make install (после этого следует перезапустить KDE). Мы можем посмотреть, как работает апплет, в окне&lt;br /&gt;
plasmoidviewer или добавить его на рабочий стол с помощью утилиты&lt;br /&gt;
Add Widgets (рис 3).&lt;br /&gt;
&lt;br /&gt;
Плазмоиды, возможно, не самая увлекательная, но весьма оригинальная черта новой версии KDE. В следующий же раз мы займемся&lt;br /&gt;
вещами не увлекательными и не оригинальными, но необходимыми –&lt;br /&gt;
интернационализацией проектов KDE 4.&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>