<?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=LXF107%3AQt4</id>
		<title>LXF107:Qt4 - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF107%3AQt4"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Qt4&amp;action=history"/>
		<updated>2026-05-13T03:53:23Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Qt4&amp;diff=8495&amp;oldid=prev</id>
		<title>Yaleks в 17:30, 22 августа 2009</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Qt4&amp;diff=8495&amp;oldid=prev"/>
				<updated>2009-08-22T17:30:06Z</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;Версия 17:30, 22 августа 2009&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 33:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 33:&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;Рассмотрим объект, реализующий интерфейс нашего приложениясервера (полный текст вы найдете на диске в архиве '''clipboarviewer.tar.gz'''):&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;Рассмотрим объект, реализующий интерфейс нашего приложениясервера (полный текст вы найдете на диске в архиве '''clipboarviewer.tar.gz'''):&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;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&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;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;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;&amp;#160; #include &amp;lt;QApplication&amp;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;&amp;#160; #include &amp;lt;QApplication&amp;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;&amp;#160; #include &amp;lt;QtCore&amp;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;&amp;#160; #include &amp;lt;QtCore&amp;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;Строка 87:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 87:&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;Перейдем теперь к функции main(), которая создает и регистрирует объект, реализующий интерфейс.&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;Перейдем теперь к функции main(), которая создает и регистрирует объект, реализующий интерфейс.&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;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&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;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;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;&amp;#160; #include &amp;quot;QCBAdapter.h&amp;quot;&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;&amp;#160; #include &amp;quot;QCBAdapter.h&amp;quot;&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;&amp;#160; int main(int argc, char **argv)&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;&amp;#160; int main(int argc, char **argv)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 143:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 143:&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;сможет использовать средства ''Qt'':&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;сможет использовать средства ''Qt'':&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;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&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;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;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;&amp;#160; #include &amp;lt;stdio.h&amp;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;&amp;#160; #include &amp;lt;stdio.h&amp;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;&amp;#160; #include &amp;lt;dbus/dbus.h&amp;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;&amp;#160; #include &amp;lt;dbus/dbus.h&amp;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;Строка 195:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 195:&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;''sendlines'' (возможно, это первая консольная программа ''Qt'', которую вы видите).&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;''sendlines'' (возможно, это первая консольная программа ''Qt'', которую вы видите).&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;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&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;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;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;&amp;#160;&amp;#160; #include &amp;lt;stdio.h&amp;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;&amp;#160;&amp;#160; #include &amp;lt;stdio.h&amp;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;&amp;#160;&amp;#160; #include &amp;lt;QtCore&amp;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;&amp;#160;&amp;#160; #include &amp;lt;QtCore&amp;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;Строка 261:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 261:&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;Вы, наверное, заметили, что в отношении работы с ''D-Bus'' программа ''sendlines'' не проще, чем написанная на языке ''C''. Пришло время показать, как ''Qt'' действительно может упростить работу с ''D-Bus''. В идеале нам просто хотелось бы иметь класс с тем же набором методов, что и у интерфейса удаленного приложения, так, чтобы при вызове метода локального класса вызывался соответствующий метод интерфейса удаленного приложения. В некоторых случаях этот идеал достижим, причем без особых усилий. Это возможно, если у нас есть описание интерфейса на языке '''XML'''. Сейчас же мы рассмотрим более общий вариант решения:&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;Вы, наверное, заметили, что в отношении работы с ''D-Bus'' программа ''sendlines'' не проще, чем написанная на языке ''C''. Пришло время показать, как ''Qt'' действительно может упростить работу с ''D-Bus''. В идеале нам просто хотелось бы иметь класс с тем же набором методов, что и у интерфейса удаленного приложения, так, чтобы при вызове метода локального класса вызывался соответствующий метод интерфейса удаленного приложения. В некоторых случаях этот идеал достижим, причем без особых усилий. Это возможно, если у нас есть описание интерфейса на языке '''XML'''. Сейчас же мы рассмотрим более общий вариант решения:&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;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&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;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;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;&amp;#160;&amp;#160;  #include &amp;lt;QtDebug&amp;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;&amp;#160;&amp;#160;  #include &amp;lt;QtDebug&amp;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;&amp;#160;&amp;#160;  #include &amp;lt;QtCore&amp;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;&amp;#160;&amp;#160;  #include &amp;lt;QtCore&amp;gt;&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=LXF107:Qt4&amp;diff=8481&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Qt4&amp;diff=8481&amp;oldid=prev"/>
				<updated>2009-08-20T11:00:05Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''Программирование в стиле ''Qt''''' Осваиваем технологии, лежащие в основе нашумевшего KDE4&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]] {{Цикл/Qt4}}&lt;br /&gt;
&lt;br /&gt;
==Обмен сообщениями==&lt;br /&gt;
&lt;br /&gt;
'''ЧАСТЬ 6''' За последние годы ''D-Bus'' стал стандартом де-факто для межпроцессного взаимодействия на рабочем столе Linux. Что здесь может предложить ''Qt''? Разбирается '''Андрей Боровский'''.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|left|Заголовок=Минуточку внимания!|Содержание=&lt;br /&gt;
Берясь за ''QtDBus'', имейте в виду: фирменная документация по&lt;br /&gt;
нему зияет пробелами (чего не скажешь о других модулях). Это&lt;br /&gt;
тем более странно, что ''QtDBus'' появился в ''Qt 4'' уже давно. Нет,&lt;br /&gt;
описания классов модуля ''QtDBus'' присутствуют, и довольно подробны, но вот, например, демонстрационное приложение, описанное на странице http://doc.trolltech.com/4.4/qdbusadaptorexample.html, не только не работает, но даже и не компилируется (текст&lt;br /&gt;
этого примера не менялся, кстати, с версии ''Qt 4.2'').|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
В отличие от возможностей ''Qt 4.x'', с которыми мы познакомились ранее, появившийся в ''Qt 4.2'' модуль ''QtDBus'' присутствует только в версиях ''Qt'', предназначенных для Unix-систем. Объясняется это, конечно же, тем, что полнофункциональной версии ''D-Bus'' для Windows не существует (хотя работы в этом направлении ведутся). Мы уже рассматривали архитектуру шины&lt;br /&gt;
''D-Bus'' в [[LXF99:D-Bus|LXF99]], и там была высказана мысль, что программуклиент ''D-Bus'', которая только обращается к сервисам другого приложения, нетрудно написать даже на «голом» ''C''. С сервером дела&lt;br /&gt;
обстоят сложнее: он должен уметь обрабатывать сообщения ''D-Bus'',&lt;br /&gt;
поступающие асинхронно. ''QtDBus'' упрощает решение этой задачи&lt;br /&gt;
настолько, насколько это вообще возможно. В качестве демонстрации возможностей ''QtDBus'' мы напишем программу-сервер, которая&lt;br /&gt;
будет предоставлять доступ к буферу обмена X-Window консольным приложениям. Во времена господства MS-DOS и Windows 3.1&lt;br /&gt;
существовал DOSовский текстовый редактор (название я, к сожалению, уже не помню), который, будучи запущен в DOS-окне Windows,&lt;br /&gt;
мог обмениваться данными с буфером обмена Windows. Делалось это с помощью какого-то хитроумного прерывания, и мне тогда&lt;br /&gt;
казалось, что это очень круто. Нечто подобное, только для ''X'', мы сейчас и напишем.&lt;br /&gt;
&lt;br /&gt;
===Программа-сервер===&lt;br /&gt;
&lt;br /&gt;
Каждое приложение-сервер ''D-Bus'' должно предоставлять как&lt;br /&gt;
минимум один интерфейс (то есть описание набора методов, к&lt;br /&gt;
которым можно обратиться при помощи ''D-Bus'' из другого приложения). Интерфейсы ''D-Bus'' предоставляются объектами. И если на&lt;br /&gt;
уровне ''D-Bus'' объект – понятие скорее условное, то при программировании сервера ''D-Bus'' в ''Qt 4'' самый простой способ объявить интерфейс заключается в том, чтобы реализовать класс, предоставляющий требуемый интерфейс, а затем создать объект этого&lt;br /&gt;
класса и зарегистрировать его в качестве поставщика интерфейса.&lt;br /&gt;
Рассмотрим объект, реализующий интерфейс нашего приложениясервера (полный текст вы найдете на диске в архиве '''clipboarviewer.tar.gz'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;QApplication&amp;gt;&lt;br /&gt;
 #include &amp;lt;QtCore&amp;gt;&lt;br /&gt;
 #include &amp;lt;QtDBus&amp;gt;&lt;br /&gt;
 #include &amp;lt;QClipboard&amp;gt;&lt;br /&gt;
 class QCBAdapter: public QDBusAbstractAdaptor&lt;br /&gt;
  {&lt;br /&gt;
      Q_OBJECT&lt;br /&gt;
      Q_CLASSINFO(&amp;quot;D-Bus Interface&amp;quot;, &amp;quot;DBus.Manager.QClipboard&amp;quot;)&lt;br /&gt;
      Q_PROPERTY(QString cbContent READ content WRITE setContent)&lt;br /&gt;
  private:&lt;br /&gt;
      QApplication *app;&lt;br /&gt;
  public:&lt;br /&gt;
      QCBAdapter(QApplication *application)&lt;br /&gt;
         : QDBusAbstractAdaptor(application)&lt;br /&gt;
      {&lt;br /&gt;
        cb = QApplication::clipboard();&lt;br /&gt;
      }&lt;br /&gt;
      Q_INVOKABLE QString content()&lt;br /&gt;
      {&lt;br /&gt;
              printf(&amp;quot;Запрос содержимого буфера обмена\n&amp;quot;);&lt;br /&gt;
              return cb-&amp;gt;text();&lt;br /&gt;
      }&lt;br /&gt;
    Q_INVOKABLE void setContent(const QString &amp;amp;newContent)&lt;br /&gt;
    {&lt;br /&gt;
             printf(&amp;quot;Содержимое буфера обмена изменено\n&amp;quot;);&lt;br /&gt;
        cb-&amp;gt;setText(newContent);&lt;br /&gt;
    }&lt;br /&gt;
 public slots:&lt;br /&gt;
    Q_NOREPLY void emptyClipboard()&lt;br /&gt;
    {&lt;br /&gt;
             cb-&amp;gt;clear();&lt;br /&gt;
    }&lt;br /&gt;
  private:&lt;br /&gt;
            QClipboard * cb;&lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Помимо прочего, мы включаем в исходный текст заголовочный&lt;br /&gt;
файл ''QtDBus''. Кстати, не забудьте добавить строку&lt;br /&gt;
&lt;br /&gt;
 QT += D-Bus&lt;br /&gt;
&lt;br /&gt;
в '''.pro'''-файл вашего приложения. Основой всех классов, реализующих интерфейсы ''D-Bus'', должен быть класс '''QDBusAbstractAdaptor'''. От него и происходит наш класс '''QCBAdapter'''. Макрос '''Q_CLASSINFO()'''&lt;br /&gt;
позволяет определить имя экспортируемого интерфейса в формате, принятом в ''D-Bus'' (один класс может экспортировать несколь-&lt;br /&gt;
ко интерфейсов). Интерфейс нашего класса состоит из свойства&lt;br /&gt;
'''cbContent''', позволяющего получить доступ к текстовому содержимому буфера обмена (если таковое имеется) и вспомогательных функций: '''content()''' – для чтения содержимого буфера обмена и '''setContent()''' – для его записи. Обратите внимание на то, что оба метода помечены макросом '''Q_INVOKABLE'''. Это необходимо&lt;br /&gt;
для того, чтобы программы, которые не умеют выполнять маршаллинг свойств интерфейса, могли обратиться к ним напрямую.&lt;br /&gt;
Остальные элементы класса '''QCBAdapter''' не должны вызвать вопросов. Получив указатель на глобальный объект класса '''QClipboard''', мы манипулируем содержимым буфера обмена с помощью методов&lt;br /&gt;
'''QClipboard::setText()''' и '''clear()'''. Наш интерфейс предназначен для&lt;br /&gt;
чтения и записи только текстовой информации, но консольной программе, скорее всего, большего и не потребуется.&lt;br /&gt;
&lt;br /&gt;
Перейдем теперь к функции main(), которая создает и регистрирует объект, реализующий интерфейс.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;quot;QCBAdapter.h&amp;quot;&lt;br /&gt;
 int main(int argc, char **argv)&lt;br /&gt;
 {&lt;br /&gt;
            QApplication app(argc, argv);&lt;br /&gt;
            QCBAdapter * adapter = new QCBAdapter(&amp;amp;app);&lt;br /&gt;
            QDBusConnection connection = QDBusConnection::connectToBus(QDBusConnection::SessionBus, &amp;quot;DBus.Manager.QClipboard&amp;quot;);&lt;br /&gt;
            if (connection.isConnected())&lt;br /&gt;
                         printf(&amp;quot;Соединение установлено\n&amp;quot;);&lt;br /&gt;
            if (!connection.registerService(&amp;quot;DBus.Manager.QClipboard&amp;quot;)) {&lt;br /&gt;
                         printf(&amp;quot;Не могу зарегистрировать сервис\n&amp;quot;);&lt;br /&gt;
                         exit(1);&lt;br /&gt;
            }&lt;br /&gt;
            if (!connection.registerObject(&amp;quot;/QClipboard&amp;quot;, adapter, QDBusConnection::ExportAllContents)) {&lt;br /&gt;
                         printf(&amp;quot;Не могу зарегистрировать объект\n&amp;quot;);&lt;br /&gt;
                         exit(1);&lt;br /&gt;
            }&lt;br /&gt;
      app.exec();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Прежде всего, обратите внимание на то, что в нашей программе&lt;br /&gt;
отсутствуют графические элементы. Они нам и не нужны – приложение ''ClipboardViewer'' должно выполняться как сервер. При этом следует учесть, что хотя программа ''ClipboardViewer'' не создает никаких&lt;br /&gt;
окон, она связывается с ''X''-сервером (иначе как бы она смогла получить доступ к буферу обмена?), а значит, является полноценным приложением ''X''. После того как мы создали объекты классов '''QApplication''' и '''QCBAdapter''', необходимо выполнить соединение с демоном ''D-Bus''.&lt;br /&gt;
Напомню, что в рамках архитектуры ''D-Bus'' любые две программы&lt;br /&gt;
могут создать собственную шину ''D-Bus'', однако существуют две стандартные шины – системная ''System Bus'' и пользовательская ''Session Bus''. Наш сервер буфера обмена проще всего подключить к пользовательской шине.&lt;br /&gt;
&lt;br /&gt;
Соединение ''Qt''-программы с ''D-Bus'' инкапсулируется объектом&lt;br /&gt;
класса '''QDBusConnection'''. Мы создаем его с помощью статического&lt;br /&gt;
метода '''connectToBus()'''. Вторым аргументом данного метода должно&lt;br /&gt;
быть имя соединения, которое программы-клиенты будут использовать для подключения к нашему серверу. Напомню, что по своей&lt;br /&gt;
структуре оно напоминает доменное имя Интернета, и если бы у&lt;br /&gt;
нашей программы был свой сайт, его имя можно было бы включить&lt;br /&gt;
в имя соединения. Многие имена соединений, не связанные с сайтами, все равно начинаются с префиксов '''org.*''' или '''com.*''', но, как мы покажем на практике, следование этому правилу вовсе не является&lt;br /&gt;
обязательным.&lt;br /&gt;
&lt;br /&gt;
Установив соединение с демоном, мы можем зарегистрировать имя сервиса, предоставляемого нашим сервером. Оно имеет ту же структуру, что и имя соединения, и может совпадать с&lt;br /&gt;
ним (обратите внимание, что имя сервиса должно совпадать с&lt;br /&gt;
именем интерфейса, указанным в объявлении класса адаптера с&lt;br /&gt;
помощью '''Q_CLASSINFO()'''). Как вы уже догадались, регистрация&lt;br /&gt;
сервиса выполняется методом '''registerService()''' объекта класса&lt;br /&gt;
'''QDBusConnection'''.&lt;br /&gt;
&lt;br /&gt;
Нам осталось лишь зарегистрировать объект, реализующий сервис – это выполняется методом '''registerObject()'''. Первый аргумент&lt;br /&gt;
метода – путь к объекту, который используется системой ''D-Bus'' для его идентификации. Выбор '''/QClipboard''' – чисто произвольный, можно указать любое другое значение, например, '''/the/longest/path/to/the/object'''. Последний аргумент метода '''registerObject()''' определяет, какие элементы класса адаптера войдут в описание интерфейса ''D-Bus'' и&lt;br /&gt;
станут доступными удаленному приложению. По сути дела, мы сталкиваемся здесь с той же проблемой видимости элементов класса за&lt;br /&gt;
пределами приложения, что и в случае со сценариями ''Qt''. Константа '''QDBusConnection::ExportAllContents''' делает класс-адаптер максимально видимым для удаленных приложений, но даже при ее использовании другим программам будет доступно не так уж и много. Например, программа-клиент ''D-Bus'' сможет обращаться только к методам,&lt;br /&gt;
помеченным как '''Q_INVOKABLE'''. Если все прошло успешно, нам остается запустить цикл обработки сообщений нашего приложения.&lt;br /&gt;
&lt;br /&gt;
===Клиент на языке ''С''===&lt;br /&gt;
&lt;br /&gt;
Настало время написать программу-клиент для взаимодействия&lt;br /&gt;
с сервером. Чтобы продемонстрировать универсальный характер&lt;br /&gt;
''D-Bus'', напишем сначала программу на языке C. Она естественно, не&lt;br /&gt;
сможет использовать средства ''Qt'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;dbus/dbus.h&amp;gt;&lt;br /&gt;
 int main (int argc, char **argv)&lt;br /&gt;
 {&lt;br /&gt;
   DBusConnection * connection;&lt;br /&gt;
   DBusError error;&lt;br /&gt;
    DBusMessage *call;&lt;br /&gt;
    char * text = &amp;quot;Этот текст будет передан в буфер обмена X-Window&amp;quot;;&lt;br /&gt;
    dbus_error_init(&amp;amp;error);&lt;br /&gt;
    connection = DBus_bus_get(DBUS_BUS_SESSION, &amp;amp;error);&lt;br /&gt;
    if (!connection) {&lt;br /&gt;
      printf(&amp;quot;Не могу установить соединение\n&amp;quot;, error.message);&lt;br /&gt;
      dbus_error_free(&amp;amp;error);&lt;br /&gt;
      return 1;&lt;br /&gt;
    }&lt;br /&gt;
    call = DBus_message_new_method_call(&amp;quot;DBus.Manager.QClipboard&amp;quot;, &amp;quot;/&lt;br /&gt;
 QClipboard&amp;quot;, &amp;quot;DBus.Manager.QClipboard&amp;quot;, &amp;quot;setContent&amp;quot;);&lt;br /&gt;
    dbus_message_append_args (call, DBus_TYPE_STRING, &amp;amp;text, DBus_&lt;br /&gt;
 TYPE_INVALID);&lt;br /&gt;
    if (!dbus_connection_send(connection, call, NULL)) {&lt;br /&gt;
      printf(&amp;quot;Не могу отправить сообщение\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    dbus_connection_flush(connection);&lt;br /&gt;
    printf(&amp;quot;%s\n&amp;quot;, text);&lt;br /&gt;
    dbus_message_unref(call);&lt;br /&gt;
    dbus_connection_unref(connection);&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Программа, исходный текст которой вы найдете в файле&lt;br /&gt;
'''sendcontent.c''' в архиве '''clipclients.tar.gz''', записывает строку текста в&lt;br /&gt;
буфер обмена ''X'' и распечатывает ее же в окне консоли. Для компиляции программы следует использовать команду&lt;br /&gt;
&lt;br /&gt;
  gcc sendcontent.c `pkg-config --cflags dbus-1` `pkg-config --libs dbus-1` -o sendcontent&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF107_78_1.jpg|Рис. 1|300px]]Рис. 1. В наше прогрессивное время никакие «хитроумные прерывания» не нужны – ''D-Bus'' запросто передаст текст из консоли в окно ''Kwrite''.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Разбирать подробно работу программы ''sendcontent'' мы не будем,&lt;br /&gt;
так как она не имеет отношения к ''Qt'', и, к тому же, фактически представляет собой сокращенный вариант примера из статьи, опубликованной в [[LXF99:D-Bus|LXF99]]. Заметим только, что функция '''dbus_message_new_method_call()''' использует имя соединения, путь к объекту и имя сервиса, заданные нами в программе-сервере.&lt;br /&gt;
&lt;br /&gt;
Запустите программу ''ClipBoardViewer'' в окне консоли. Затем в&lt;br /&gt;
другом окне запустите программу ''sendcontent''. После этого вы сможете вставить переданную консольной программой ''sendcontent'' строку в буфер обмена ''X-Window'' (рис. 1).&lt;br /&gt;
&lt;br /&gt;
===Базовый клиент ''D-Bus''===&lt;br /&gt;
&lt;br /&gt;
Теперь посмотрим, как можно решить ту же задачу базовыми средствами ''Qt''. Мы напишем настоящую консольную ''Qt''-программу. У&lt;br /&gt;
нее нет объекта '''QApplication''', нет доступа к объекту '''QClipboard''', а&lt;br /&gt;
значит, для передачи данных в буфер обмена ''X'' ей придется воспользоваться нашим сервером. Ниже приводится текст программы&lt;br /&gt;
''sendlines'' (возможно, это первая консольная программа ''Qt'', которую вы видите).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;QtCore&amp;gt;&lt;br /&gt;
  #include &amp;lt;QtDBus&amp;gt;&lt;br /&gt;
 int main(int argc, char **argv)&lt;br /&gt;
  {&lt;br /&gt;
            QCoreApplication app(argc, argv);&lt;br /&gt;
            QDBusConnection connection = QDBusConnection::connectToBus(QDBusConnection::SessionBus, &amp;quot;example.sendlines&amp;quot;);&lt;br /&gt;
            if (connection.isConnected())&lt;br /&gt;
                         printf(&amp;quot;Соединение установлено\n&amp;quot;);&lt;br /&gt;
            else {&lt;br /&gt;
                         printf(&amp;quot;Не могу установить соединение\n&amp;quot;);&lt;br /&gt;
                         return 1;&lt;br /&gt;
            }&lt;br /&gt;
            while(true) {&lt;br /&gt;
                         QString string = &amp;quot;&amp;quot;;&lt;br /&gt;
                         int ch;&lt;br /&gt;
                         while ((ch = getchar()) != '\n')&lt;br /&gt;
                                     string += ch;&lt;br /&gt;
                         QDBusMessage msg = QDBusMessage::createMethodCall(&amp;quot;DBus.Manager.QClipboard&amp;quot;, &amp;quot;/QClipboard&amp;quot;, &amp;quot;DBus.Manager.QClipboard&amp;quot;, &amp;quot;setContent&amp;quot;);&lt;br /&gt;
                         QList&amp;lt;QVariant&amp;gt; args;&lt;br /&gt;
                         args.append(QVariant(string));&lt;br /&gt;
                         msg.setArguments(args);&lt;br /&gt;
                         connection.send(msg);&lt;br /&gt;
                         QCoreApplication::processEvents();&lt;br /&gt;
            }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Модуль '''QtGUI''' включается по умолчанию во все проекты ''Qt 4'',&lt;br /&gt;
поэтому при создании консольного приложения ''Qt'' в файл '''.pro''', помимо строки&lt;br /&gt;
&lt;br /&gt;
  QT += D-Bus&lt;br /&gt;
&lt;br /&gt;
следует добавить также&lt;br /&gt;
&lt;br /&gt;
  QT –= gui&lt;br /&gt;
&lt;br /&gt;
Теперь компоненты графического приложения будут недоступны нашему проекту. Вместо класса '''QApplication''' мы используем&lt;br /&gt;
'''QCoreApplication'''. Вместо вызова метода '''exec()''' объекта '''QApplication'''&lt;br /&gt;
мы «вручную» создаем цикл обработки событий с помощью статического метода '''QCoreApplication::processEvents()'''. Но самое интересное в нашей программе, конечно, не это.&lt;br /&gt;
&lt;br /&gt;
Прежде всего, нам опять понадобится объект '''QDBusConnection''',&lt;br /&gt;
который мы создаем точно так же, как и в программе ''ClipboardViewer''.&lt;br /&gt;
Далее наша программа входит в цикл ввода строк (из которого ее&lt;br /&gt;
можно вывести только с помощью комбинации '''Ctrl-C'''). После того,&lt;br /&gt;
как пользователь завершает ввод очередной строки, создается&lt;br /&gt;
объект '''msg''' класса '''QDBusMessage''' – он инкапсулирует сообщение&lt;br /&gt;
''D-Bus''. Мы создаем объект-сообщение типа «вызов метода» с помощью статического метода '''createMethodCall()'''. Аргументами метода '''createMethodCall()''' должны быть соответственно имя сервиса, путь к&lt;br /&gt;
объекту, имя интерфейса и имя вызываемого метода.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF107_79_1.jpg|Рис. 2|300px]]Рис. 2. Базовый клиент ''D-Bus'' может передать в буфер обмена&lt;br /&gt;
сразу несколько строк.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Те, кто читал статью, посвященную ''D-Bus'', должны помнить, что&lt;br /&gt;
с сообщениями этого типа обычно связываются дополнительные&lt;br /&gt;
данные, представляющие собой значения аргументов вызываемого&lt;br /&gt;
метода удаленного объекта. Они добавляются в объект '''msg''' с помощью метода '''setArguments()'''. Его аргументом должен быть список '''QList''', состоящий из элементов типа '''QVariant'''. Мы создаем последний&lt;br /&gt;
с одним-единственным элементом (соответствующим единственному аргументу метода '''setContent'''), вызываем метод '''setArguments()''', после чего отправляем созданное сообщение с помощью метода '''send()''' объекта класса '''QDBusConnection'''. Теперь мы можем передать в буфер&lt;br /&gt;
обмена ''X-Window'' серию строк, что можно проследить, например, с&lt;br /&gt;
помощью апплета ''Klipper'' (рис. 2).&lt;br /&gt;
&lt;br /&gt;
=== Использование класса QDBusInterface===&lt;br /&gt;
&lt;br /&gt;
Вы, наверное, заметили, что в отношении работы с ''D-Bus'' программа ''sendlines'' не проще, чем написанная на языке ''C''. Пришло время показать, как ''Qt'' действительно может упростить работу с ''D-Bus''. В идеале нам просто хотелось бы иметь класс с тем же набором методов, что и у интерфейса удаленного приложения, так, чтобы при вызове метода локального класса вызывался соответствующий метод интерфейса удаленного приложения. В некоторых случаях этот идеал достижим, причем без особых усилий. Это возможно, если у нас есть описание интерфейса на языке '''XML'''. Сейчас же мы рассмотрим более общий вариант решения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
   #include &amp;lt;QtDebug&amp;gt;&lt;br /&gt;
   #include &amp;lt;QtCore&amp;gt;&lt;br /&gt;
   #include &amp;lt;QtDBus&amp;gt;&lt;br /&gt;
   int main(int argc, char **argv)&lt;br /&gt;
   {&lt;br /&gt;
              QCoreApplication app(argc, argv);&lt;br /&gt;
              QDBusInterface clipboard(&amp;quot;DBus.Manager.QClipboard&amp;quot;, &amp;quot;/QClipboard&amp;quot;, &amp;quot;DBus.Manager.QClipboard&amp;quot;);&lt;br /&gt;
              int ch = 0;&lt;br /&gt;
              while ((ch = getchar()) != 'q')       {&lt;br /&gt;
                          if (ch == 'c')&lt;br /&gt;
                                       clipboard.call(&amp;quot;setContent&amp;quot;, &amp;quot;Data sent from console&amp;quot;);&lt;br /&gt;
                          if (ch == 'p') {&lt;br /&gt;
                                       QDBusReply&amp;lt;QString&amp;gt; reply = clipboard.call(&amp;quot;content&amp;quot;);&lt;br /&gt;
                                       if (reply.isValid())&lt;br /&gt;
                                                    qDebug() &amp;lt;&amp;lt; reply.value();&lt;br /&gt;
                                       else&lt;br /&gt;
                                                    qDebug() &amp;lt;&amp;lt; &amp;quot;Error calling content()&amp;quot;;&lt;br /&gt;
                          }&lt;br /&gt;
                          QCoreApplication::processEvents();&lt;br /&gt;
              }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF107_79_2.jpg|Рис. 3|300px]]Рис. 3. Меньше строк – больше возможностей!|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Программа ''copypaste'', текст которой приводится выше, представляет собой консольное приложение ''Qt'', которое может вставлять строки в буфер обмена и считывать их из него. Команда &amp;quot;'''c'''&amp;quot; заставляет программу скопировать в буфер заданную строку текста, а команда &amp;quot;'''p'''&amp;quot; читает содержимое буфера (рис. 3).&lt;br /&gt;
&lt;br /&gt;
Программа ''copypaste'' взаимодействует с ''D-Bus'' с помощью объекта класса '''QDBusInterface''', который не делает ничего «волшебного» – по сути, его методы просто объединяют некоторые рутинные операции, которые нам приходится выполнять, когда мы имеем дело непосредственно с классами '''QDBusConnection''' и '''QDBusMessage''', однако удобство работы значительно возрастает. Самым часто используемым методом класса '''QDBusInterface''' является '''call()''', вызывающий метод интерфейса удаленного приложения. В первом параметре '''call()''' передается строка с именем вызываемого удаленного метода. Далее следуют 8 параметров типа «ссылка на '''QVariant'''» со значениями, присвоенными по умолчанию; они используются для передачи аргументов.&lt;br /&gt;
&lt;br /&gt;
Такое решение может показаться не очень элегантным, но оно&lt;br /&gt;
заметно упрощает работу с удаленными методами. Если у метода&lt;br /&gt;
удаленного интерфейса меньше 8 аргументов (а таковых, разумеется, большинство), мы избавлены от необходимости конструирования&lt;br /&gt;
списка аргументов на основе''' QList'''. Например, в строке&lt;br /&gt;
&lt;br /&gt;
 clipboard.call(&amp;quot;setContent&amp;quot;, &amp;quot;Data sent from console&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
мы вызываем метод '''setContent''' с аргументом &amp;quot;'''Data sent from console'''&amp;quot;. Если же вызываемый метод имеет более восьми аргументов, к нашим услугам – '''QDBusInterface::callWithArgumentList()''',&lt;br /&gt;
принимающий аргументы вызываемого удаленного метода в виде&lt;br /&gt;
списка.&lt;br /&gt;
&lt;br /&gt;
Метод '''call()''' также используется для вызова удаленных методов,&lt;br /&gt;
возвращающих значения. При этом приложению-клиенту посылается сообщение определенного типа, которое, помимо прочего,&lt;br /&gt;
содержит результат вызова. Ситуация осложняется тем, что при&lt;br /&gt;
вызове удаленного метода может возникнуть ошибка. В этом случае клиенту посылается сообщение другого типа. Для обработки&lt;br /&gt;
сообщений, возвращаемых удаленными методами, используется&lt;br /&gt;
шаблон '''QDBusReply'''. Его параметром является тип значения, возвращаемого методом. Метод '''content()''', который позволяет прочитать содержимое буфера обмена, возвращает значение типа&lt;br /&gt;
'''QString''', поэтому объект '''reply''', инкапсулирующий результат вызова&lt;br /&gt;
метода, имеет тип '''QDBusReply&amp;lt;QString&amp;gt;'''. Проверить, не возникло&lt;br /&gt;
ли в процессе вызова метода ошибки, можно с помощью метода&lt;br /&gt;
'''isValid()''' объекта '''reply'''.&lt;br /&gt;
&lt;br /&gt;
В заключение рассмотрим еще одну интересную возможность модуля '''QtDBus'''. В статье, посвященной ''D-Bus'', я писал о&lt;br /&gt;
сообщениях-сигналах и сравнивал их с сигналами ''Qt''. Сравнение&lt;br /&gt;
было более чем уместно, так как в ''QtDBus'' действительно существует возможность связывать слот объекта локального приложения с сигналом удаленного приложения. Напомню, что эти сигналы могут быть широковещательными, то есть адресованными не только нашей программе.&lt;br /&gt;
&lt;br /&gt;
Для связывания удаленного сигнала с текущим слотом можно воспользоваться методом '''connect()''' класса '''QDBusConnection'''.&lt;br /&gt;
Первые три аргумента метода – соответственно имя сервиса, путь к&lt;br /&gt;
объекту и имя интерфейса. Далее нужно указать имя сигнала, передать указатель на объект-приемник и строку с именем слота, который будет вызываться в ответ на сигнал. Для отсоединения слота&lt;br /&gt;
от удаленного сигнала служит метод '''disconnect()''' того же класса&lt;br /&gt;
'''QDBusConnection'''.&lt;br /&gt;
&lt;br /&gt;
На этом мы заканчиваем обзор новшеств ''Qt 4.x'' и переходим на следующий этаж популярной графической системы Linux – KDE 4.x.&lt;br /&gt;
'''LXF'''&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>