<?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>LXF102:Qt4 - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF102:Qt4&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Thu, 14 May 2026 04:20:01 GMT</lastBuildDate>
		<item>
			<title>Ewgen: исправил ошибку</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF102:Qt4&amp;diff=12110&amp;oldid=prev</link>
			<description>&lt;p&gt;исправил ошибку&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&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&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;Версия 11:33, 12 июня 2011&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 82:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 82:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;БД проще всего понять, как работает среда ''Interview''. В клиентском&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;БД проще всего понять, как работает среда ''Interview''. В клиентском&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;приложении БД, использующем ''Interview'', модель играет роль посредника между БД и интерфейсом пользователя. Именно модель определяет логику представления данных. Когда пользователь хочет получить&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;приложении БД, использующем ''Interview'', модель играет роль посредника между БД и интерфейсом пользователя. Именно модель определяет логику представления данных. Когда пользователь хочет получить&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;информацию о текущем состоянии БД, пользовательский &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;интерфей&lt;/del&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;информацию о текущем состоянии БД, пользовательский &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;интерфейc &lt;/ins&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;отдельными элементами данных служат делегаты, которые передают&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;команды пользователя модели.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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;/table&gt;</description>
			<pubDate>Sun, 12 Jun 2011 11:33:55 GMT</pubDate>			<dc:creator>Ewgen</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:LXF102:Qt4</comments>		</item>
		<item>
			<title>Yaleks: /* Клиент на базе */</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF102:Qt4&amp;diff=7757&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Клиент на базе&lt;/span&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&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&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;Версия 19:26, 1 мая 2009&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 162:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 162:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Перейдем теперь собственно к программе. Ее исходный текст невелик и состоит всего лишь из одного файла, поэтому я приведу его полностью (вы, конечно, можете найти код на диске, в файле '''main.cpp''').&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Перейдем теперь собственно к программе. Ее исходный текст невелик и состоит всего лишь из одного файла, поэтому я приведу его полностью (вы, конечно, можете найти код на диске, в файле '''main.cpp''').&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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 style=&quot;color: red; font-weight: bold; text-decoration: none;&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt; #include &amp;lt;QtDebug&amp;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;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt; &lt;/del&gt;#include &amp;lt;QtDebug&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;&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; #include &amp;lt;QtGui&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; #include &amp;lt;QtGui&amp;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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; #include &amp;lt;QSqlDatabase&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; #include &amp;lt;QSqlDatabase&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;Строка 172:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 171:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &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; &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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;     QApplication app(argc, argv);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;     QApplication app(argc, argv);&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;      QSqlDatabase db = QSqlDatabase::addDatabase(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“QPSQL”&lt;/del&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;      QSqlDatabase db = QSqlDatabase::addDatabase(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;QPSQL&amp;quot;&lt;/ins&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;      db.setHostName(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“localhost”&lt;/del&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;      db.setHostName(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;localhost&amp;quot;&lt;/ins&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;      db.setDatabaseName(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“testdb”&lt;/del&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;      db.setDatabaseName(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;testdb&amp;quot;&lt;/ins&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;     db.setUserName(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“user”&lt;/del&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;     db.setUserName(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;user&amp;quot;&lt;/ins&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;     db.setPassword(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“password”&lt;/del&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;     db.setPassword(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;password&amp;quot;&lt;/ins&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;     if (!db.open())&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;     if (!db.open())&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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;                         qDebug() &amp;lt;&amp;lt; QObject::trUtf8(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Не &lt;/del&gt;смогла я открыть базу &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;данных”&lt;/del&gt;) &amp;lt;&amp;lt; db.lastError().text();&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;                         qDebug() &amp;lt;&amp;lt; QObject::trUtf8(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Не &lt;/ins&gt;смогла я открыть базу &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;данных&amp;quot;&lt;/ins&gt;) &amp;lt;&amp;lt; db.lastError().text();&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;                         return -1;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;                         return -1;&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             }&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             QSqlQueryModel * model = new QSqlQueryModel(0);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             QSqlQueryModel * model = new QSqlQueryModel(0);&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;             model-&amp;gt;setQuery(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“SELECT &lt;/del&gt;* FROM &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;music”&lt;/del&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;             model-&amp;gt;setQuery(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;SELECT &lt;/ins&gt;* FROM &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;music&amp;quot;&lt;/ins&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;             model-&amp;gt;setHeaderData(0, Qt::Horizontal, QObject::trUtf8(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Автор”&lt;/del&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;             model-&amp;gt;setHeaderData(0, Qt::Horizontal, QObject::trUtf8(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Автор&amp;quot;&lt;/ins&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;             model-&amp;gt;setHeaderData(1, Qt::Horizontal, QObject::trUtf8(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Альбом”&lt;/del&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;             model-&amp;gt;setHeaderData(1, Qt::Horizontal, QObject::trUtf8(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Альбом&amp;quot;&lt;/ins&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;             model-&amp;gt;setHeaderData(2, Qt::Horizontal, QObject::trUtf8(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Произведение”&lt;/del&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;             model-&amp;gt;setHeaderData(2, Qt::Horizontal, QObject::trUtf8(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Произведение&amp;quot;&lt;/ins&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;             model-&amp;gt;setHeaderData(3, Qt::Horizontal, QObject::trUtf8(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Год выхода”&lt;/del&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;             model-&amp;gt;setHeaderData(3, Qt::Horizontal, QObject::trUtf8(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Год выхода&amp;quot;&lt;/ins&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             QTableView * view = new QTableView(0);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             QTableView * view = new QTableView(0);&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             view-&amp;gt;setModel(model);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             view-&amp;gt;setModel(model);&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;             view-&amp;gt;setWindowTitle(QObject::trUtf8(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Музыкальный каталог”&lt;/del&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;             view-&amp;gt;setWindowTitle(QObject::trUtf8(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Музыкальный каталог&amp;quot;&lt;/ins&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             view-&amp;gt;show();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             view-&amp;gt;show();&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             return app.exec();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             return app.exec();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Fri, 01 May 2009 19:26:17 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF102:Qt4</comments>		</item>
		<item>
			<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF102:Qt4&amp;diff=7553&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;: '''Новая серия!''' Осваиваем технологии, лежащие в основе нашумевшего KDE4&lt;br /&gt;
&lt;br /&gt;
==Интервью с троллем==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Qt4}}&lt;br /&gt;
&lt;br /&gt;
: '''ЧАСТЬ 1''' ''Qt4'' предоставляет в распоряжение программиста целый букет нововведений – но '''Андрей Боровский''' решил начать с того, что не сразу бросается в глаза.&lt;br /&gt;
&lt;br /&gt;
А вы уже пишете программы под ''Qt 4.x''? Хотя на рабочих столах Linux все еще господствует KDE 3.x, а следовательно, и ''Qt 3.x'', все новые версии дистрибутивов Linux поставляются также и с ''Qt 4.x'', причем во многих из них по умолчанию используются именно инструменты ''Qt'' четвертой версии. К этому следует добавить, что и переход на KDE4 – дело ближайшего будущего, а значит, если вы еще не портировали свою программу, использующую ''Qt3'', на новую версию, самое время заняться этим сейчас. Если же вы только собираетесь создавать ''Qt''-проект, ''Qt 3.x'' не стоит даже рассматривать.&lt;br /&gt;
&lt;br /&gt;
В общем и целом можно сказать, что по сравнению с предыдущей версией система ''Qt4'' улучшилась, обогатилась возможностями и усложнилась. Давно прошли те времена, когда вся ''Qt'' умещалась в одной-единственной разделяемой библиотеке. Что касается системы ''Qt4'', то ее основные классы вольготно расположились в 12 библиотеках (тринадцатая библиотека, '''libQt3Support.so''', предназначена для поддержки кода ''Qt3.x'' в тех случаях, когда перенос кода на новую версию представляется совсем уж трудным делом). Мы надеемся, что программисты Linux, привыкшие управлять демонами и убивать зомби, люди не суеверные, и число 13 их не испугает. Заголовочные файлы ''Qt4'' также умножились в числе и распределены теперь по нескольким поддиректориям. Впрочем, как мы увидим дальше, управлять всем этим «зверинцем» не так уж и трудно.&lt;br /&gt;
&lt;br /&gt;
===Дела лицензионные===&lt;br /&gt;
&lt;br /&gt;
Знакомство с '''Qt4''' мы начнем с вопросов лицензирования, которые многим, возможно, покажутся слишком скучными. В ''Qt4'' наконец-то реализована полноценная схема двойного лицензирования для всех платформ (Windows, X11 и Mac), причем открытый вариант ''Qt'' распространяется на условиях GPL 2.0 ['''во время подготовки этой статьи к печати появилось сообщение, что Trolltech перевела ''Qt'' на GPLv3, см. Новости, – прим. ред.''']. Сами представители ''Qt'' именуют свой подход «Quid Pro Quo», что в вольном переводе с древней латыни означает «баш на баш» ['qui pro quo' – лат. путаница, букв. «кто за кого», а англ. 'quid' в разговоре означает «фунт» (стерлингов)''']. Если вы хотите пользоваться &lt;br /&gt;
средствами ''Qt'' бесплатно, взамен вы должны предоставить сообществу &lt;br /&gt;
свой код (открытая модель). Если вы не желаете делиться кодом, вы &lt;br /&gt;
должны заплатить деньги (своего рода «выкуп», который, естественно, &lt;br /&gt;
будет потрачен на дальнейшее совершенствование ''Qt'').&lt;br /&gt;
&lt;br /&gt;
Интересно отметить, что лицензионная политика ''Qt'' не позволяет &lt;br /&gt;
лицензиатам применять тот же принцип двойного лицензирования к &lt;br /&gt;
своим продуктам. Если вы ведете разработку с помощью ''Qt'', ваш проект должен быть либо открытым на условиях GPL, либо коммерческим. &lt;br /&gt;
То есть, вам, конечно, никто не мешает раздавать ваш код бесплатно, &lt;br /&gt;
но если это делается не на основе GPL, то для разработки этого кода &lt;br /&gt;
необходимо использовать (и, естественно, оплатить) коммерческую &lt;br /&gt;
версию ''Qt'' ['''возможны исключения; полный список свободных лицензий, по которым может распространяться программа, скомпонованная с ''Qt'', можно найти на сайте компании, – прим. ред.''']. У открытой версии ''Qt'' для Windows есть одна неприятная особенность: согласно намерениям разработчиков, ее можно использовать только совместно со средой компиляции ''MinGW'', которая нравится не всем (мне, например, не нравится). Чтобы работать с ''MS Visual Studio'' (а это все-таки лучшая платформа разработки для Windows), придется заплатить за коммерческую &lt;br /&gt;
версию ''Qt''. Причины такого ограничения непонятны, и упомянутый &lt;br /&gt;
выше принцип quid pro quo здесь не срабатывает, поскольку даже сама &lt;br /&gt;
Microsoft распространяет бесплатный вариант ''Visual Studio Express Edition''. Кроме того, по сведениям, полученным с различных форумов, после небольшой «обработки напильником» открытую ''Qt4'' можно заставить работать с компиляторами ''С++'' от Microsoft и CodeGear, &lt;br /&gt;
предназначенными для командной строки. По моему мнению, ограничив поддержку компиляторов для открытой версии ''Qt'', разработчики &lt;br /&gt;
из TrollTech сделали глупость, которая, я надеюсь, будет исправлена в дальнейших релизах ''Qt4.x''.&lt;br /&gt;
&lt;br /&gt;
===А что же внутри?===&lt;br /&gt;
&lt;br /&gt;
Перейдем теперь к техническим новшествам ''Qt4''. Похоже, старым добрым контейнерам STL так и не суждено стать настоящим стандартом.&lt;br /&gt;
У каждого набора визуальных компонентов, основанного на ''C++'', есть&lt;br /&gt;
свой набор контейнеров (что, вообще говоря, не очень хорошо, так как&lt;br /&gt;
делает невизуальный код, который особенно часто использует абстрактные типы данных, труднопереносимым между разными платформами&lt;br /&gt;
разработки).&lt;br /&gt;
&lt;br /&gt;
В ''Qt4'' появилась система контейнеров '''Tulip''' (тюльпан), призванная&lt;br /&gt;
заменить старые контейнеры ''Qt3''. '''Tulip''' предоставляет в наше распоряжение стандартный набор контейнеров последовательного доступа&lt;br /&gt;
(список, связный список, очередь, вектор, стек) и несколько ассоциативных контейнеров: отображения (классы '''QMap''' и '''QMultiMap'''),&lt;br /&gt;
хэш-таблицы (классы '''QHash''' и '''QMultiHash''') и множество (класс '''QSet''').&lt;br /&gt;
Теоретически разница между классами '''QMap''' и '''QMultiMap''' и классами&lt;br /&gt;
'''QHash''' и '''QMultiHash''' заключается в том, что первый класс из каждой&lt;br /&gt;
пары позволяет связать с ключом только одно значение, тогда как&lt;br /&gt;
второй класс позволяет назначать несколько значений одному ключу. Напомню, что в ассоциативных контейнерах хранимым значениям&lt;br /&gt;
сопоставляются ключи, которые позволяют организовать произвольный доступ к данным контейнера.&lt;br /&gt;
&lt;br /&gt;
Разделение классов '''QHash''' и '''QMultiHash''' вызывает некоторые&lt;br /&gt;
вопросы. При использовании хэш-таблиц нередко возникают коллизии&lt;br /&gt;
(когда двум хранимым значениям соответствует один и тот же ключ).&lt;br /&gt;
Придумать хэш-функцию, которая бы гарантированно не вызывала&lt;br /&gt;
коллизий, очень трудно (обычно просто нереально). Фактически, возможность связывать несколько значений с одним ключом является&lt;br /&gt;
неотъемлемым свойством хэш-таблиц. Разработчики контейнеров ''Qt'',&lt;br /&gt;
разумеется, об этом знают, и в классе '''QHash''' реализована возможность&lt;br /&gt;
добавления нескольких значений с одним и тем же ключом. В результате различие между контейнерами '''QHash''' и '''QMultiHash''' (второй, кстати,&lt;br /&gt;
является потомком первого) выглядит скорее косметическим.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Системные требования|Содержание=Настоящая серия учебников ориентирована на читателей, знакомых с ''Qt3'', но даже если вы только начинаете программировать с ''Qt'', не расстраивайтесь – мы публиковали учебник по ''Qt3/KDE3'' в номерах – [[LXF78:Qt/KDE|LXF78-85]].|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Еще одно новшество ''Qt4'' – среда ''Interview''. Система ''Interview Framework'' представляет собой вариант реализации парадигмы&lt;br /&gt;
«модель-контроллер–вид». В ее основе лежит старая и плодотворная идея разделения «движка» программы и интерфейса. В рамках&lt;br /&gt;
парадигмы «модель-контроллер-вид» (подробно описанной в многочисленной литературе по «правильному» программированию) модель&lt;br /&gt;
представляет собой, по сути, «движок» приложения. Именно модель&lt;br /&gt;
определяет, что и как может делать программа. Термином «вид» (представление) фактически описывается все, что имеет непосредственное&lt;br /&gt;
отношение к интерфейсу пользователя. Вид позволяет пользователю&lt;br /&gt;
получать информацию о состоянии модели и передавать программе&lt;br /&gt;
команды. Команды пользователя обрабатывает контроллер, который&lt;br /&gt;
вносит соответствующие изменения в состояние модели или вида и,&lt;br /&gt;
в частности, не позволяет пользователю нарушить целостность модели в результате введения неправильных команд. Как и многие другие&lt;br /&gt;
парадигмы, призванные формализовать процесс создания программ,&lt;br /&gt;
парадигма «модель-контроллер-вид» редко применяется на практике&lt;br /&gt;
в чистом виде. В частности, отдельные элементы парадигмы нередко&lt;br /&gt;
объединяются друг с другом. Система ''Interview'' превращает парадигму «модель-контроллер-вид» в парадигму «модель-вид», объединяя&lt;br /&gt;
контроллер и вид в одно целое. Хотя парадигма «модель-контроллервид» (а, следовательно, и ''Interview'') может применяться при написании&lt;br /&gt;
множества типов программ, разработчики ''Interview'', судя по всему,&lt;br /&gt;
ориентировались в основном на создание клиентских приложений для&lt;br /&gt;
работы с базами данных. Именно на примере клиентского приложения&lt;br /&gt;
БД проще всего понять, как работает среда ''Interview''. В клиентском&lt;br /&gt;
приложении БД, использующем ''Interview'', модель играет роль посредника между БД и интерфейсом пользователя. Именно модель определяет логику представления данных. Когда пользователь хочет получить&lt;br /&gt;
информацию о текущем состоянии БД, пользовательский интерфей(компонент «вид») обращается к модели напрямую. Для работы с&lt;br /&gt;
отдельными элементами данных служат делегаты, которые передают&lt;br /&gt;
команды пользователя модели.&lt;br /&gt;
&lt;br /&gt;
===Играем в классики===&lt;br /&gt;
&lt;br /&gt;
Переходя от абстрактного изложения принципов системы ''Interview'' к&lt;br /&gt;
изложению более конкретному, мы должны познакомиться (простите за каламбур) с тремя абстрактными классами '''QAbstractItemModel''',&lt;br /&gt;
'''QAbstractItemView''' и '''QAbstractItemDelegate'''. Они являются предками&lt;br /&gt;
всех классов, реализующих, соответственно, модели, представления&lt;br /&gt;
(виды) и делегаты. Классы '''QtableView, QtreeView''' и '''QListView''' реализуют три наиболее популярные формы представления данных: таблицу,&lt;br /&gt;
дерево и простой список. Если вам требуется более сложный компонент отображения модели, вам придется создавать собственный класс,&lt;br /&gt;
основанный на '''QAbstractItemView'''.&lt;br /&gt;
&lt;br /&gt;
Класс '''QStandardItemModel''', являющийся потомком '''QAbstractItemModel''', представляет собой реализацию модели в самом&lt;br /&gt;
общем смысле. Помимо прочего, этот класс реализует ряд методов,&lt;br /&gt;
предназначенных для работы с индексами. Индексы используются в&lt;br /&gt;
среде ''Interview'' для указания элементов данных, с которыми работает&lt;br /&gt;
модель. Класс '''QDirModel''' реализует модель для работы с директориями. Этот класс пригодится вам, если вы надумаете писать собственный&lt;br /&gt;
файл-менеджер или свою версию диалоговых окон открытия и сохранения файла. Следует отметить, что один и тот же объект, реализующий модель, может взаимодействовать (в том числе, одновременно)&lt;br /&gt;
с объектами нескольких разных классов, отвечающими за представление данных. Например, уже упомянутый класс '''QDirModel''' может&lt;br /&gt;
использовать для представления информации о директориях классы&lt;br /&gt;
'''QtableView, QtreeView''', и '''QListView'''. Класс '''QStringListModel''', как можно&lt;br /&gt;
догадаться по его названию, реализует модель, основой которой является список строк.&lt;br /&gt;
&lt;br /&gt;
Классы '''QAbstractTableModel''' и '''QAbstractListModel''' могут служить&lt;br /&gt;
основой для ваших собственных классов-моделей, предполагающих&lt;br /&gt;
представление данных в виде таблиц и списков соответственно&lt;br /&gt;
&lt;br /&gt;
Такие классы, как '''QtreeView''' и '''QListView''', предназначены для работы с моделями, но использовать их в качестве самостоятельных виджетов затруднительно. Для решения этой проблемы на базе классов '''QtableView, QtreeView''' и '''QListView''' созданы классы '''QtableWidget, QtreeWidget''' и '''QListWidget'''. Объекты этих классов представляют собой&lt;br /&gt;
обычные визуальные компоненты, при работе с которыми пользователь может добавлять и удалять данные, не заботясь о моделях и&lt;br /&gt;
делегатах. На самом деле, эти классы просто реализуют свои собственные модели данных, незаметные для пользователя. Как видим,&lt;br /&gt;
система ''Interview'' играет в ''Qt'' большую роль, чем может показаться на&lt;br /&gt;
первый взгляд!&lt;br /&gt;
&lt;br /&gt;
===Клиент на базе===&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, наиболее удобное средство демонстрации&lt;br /&gt;
возможностей ''Interview'' – клиентские приложения баз данных. Такое&lt;br /&gt;
приложение мы и напишем. Прежде всего, рассмотрим арсенал специальных классов, которые среда ''Interview'' предоставляет нам для&lt;br /&gt;
работы с базами данных. Их три: '''QSqlQueryModel, QSqlTableModel''' и&lt;br /&gt;
'''QsqlRelationalTableModel''', причем '''QSqlQueryModel''' – самый простой.&lt;br /&gt;
Его возможности, фактически, ограничиваются передачей результата&lt;br /&gt;
запроса к базе данных. При этом, правда, стоит отметить, что класс&lt;br /&gt;
'''QSqlQueryModel''' обладает определенными возможностями, позволяющими изменить структуру отображения данных перед передачей ее на&lt;br /&gt;
уровень представления. Класс '''QSqlTableModel''' гораздо функциональнее. Этот класс логически организует результаты ''SQL''-запросов как&lt;br /&gt;
таблицы и предусматривает функции редактирования данных. Наконец,&lt;br /&gt;
класс '''QSqlRelationalTableModel''' позволяет задействовать в приложении&lt;br /&gt;
основные возможности реляционной модели баз данных – работу с&lt;br /&gt;
данными из нескольких таблиц, связанных внешними ключами. Для&lt;br /&gt;
представления данных моделей ''SQL'' наиболее логично использовать&lt;br /&gt;
объекты класса '''QtableView''' (хотя унифицированная структура среды&lt;br /&gt;
''Interview'' позволяет использовать совместно с ''SQL''-моделями и другие&lt;br /&gt;
стандартные «виды», они, как правило, менее удобны или информативны при работе с данными БД).&lt;br /&gt;
&lt;br /&gt;
Для нашего первого приложения ''Interview'' (и ''Qt4''!) воспользуемся&lt;br /&gt;
самой простой ''SQL''-моделью '''QSqlQueryModel'''. Мы создадим программу, позволяющую просматривать некий каталог музыкальных произведений (на самом деле – крошечный фрагмент моего музыкального каталога). Для нашего приложения БД нам понадобится база данных,&lt;br /&gt;
содержащая хотя бы одну таблицу. При написании программы для&lt;br /&gt;
примера я воспользовался СУБД ''PostrgeSQL'', которая присутствует в&lt;br /&gt;
любом дистрибутиве Linux. Если захотите, вы сможете адаптировать&lt;br /&gt;
этот пример к любой другой СУБД.&lt;br /&gt;
&lt;br /&gt;
Для любителей точных инструкций, привожу последовательность&lt;br /&gt;
действий по созданию базы данных '''testdb'''. Настройте и запустите&lt;br /&gt;
сервер ''PostrgeSQL'' на вашем компьютере (см. [[LXF85:PostgreSQL|LXF85]]). Далее скомандуйте&lt;br /&gt;
&lt;br /&gt;
 createdb testdb&lt;br /&gt;
&lt;br /&gt;
войдите в консольный клиент ''PostgreSQL'':&lt;br /&gt;
&lt;br /&gt;
 psql testdb&lt;br /&gt;
&lt;br /&gt;
и скомандуйте&lt;br /&gt;
&lt;br /&gt;
 \i createtable.sql&lt;br /&gt;
&lt;br /&gt;
Файл '''createtable.sql''' вы найдете на прилагаемом диске. Теперь можете выйти из клиента с помощью команды '''\q'''.&lt;br /&gt;
&lt;br /&gt;
Перейдем теперь собственно к программе. Ее исходный текст невелик и состоит всего лишь из одного файла, поэтому я приведу его полностью (вы, конечно, можете найти код на диске, в файле '''main.cpp''').&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;QtGui&amp;gt;&lt;br /&gt;
 #include &amp;lt;QSqlDatabase&amp;gt;&lt;br /&gt;
 #include &amp;lt;QSqlQueryModel&amp;gt;&lt;br /&gt;
 #include &amp;lt;QSqlError&amp;gt;&lt;br /&gt;
 #include &amp;lt;QTableView&amp;gt;&lt;br /&gt;
 int main(int argc, char *argv[])&lt;br /&gt;
 {&lt;br /&gt;
     QApplication app(argc, argv);&lt;br /&gt;
      QSqlDatabase db = QSqlDatabase::addDatabase(“QPSQL”);&lt;br /&gt;
      db.setHostName(“localhost”);&lt;br /&gt;
      db.setDatabaseName(“testdb”);&lt;br /&gt;
     db.setUserName(“user”);&lt;br /&gt;
     db.setPassword(“password”);&lt;br /&gt;
     if (!db.open())&lt;br /&gt;
             {&lt;br /&gt;
                         qDebug() &amp;lt;&amp;lt; QObject::trUtf8(“Не смогла я открыть базу данных”) &amp;lt;&amp;lt; db.lastError().text();&lt;br /&gt;
                         return -1;&lt;br /&gt;
             }&lt;br /&gt;
             QSqlQueryModel * model = new QSqlQueryModel(0);&lt;br /&gt;
             model-&amp;gt;setQuery(“SELECT * FROM music”);&lt;br /&gt;
             model-&amp;gt;setHeaderData(0, Qt::Horizontal, QObject::trUtf8(“Автор”));&lt;br /&gt;
             model-&amp;gt;setHeaderData(1, Qt::Horizontal, QObject::trUtf8(“Альбом”));&lt;br /&gt;
             model-&amp;gt;setHeaderData(2, Qt::Horizontal, QObject::trUtf8(“Произведение”));&lt;br /&gt;
             model-&amp;gt;setHeaderData(3, Qt::Horizontal, QObject::trUtf8(“Год выхода”));&lt;br /&gt;
             QTableView * view = new QTableView(0);&lt;br /&gt;
             view-&amp;gt;setModel(model);&lt;br /&gt;
             view-&amp;gt;setWindowTitle(QObject::trUtf8(“Музыкальный каталог”));&lt;br /&gt;
             view-&amp;gt;show();&lt;br /&gt;
             return app.exec();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Исходный текст программы начинается, естественно, с заголовочных файлов. Первым следует '''&amp;lt;QtDebug&amp;gt;''', он содержит полезные&lt;br /&gt;
средства для вывода отладочных сообщений. Вследствие некоторых&lt;br /&gt;
особенностей структуры заголовочных файлов ''Qt4.x'', если вы решили включить в текст программы этот файл, вы должны включить его&lt;br /&gt;
прежде всех других заголовочных файлов. Нарушение этого правила&lt;br /&gt;
приводит к тому, что при определенном сочетании версий ''Qt4.x'', набора&lt;br /&gt;
используемых заголовочных файлов и фазы Луны компилятор начинает выдавать довольно странные сообщения об ошибках. Далее следует&lt;br /&gt;
заголовочный файл '''&amp;lt;QtGui&amp;gt;'''. Этот файл содержит объявления классов&lt;br /&gt;
и функций, реализованных в двух базовых модулях ''Qt'' – '''QtCore''' и '''QtGui'''.&lt;br /&gt;
Включив этот файл в текст нашей программы, мы избавляем себя от&lt;br /&gt;
необходимости добавлять по отдельности заголовочные файлы для&lt;br /&gt;
таких классов, как '''QApplication'''. Файл '''&amp;lt;QSqlDatabase&amp;gt;''' содержит объявление класса '''QSqlDatabase''', который мы используем для создания&lt;br /&gt;
соединения с сервером БД. Мы включаем в текст программы определения классов '''QSqlQueryModel''' и '''QtableView'''.&lt;br /&gt;
&lt;br /&gt;
Нашей первой задачей, как всегда, является создание объекта класса '''QApplication'''. Затем мы создаем соединение с сервером баз данных. Объект '''QSqlDatabase''', инкапсулирующий соединение с сервером,&lt;br /&gt;
создается с помощью статического метода '''QSqlDatabase::addDatabase()'''&lt;br /&gt;
Этот метод существует в нескольких вариантах, каждому из которых&lt;br /&gt;
при вызове можно передать несколько аргументов. Мы передаем&lt;br /&gt;
методу '''addDatabase()''' один аргумент (значения остальных заданы по&lt;br /&gt;
умолчанию), представляющий собой имя драйвера СУБД. Поскольку я&lt;br /&gt;
воспользовался ''PostgreSQL'', в программе указывается драйвер ''QPSQL''.&lt;br /&gt;
Если вы захотите использовать ''MySQL'', вам понадобится драйвер&lt;br /&gt;
''QMYSQL''. По умолчанию драйверы скомпилированы в виде отдельных&lt;br /&gt;
модулей, но если хотите, можете встроить код драйвера в свое приложение. Для этого вам понадобятся исходные тексты ''Qt''. Исходные тексты всех драйверов вы найдете в поддиректориях директории '''QTDIR/src/sql/drivers/'''.&lt;br /&gt;
&lt;br /&gt;
Теперь, когда у нас есть объект '''db''' класса '''QSqlDatabase''', реализующий соединение с сервером БД, мы должны настроить это соединение.&lt;br /&gt;
С помощью соответствующих методов объекта '''db''' мы указываем имена узла, базы данных, имя пользователя и его пароль (если вы создавали базу данных так, как описано выше, имя пользователя и пароль для доступа к ней совпадают с именем пользователя и паролем вашеучетной записи Linux). Настроенное соединение открывается с помощью метода '''open()'''. Этот метод возвращает значение типа '''bool''', которое указывает, удалось ли установить соединение с сервером БД. Если '''open()''' возвращает '''false''', наша программа выводит жалобное сообщение, затем более подробное описание ошибки (с помощью метода '''db.lastError().text()'''), и завершает работу.&lt;br /&gt;
&lt;br /&gt;
Успешно установив соединение с БД, мы можем приступить к созданию модели (объект '''model''' класса '''QSqlQueryModel'''). Главным&lt;br /&gt;
методом объекта '''QSqlQueryModel''' является метод '''setQuery()''', который&lt;br /&gt;
позволяет указать текст ''SQL''-запроса с БД. В нашем примере запрос&lt;br /&gt;
выбирает все данные из таблицы '''music'''. Внимательно глядя на этот код,&lt;br /&gt;
вы можете спросить: а откуда объект '''model''' узнает, из какой базы данных, иначе говоря, из какого объекта '''QSqlDatabase''', он должен получить&lt;br /&gt;
данные? Ответ на этот вопрос прост. При вызове статического метода '''addDatabase()''', которым был создан объект '''db''', мы могли бы указать&lt;br /&gt;
уникальное имя соединения. Поскольку мы этого не сделали, созданное нами соединение с БД стало соединением по умолчанию (вполне&lt;br /&gt;
логично: ведь наша программа использует только одну базу данных).&lt;br /&gt;
Получить объект, реализующий соединение по умолчанию, можно с&lt;br /&gt;
помощью статического метода '''QSqlDatabase::database()''', вызванного&lt;br /&gt;
без параметров. Именно так метод '''setQuery()''' объекта '''model''' определяет нужное соединение с БД. Если бы мы работали с несколькими&lt;br /&gt;
соединениями, мы могли бы воспользоваться перегруженным вариантом метода '''setQuery()''', которому помимо текста запроса передается&lt;br /&gt;
ссылка на объект '''QSqlDatabase'''.&lt;br /&gt;
&lt;br /&gt;
Метод '''setHeaderData()''', который мы далее вызываем, позволяет назначить произвольные заголовки столбцам таблицы. Это один&lt;br /&gt;
из немногих «косметических» методов, с помощью которых модель '''QSqlQueryModel''' может внести свою лепту в обработку данных (еще&lt;br /&gt;
один метод – '''removeColumns()''' – позволяет сделать невидимыми&lt;br /&gt;
отдельные столбцы таблицы). Мы используем метод '''setHeaderData()'''&lt;br /&gt;
для присвоения русских названий столбцам таблицы.&lt;br /&gt;
&lt;br /&gt;
Теперь мы переходим к созданию вида (объект '''view'''). Метод&lt;br /&gt;
'''setModel()''' связывает вид с моделью, а метод '''setWindowTitle()''' устанавливает заголовок окна. Нам остается вызывать метод '''show()''', что-&lt;br /&gt;
бы сделать вид действительно видимым, и запустить цикл обработки&lt;br /&gt;
сообщений приложения ''Qt''.&lt;br /&gt;
&lt;br /&gt;
Процедура сборки приложения выглядит несколько сложнее, чем в стандартном случае. После того как мы скомандовали ''qmake -project'',&lt;br /&gt;
нам необходимо «доработать» содержимое созданного файла '''.pro'''.&lt;br /&gt;
Как уже отмечалось, различные компоненты ''Qt'' расположены в разных&lt;br /&gt;
файлах библиотек, а заголовочные файлы – в разных директориях. К&lt;br /&gt;
сожалению, сама утилита ''qmake'' не может определить, какие модули&lt;br /&gt;
''Qt'' использует наша программа, и придется указать их явным образом.&lt;br /&gt;
Впрочем, сделать это несложно. Добавим в файл '''.pro''' строку&lt;br /&gt;
&lt;br /&gt;
 QT += sql&lt;br /&gt;
&lt;br /&gt;
Таким образом мы указываем, что нашей программе потребуется&lt;br /&gt;
модуль '''QtSql'''. В результате в создаваемый '''make'''-файл будут включены директивы, подключающие к проекту необходимые библиотеки&lt;br /&gt;
и указывающие расположение заголовочных файлов, необходимых&lt;br /&gt;
для работы с базами данных. Мы могли бы подключить компоненты&lt;br /&gt;
модуля ''SQL'' и «вручную». Для этого в файл '''.pro''' надо было бы добавить строку&lt;br /&gt;
&lt;br /&gt;
 LIBS += -lQtSql&lt;br /&gt;
&lt;br /&gt;
которая трансформировалась бы в '''make'''-файле в директиву компоновщика на связывание проекта с разделяемой библиотекой '''libQtSql.so'''. Заголовочные файлы модуля '''QtSql''' расположены по умолчанию&lt;br /&gt;
в директории '''/usr/include/QtSql/'''. Если бы мы делали все вручную,&lt;br /&gt;
нам бы следовало либо добавить эту директорию в переменную&lt;br /&gt;
'''INCLUDEPATH''' файла '''.pro''', либо заменить в исходных текстах програм-&lt;br /&gt;
мы директивы типа&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;QSqlDatabase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
на&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;QtSql/QSqlDatabase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видите, добавление модуля '''sql''' в переменную ''Qt'' избавило нас от&lt;br /&gt;
многих хлопот. Теперь наша программа готова к сборке. Командуем:&lt;br /&gt;
&lt;br /&gt;
 qmake&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
В результате получаем простенькую программу просмотра содержимого таблицы БД (Рис. 1).&lt;br /&gt;
&lt;br /&gt;
===То ли еще будет===&lt;br /&gt;
&lt;br /&gt;
Система ''Qt4'' подготовила для нас много нового. В следующей статье&lt;br /&gt;
мы продолжим знакомство со средой ''Interview'' и созданными на ее&lt;br /&gt;
основе компонентами, а также рассмотрим новые вспомогательные&lt;br /&gt;
средства разработчика ''Qt''. '''LXF'''&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF102_89_1.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
'''Рис. 1. Программа для просмотра музыкального каталога.'''&lt;/div&gt;</description>
			<pubDate>Tue, 07 Apr 2009 08:58:50 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:LXF102:Qt4</comments>		</item>
	</channel>
</rss>