<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2022495993688215761</id><updated>2012-01-21T22:32:12.709+06:00</updated><category term='pdf PoDoFo'/><category term='DataEdit'/><category term='Гради Буч'/><category term='Москва'/><category term='Переезд'/><category term='Nokia'/><category term='bug'/><category term='закат'/><category term='Heroes of Migth and Magic 2'/><category term='Криптография'/><category term='адаптация'/><category term='полный идиотизм'/><category term='Покер'/><category term='Свиной грипп'/><category term='ООП'/><category term='DirectMap'/><category term='Настоящий программист'/><category term='будда'/><category term='QScintilla QsciScintilla Lexer'/><category term='кругом маразм'/><category term='стресс'/><category term='Командировка в Москву'/><category term='QScintilla QsciScintilla'/><category term='самолеты'/><category term='С++'/><category term='Trolltech'/><category term='идиотизм'/><category term='PoDoFo Unicode text'/><category term='маразм'/><category term='Qt'/><category term='IP'/><category term='Qt Software'/><category term='сервер'/><category term='маразм крепчал'/><category term='iq'/><category term='комфорт'/><category term='Visual Basic 2005'/><category term='баг'/><category term='просто маразм'/><title type='text'>Qt Coding</title><subtitle type='html'>Qt programming, Qt tools, source code</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>81</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-1638442899115730820</id><published>2011-09-30T09:41:00.000+06:00</published><updated>2011-09-30T09:41:17.346+06:00</updated><title type='text'>Вставка QWidget в QTableWidget</title><content type='html'>Надо бы рассказать о способе вставки QWidget в QTableWidget.&lt;br /&gt;Вообще, я не очень люблю QTableWidget, т.к. больше привык к QTableView и QAbstractItemModel, QStyledItemDelegate. Но в случае если быстро нужна таблица, связанная с одной готовой моделью, то можно воспользоваться QTableWidget. В принципе, QTableWidget порожден от QTableView и умеет всё то, что умеет и QTableView.&lt;br /&gt;&lt;br /&gt;Перейдем к делу. Точнее&amp;nbsp;к постановке задачи.&lt;br /&gt;Надо вставить в ячейки QTableWidget виджеты. Пример на картинке.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-owhKJyXSot8/ToU0ElRAoDI/AAAAAAAAAMk/687XoIYRk7I/s1600/tablewidget.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-owhKJyXSot8/ToU0ElRAoDI/AAAAAAAAAMk/687XoIYRk7I/s1600/tablewidget.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;То есть, виджеты всегда на виду, а не скрываются, как это делается в случае с делегатом.&lt;br /&gt;В первом столбце банальный QLineEdit, во втором - пользовательский виджет для ввода даты.&lt;br /&gt;&lt;br /&gt;Как это сделать?&lt;br /&gt;В&amp;nbsp;коде я приведу работу с QTreeWidget, а не с QTableWidget, но разницы особой нет.&lt;br /&gt;&lt;br /&gt;Создаем QTreeWidget:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: Courier New;"&gt;treeWidget_ = &lt;span style="color: blue;"&gt;new&lt;/span&gt; QTreeWidget(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;br /&gt;treeWidget_-&amp;gt;setRootIsDecorated(&lt;span style="color: blue;"&gt;false&lt;/span&gt;);&lt;br /&gt;treeWidget_-&amp;gt;setSelectionBehavior(QAbstractItemView::SelectRows);&lt;br /&gt;treeWidget_-&amp;gt;setAlternatingRowColors(&lt;span style="color: blue;"&gt;false&lt;/span&gt;);&lt;br /&gt;treeWidget_-&amp;gt;header()-&amp;gt;setDefaultAlignment(Qt::AlignCenter);&lt;br /&gt;treeWidget_-&amp;gt;setEditTriggers(QAbstractItemView::NoEditTriggers);  &lt;br /&gt;treeWidget_-&amp;gt;setFocusPolicy(Qt::NoFocus);&lt;br /&gt;treeWidget_-&amp;gt;header()-&amp;gt;setStretchLastSection(&lt;span style="color: blue;"&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;/blockquote&gt;Метод для добавления строки виджетов:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt; SomeClass::appendRow(&lt;span style="color: blue;"&gt;const&lt;/span&gt; QWidgetList &amp;amp; widgets)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&lt;span style="color: green;"&gt;&amp;nbsp;//Создаем Item&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;QTreeWidgetItem * treeItem = &lt;span style="color: blue;"&gt;new&lt;/span&gt; QTreeWidgetItem(treeWidget_);&lt;br /&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;nbsp;int&lt;/span&gt; col = 0;&lt;br /&gt;&amp;nbsp;&lt;span style="color: green;"&gt;&amp;nbsp;//Добавляем виджеты в строку&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;foreach&lt;/span&gt; (QWidget * widget, widgets)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Создаем новый виджет, на котором разместим исходный виджет&lt;/span&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Разместим исходный виджет в Layout нового&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QWidget * newWidget = &lt;span style="color: blue;"&gt;new&lt;/span&gt; QWidget(treeWidget_);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QVBoxLayout * vb = &lt;span style="color: blue;"&gt;new&lt;/span&gt; QVBoxLayout;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vb-&amp;gt;setMargin(3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vb-&amp;gt;addWidget(widget);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newWidget-&amp;gt;setLayout(vb);&lt;br /&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Добавляем виджет и увеличиваем счетчик столбцов&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; treeWidget_-&amp;gt;setItemWidget(treeItem, col++, newWidget);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; treeWidget_-&amp;gt;scrollTo(treeWidget_-&amp;gt;model()-&amp;gt;index(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; treeWidget_-&amp;gt;model()-&amp;gt;rowCount() - 1, 0));&lt;br /&gt;&lt;br /&gt;&amp;nbsp; treeWidget_-&amp;gt;setCurrentItem(treeItem);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-1638442899115730820?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/1638442899115730820/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2011/09/qwidget-qtablewidget.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1638442899115730820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1638442899115730820'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2011/09/qwidget-qtablewidget.html' title='Вставка QWidget в QTableWidget'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-owhKJyXSot8/ToU0ElRAoDI/AAAAAAAAAMk/687XoIYRk7I/s72-c/tablewidget.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7913692259643188000</id><published>2011-06-17T16:44:00.001+06:00</published><updated>2011-06-17T16:48:42.508+06:00</updated><title type='text'>Добавление своего типа в QVariant</title><content type='html'>Хороший тип QVariant. Это может быть int, double, QDate, QMap, и еще полсотни типов.&lt;br /&gt;Добавим к этим типам собственный класс или структуру, чтобы с ней можно было бы общаться как с другими типами - помещать и извлекать из QVariant.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; SomeClass&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: green;"&gt;//всё что нужно&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;Q_DECLARE_METATYPE(SomeClass)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Итак, достаточно после определения класса вызвать макрос Q_DECLARE_METATYPE()&lt;br /&gt;Что это дает?&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Помещаем экземпляр класса в QVariant.&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;SomeClass scl;&lt;br /&gt;QVariant vclass = QVariant::fromValue(scl);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Всё, теперь экземпляр класса SomeClass, хранится как QVariant и с ним можно делать всё, что и с объектами типа QVariant.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Обратное преобразование.&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;scl = qvariant_cast&lt;someclass&gt;(vclass);&lt;/someclass&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Вообще говоря, в классе SomeClass крайне желательно определить оператор присваивания и&amp;nbsp;конструктор копирования, на случай если вдруг возникнет желание помещать его в контейнер типа QList&lt;qvariant&gt;. Если это обычная структура, то ничего страшного, конечно, не произойдет, элементы структуры скопируются компилятором.&lt;/qvariant&gt;&lt;br /&gt;&lt;br /&gt;Теперь об одной особенности макроса Q_DECLARE_METATYPE(). Он не приемлет запятых в определении.&lt;br /&gt;Написать что-то типа &lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;Q_DECLARE_METATYPE(QVector&amp;lt;QPair&amp;lt;QString, QString&amp;gt; &amp;gt;)&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;не получится, из-за запятой в определении шаблона.&lt;br /&gt;Лечится это хитрым патчем.&lt;br /&gt;&lt;br /&gt;&lt;div align="LEFT" lang="en-US" style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;#define&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt; Q_DECLARE_METATYPE_COMMA(...)                                         \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;QT_BEGIN_NAMESPACE                                                         \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;template&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt; &amp;lt;&amp;gt;                                                                \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;struct&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt; QMetaTypeId&amp;lt; __VA_ARGS__ &amp;gt;                                          \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;{                                                                          \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;enum&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt; { Defined = 1 };                                                   \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;&amp;nbsp;&amp;nbsp;static&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt; qt_metatype_id()                                             \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; {                                                                       \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt; QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt; (!metatype_id)                                                   \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; metatype_id = qRegisterMetaType&amp;lt; __VA_ARGS__ &amp;gt;( #__VA_ARGS__,   \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reinterpret_cast&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;&amp;lt; __VA_ARGS__ *&amp;gt;(quintptr(0)));   \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang=""&gt; metatype_id;                                                 \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; }                                                                       \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;};                                                                          \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Courier New, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;QT_END_NAMESPACE                                                            \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="LEFT" lang="en-US" style="margin-bottom: 0cm;"&gt;&lt;/div&gt;Я даже не буду рассказывать, что здесь делается т.к. сам не понимаю и хитрый патч вытащен откуда-то из просторов интернета.&lt;br /&gt;Главное, что с его помощью мы можем написать&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;Q_DECLARE_METATYPE_COMMA(QVector&amp;lt;QPair&amp;lt;QString, QString&amp;gt; &amp;gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&amp;nbsp;И тогда мы сможем назначить typedef&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;typedef QVector&amp;lt;QPair&amp;lt;QString, QString&amp;gt; &amp;gt; VectorPair;&lt;br /&gt;Q_DECLARE_METATYPE_COMMA(VectorPair)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;и&amp;nbsp;использовать тип VectorPair как QVariant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7913692259643188000?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7913692259643188000/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2011/06/qvariant.html#comment-form' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7913692259643188000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7913692259643188000'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2011/06/qvariant.html' title='Добавление своего типа в QVariant'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7733521877285945408</id><published>2011-06-15T18:25:00.000+06:00</published><updated>2011-06-15T18:25:37.587+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pdf PoDoFo'/><title type='text'>Обновилась PoDoFo</title><content type='html'>Обновилась библиотека podofo для работы с PDF до версии 0.9.1.&lt;br /&gt;Последнюю версию я использовал 0.8.2.&lt;br /&gt;Проблем со сборкой не было, но чтобы узнать список изменений пришлось сливать исходники из SVN и читать SVN ChangeLog, ибо в архиве никаких Changes'ов не было.&lt;br /&gt;Итак, what news.&lt;br /&gt;В основном добавились патчи, исправляющие баги, либо ускоряющие работу библиотеки с большими pdf-файлами.&lt;br /&gt;Изменен принцип сбоки библиотек, вместо двух сделали одну. Но это так, всё по мелочи.&lt;br /&gt;&lt;br /&gt;Главное, что библиотека хорошо работает как и прежде.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7733521877285945408?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7733521877285945408/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2011/06/podofo.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7733521877285945408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7733521877285945408'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2011/06/podofo.html' title='Обновилась PoDoFo'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8470524318635449695</id><published>2011-06-14T11:13:00.000+06:00</published><updated>2011-06-14T11:13:15.292+06:00</updated><title type='text'>QProgressIndicator</title><content type='html'>На qtapps.org есть много интересных виджетов, написанных обычными пользователями. Распространяется&amp;nbsp;свободно под LGPL.&lt;br /&gt;Например, QProgressIndicator - интересная крутилка прогресса в стиле FireFox.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-fq-JAUb2efc/TfbsuMLNWqI/AAAAAAAAAMg/MAOtaCKxvxI/s1600/indicator.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-fq-JAUb2efc/TfbsuMLNWqI/AAAAAAAAAMg/MAOtaCKxvxI/s1600/indicator.png" /&gt;&lt;/a&gt;&lt;/div&gt;Пример использования:&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;progress_ = &lt;span style="color: blue;"&gt;new&lt;/span&gt; QProgressIndicator(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;br /&gt;progress_-&amp;gt;setAnimationDelay(50);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;progress_-&amp;gt;startAnimation();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В итоге колесико будет крутиться пока ему не скажут &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;stopAnimation()&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8470524318635449695?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8470524318635449695/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2011/06/qprogressindicator.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8470524318635449695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8470524318635449695'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2011/06/qprogressindicator.html' title='QProgressIndicator'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-fq-JAUb2efc/TfbsuMLNWqI/AAAAAAAAAMg/MAOtaCKxvxI/s72-c/indicator.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-1915396184963159606</id><published>2011-05-19T18:27:00.002+06:00</published><updated>2011-05-19T18:27:38.570+06:00</updated><title type='text'>Поломать комп</title><content type='html'>&lt;a href="http://ithappens.ru/story/6244"&gt;Поломать компьютер&lt;/a&gt;? Легко: грохни MBR. Вряд ли дитё  знает, что это лечится одной консольной командой. Чтобы было совсем страшно,  объясни, что восстановление займёт пару недель, так как переустановка системы  снесёт все данные. Можно ещё в биосе температуру критического режима на минимум  выставить, тогда машина регулярно в ребут будет уходить. Битую планку памяти  воткнуть, видюху не до конца в разъём вставить, питание с проца убрать, винт с  мастера на слейв джапмером переключить, — мало ли вариантов? Экстремальный метод  — внутренние USB-разъёмы закольцевать.&lt;br /&gt;&lt;br /&gt;Совсем злодейская штука — с  разъёма для лампочки HDD кинуть мост через микрореле или транзистор на разъём  Reset, тогда машина будет в постоянном ребуте. Я сам такое делал для родителей  одного школяра. Главное в этом деле — всё спрятать под пластиковую «морду»  корпуса. Пару дней выпускник сам пытался найти неисправность, потом родители,  изобразив массовый поиск спеца, вызвали меня, и я забрал ящик в ремонт. Экзамены  школяр сдал, ящик отремонтированный получил назад.&lt;br /&gt;&lt;br /&gt;А проще всего пойти к  провайдеру и договориться о «неполадках» на линии на месяц-другой. К чему  мудрить?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-1915396184963159606?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/1915396184963159606/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2011/05/blog-post.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1915396184963159606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1915396184963159606'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2011/05/blog-post.html' title='Поломать комп'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-4117177334429824993</id><published>2010-10-19T17:41:00.000+06:00</published><updated>2010-10-19T17:41:13.650+06:00</updated><title type='text'>Интеграция Silverlight в Qt приложения</title><content type='html'>Хотелось бы опубликовать статью на русском языке об интеграции роликов Silverlight в Qt приложения.&lt;br /&gt;Для этого используется библиотека Qtitan, она коммерческая, увы, но может быть кого-то заинтересует. К тому же ее вполне можно использовать в демо-режиме в некоммерческих целях.&lt;br /&gt;Статья публикуется с негласного соглашения авторов фреймворка Qtitan Multimedia.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Интеграция Silverlight в Qt приложения&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Разработчики, которым довелось разрабатывать приложения на фреймворке Qt, любят его за удобство и простоту использования, и за мощность которая скрывается под капотом технологии.&lt;br /&gt;&lt;br /&gt;Мы тоже любим Qt, и мы захотели расширить наш любимый фреймворк возможностью работы с современной векторной графикой, например, мы захотели интегрировать в приложение ролики Adobe Flash или Microsoft Silverlight.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Ведь на Flash и Silverlight можно создавать умопомрачительные дизайнерские ролики, интерфейсы, игры, наконец. И все это доступно только через браузер. А ведь такие вещи будут нелишними и в десктоп приложениях. Встречайте наш компонент Qtitan Multimedia, созданный для того, чтобы объединить самые популярные технологии: Qt и мультимедийные платформы Flash и Silverlight.&lt;br /&gt;&lt;br /&gt;Сегодня мы поговорим об интеграции Silverlight-роликов в обычное приложение, написанное на Qt с использованием компонента Qtitan Multimedia.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Silverlight&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Так сложилось в нашем мире, что популярные технологии вместе с популярностью приобретают и конкурентов. Технология Adobe Flash получила себе в конкуренты графическую систему Silverlight от Microsoft.&lt;br /&gt;&lt;br /&gt;Flash и Silverlight в чем-то схожи в чем-то разнятся, но цель у этих технологий одна - создание и воспроизведение векторной анимации, интерактивных приложений, в том числе игр, интеграция видеороликов в веб-страницы.&lt;br /&gt;&lt;br /&gt;Можно подумать, что Microsoft слегка запоздала вытеснять Flash, анонсировав Silverlight 1.0 в 2006 году, когда Flash был уже вне досягаемости, но Microsoft это все таки Microsoft и ресурсов у них для победы в этом мультимедийном поединке технологий предостаточно.&lt;br /&gt;&lt;br /&gt;Что и подтверждается - на сегодняшний день Microsoft выпустил уже четвертую версию Silverlight и останавливаться определенно не собирается. Так, что тем, у кого возникают вопросы, вроде, “а нужно ли тратить время и усилия, чтобы изучать что-то новое?” хочется посоветовать забыть такие вопросы и, чтобы успеть вскочить на подножку поезда, начать изучать технологию Silverlight.&lt;br /&gt;&lt;br /&gt;С технической стороны для клиента Silverlight представляет собой плагин для браузера, аналогично плагину Flash. Точно также, при заходе на страницу с роликом Silverlight вас попросят скачать плагин с сайта Microsoft, после чего можно наслаждаться дизайнерскими творениями, написанными на передовой технологии.&lt;br /&gt;&lt;br /&gt;Плагин включает в себя полную версию .Net CLR. Таким образом, Silverlight-приложениям доступны все прелести .Net.&lt;br /&gt;&lt;br /&gt;Silverlight реализован для Windows XP, Windows Vista, Mac OS X начиная с десятой версии, и браузеров Internet Explorer (с шестой версии), Mozilla Firefox, Safari, Chrome, Opera. Для Linux существует проект Moonlight, реализованный с использованием Mono (открытая реализация .Net для Linux).&lt;br /&gt;&lt;br /&gt;Для разработчика Microsoft предоставила в распоряжение Visual Studio 2008 и пакет Silverlight Tools. &lt;br /&gt;&lt;br /&gt;Visual Studio 2008 должна быть с первым сервис паком, иначе Silverlight Tools просто откажется устанавливаться. &lt;br /&gt;&lt;br /&gt;&lt;em&gt;Qtitan&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Qtitan это&amp;nbsp;компонент, уникальным достоинством которого является возможность интеграции в обычное приложение, написанное на Qt, роликов Flash или Silverlight.&lt;br /&gt;&lt;br /&gt;Установив Qtitan Multimedia вы получите в распоряжение наследника от QWidget, на котором и будут располагаться ролики. Называется этот виджет Qtitan::Silverlight.&lt;br /&gt;&lt;br /&gt;Технически, отображение роликов достигается за счет использования NPAPI плагинов, благодаря чему данный класс-контейнер способен отображать Netscape-совместимые плагины.&lt;br /&gt;&lt;br /&gt;С прикладной точки зрения эти детали не имеют особого значения. Для прикладного программиста это будет стандартная работа с наследником QWidget.&lt;br /&gt;&lt;br /&gt;При этом мы получим не абстрактный черный ящик, мол подали туда ролик и забыли, а напротив, Qt приложение может активно взаимодействовать с Silverlight роликом.&lt;br /&gt;&lt;br /&gt;При этом есть два варианта взаимодействия:&lt;br /&gt;&lt;br /&gt;Мы можем обратиться к функции pluginScriptValue() виджета Qtitan::Silverlight и получить экземпляр QScriptValue. Получив QScriptValue мы можем общаться с роликом так же как это делает веб-браузер через JavaScript.&lt;br /&gt;&lt;br /&gt;И есть обратный способ: не Qt приложение обращается к ролику, а напротив - ролик Silverlight может вызвать функцию приложения. Достаточно зарегистрировать эту функцию вызовом метода registrScriptableFunction(...) виджета Qtitan::Silverlight. Тогда мы сможем при разработке ролика Silverlight вызвать эту функцию как обычную функцию JavaScript.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Qtitan Multimedia интегрируется с дизайнером форм Qt Designer, что позволяет упростить добавление новых объектов и ускорить процесс разработки. &lt;br /&gt;&lt;br /&gt;В следующей статье мы рассмотрим пример интеграции Silverlight ролика в Qt приложение.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-4117177334429824993?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/4117177334429824993/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/10/silverlight-qt.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4117177334429824993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4117177334429824993'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/10/silverlight-qt.html' title='Интеграция Silverlight в Qt приложения'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7212036522561966102</id><published>2010-10-13T19:48:00.001+06:00</published><updated>2010-10-13T19:49:04.109+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QScintilla QsciScintilla Lexer'/><title type='text'>QScintilla: определяем styleText</title><content type='html'>Вот мы и добрались до самой важной функции лексера &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;void styleText(int start, int end)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Займемся ее реализацией.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt; LexerZ::styleText(&lt;span style="color: blue;"&gt;int&lt;/span&gt; start, &lt;span style="color: blue;"&gt;int&lt;/span&gt; end)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//editor() - функция из родительского класса.&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Возвращает указатель на QsciScintilla&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!editor())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//получить исходник&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//выделим кусок памяти&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;// +1 - под \0&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;char&lt;/span&gt; * chars = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;char&lt;/span&gt;[end - start + 1];&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//заполним кусок обратившись&amp;nbsp;сцинтилле&lt;/span&gt;&lt;br /&gt;&amp;nbsp; editor()-&amp;gt;SendScintilla(QsciScintilla::SCI_GETTEXTRANGE,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start, end, chars);&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//преобразуем в строку&lt;/span&gt;&lt;br /&gt;&amp;nbsp; QString source(chars);&lt;br /&gt;&amp;nbsp; delete [] chars;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Оптимизация - кэшируем уже ранее отрисованную строку&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (source == cache)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;cache = source;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Не работаем с пустой строкой&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (source.isEmpty())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//вызываем функцию отрисовки комментария&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//передаем исходную строку, начало и конец&lt;/span&gt;&lt;br /&gt;&amp;nbsp; commentStyling(source, start, end);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;В комментариях описано, что мы делаем в этой функции. Здесь мы получаем строку, которую требуется отрисовать (это может быть не только текущая строка, а в том числе и соседние строки, сцинтилла в этом плане довольно умна).&lt;br /&gt;Дальше вызываем функцию&amp;nbsp;&lt;span style="font-family: Courier New;"&gt;commentStyling(source, start, end);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ее реализация приведена ниже:&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt; LexerZ::commentStyling(&lt;span style="color: blue;"&gt;const&lt;/span&gt; QString &amp;amp; line, &lt;span style="color: blue;"&gt;int&lt;/span&gt; start, &lt;span style="color: blue;"&gt;int&lt;/span&gt; end)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Если в строке вообще нет символов комментария, то ничего не делать&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!line.contains(&lt;span style="color: #a31515;"&gt;"**"&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Определяем сколько раз встречаются комменты (они могут быть в середине строки, или же line - это может быть на самом деле несколько строк)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; count = line.count(&lt;span style="color: #a31515;"&gt;"**"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; style = Comment;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; idxStart = 0;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; idxEnd = idxStart;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Обрабатываем каждый символ комментария&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;idxStart = line.indexOf(&lt;span style="color: #a31515;"&gt;"**"&lt;/span&gt;, idxStart);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (idxStart == -1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt; pos = line.indexOf(&lt;span style="color: #a31515;"&gt;"\r"&lt;/span&gt;, idxStart);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (pos != -1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idxEnd = pos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idxEnd&amp;nbsp; = idxStart + line.mid(idxStart).size();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Здесь мы сообщаем, что начинаем новый стиль&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//с позиции&amp;nbsp;start + idxStart&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;startStyling(start + idxStart);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt; len = idxEnd - idxStart;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//А здесь мы сообщаем, что начиная от текущей позиции, определенной startStyling,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//дальше последуют len символов стиля style == Comment &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;setStyling(len, style);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Заканчиваем отрисовку стиля&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;startStyling(start + idxEnd);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;idxStart = idxEnd;&lt;br /&gt;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Итак, здесь нужно уяснить основной прицип. Сначала мы сообщаем сцинтилле, что с позиции &lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;start + idxStart&lt;/span&gt;&amp;nbsp;начнется новый стиль.&amp;nbsp;&lt;span style="font-family: Courier New;"&gt;idxStart&lt;/span&gt;&amp;nbsp;это собственно индекс, которого начинается комментарий в текущей строке line.&lt;br /&gt;Дальше мы вычисляем сколько символов занимает коммент. Он может длиться до конца строки, определяемого символом \r. Длина коммента хранится в переменной len.&lt;br /&gt;Затем сообщаем сцинтилле, что len символов это коммент&amp;nbsp;:&amp;nbsp;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;setStyling(len, style);&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;Получив такое указание, сцинтилла начнет дергать виртуальные функции, которые мы определяли в предыдущем посте, с параметром style. Вот почему я говорил ранее, что название констант и их числовое значение особого смысла не имеют. Мы их сами определяли.&lt;br /&gt;И, наконец, сцинтилле надо сообщить, что стиль закончился startStyling(start + idxEnd);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;На этом я закрываю цикл статей о QScintilla. &lt;br /&gt;Если вспомню вдруг что интересное - выложу.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7212036522561966102?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7212036522561966102/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla-styletext.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7212036522561966102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7212036522561966102'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla-styletext.html' title='QScintilla: определяем styleText'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-3541229817504548584</id><published>2010-10-11T21:52:00.002+06:00</published><updated>2010-10-11T21:54:12.354+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QScintilla QsciScintilla Lexer'/><category scheme='http://www.blogger.com/atom/ns#' term='QScintilla QsciScintilla'/><title type='text'>QScintilla: раскрашиваем комментарии</title><content type='html'>Сегодня мы будем раскрашивать комментарии для некого гипотетического языка Z. &lt;br /&gt;Допустим в этом языке комментарии строк принято обозначать символом **, аналогично // в C++. Давайте предположим, что цвет &lt;span style="font-family: Comic Sans, &amp;quot;Times New Roman&amp;quot;, serif;"&gt;&lt;span style="background-color: #6aa84f; color: blue;"&gt;шрифта комментария - синий, цвет фона - светло-зеленый, а сам шрифт - Comic Sans&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;Начнем изменения в нашем коде Lexer.cpp и Lexer.h. (Можно переименовать эти файлы в LexerZ.h и LexerZ.cpp).&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Первым делом надо определить описание для этого стиля.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;QString LexerZ::description(&lt;span style="color: blue;"&gt;int&lt;/span&gt; style) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;switch&lt;/span&gt; (style)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;case&lt;/span&gt; Comment:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Comment"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;case&lt;/span&gt; Default:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Default"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; QString(style);&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Фактически нам это описание не нужно, но QScintilla просит, раз просит - значит нужно.&lt;br /&gt;Дальше определим цвет шрифта для комментария:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;QColor LexerZ::defaultColor(&lt;span style="color: blue;"&gt;int&lt;/span&gt; style) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (style == Comment)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; Qt::blue;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; QsciLexer::defaultColor(style);&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь - цвет фона:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;QColor LexerZ::defaultPaper(&lt;span style="color: blue;"&gt;int&lt;/span&gt; style) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (style == Comment)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; QColor(&lt;span style="color: #a31515;"&gt;"light-green"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; QsciLexer::defaultPaper(style);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Далее определим шрифт:&lt;br /&gt;&lt;br /&gt;&lt;span id="lblPreview"&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;QFont LexerZ::defaultFont(&lt;span style="color: blue;"&gt;int&lt;/span&gt; style) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; QFont f;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (style == Comment)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.setFamily(&lt;span style="color: #a31515;"&gt;"Comic Sans"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;f = QsciLexer::defaultFont(style);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; f;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;Вот мы и определили цвета для нашего комментария. Этого кода, впрочем, недостаточно для того, чтобы наш комментарий ** начал подсвечиваться. Нужно четко указать Scintille когда у нас начинается комментарий и какой стиль нужно использовать. Для этого нужно написать код в функции &lt;span style="font-family: Courier New;"&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt; LexerZ::styleText(&lt;span style="color: blue;"&gt;int&lt;/span&gt; start, &lt;span style="color: blue;"&gt;int&lt;/span&gt; end)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Об этом - в следующем выпуске.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-3541229817504548584?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/3541229817504548584/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla_11.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3541229817504548584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3541229817504548584'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla_11.html' title='QScintilla: раскрашиваем комментарии'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-3425993989220963359</id><published>2010-10-08T10:54:00.003+06:00</published><updated>2010-10-08T13:24:33.950+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QScintilla QsciScintilla Lexer'/><title type='text'>QScintilla: пишем Lexer</title><content type='html'>Перед дальнейшим написанием лексера нужно уяснить парадигму паттерна "Виртуальный метод", который использует QScintilla.&lt;br /&gt;Лескер состоит из набора виртуальный функций, которые нужно переопределить. Класс QsciScintilla при необходимости вызывает виртуальные методы базового класса, однако в соответствии с полиморфизмом, будут вызываться методы нашего лексера.&lt;br /&gt;Вот перечень виртуальных функций, необходимых для переопределения:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Возвращает название языка&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;char&lt;/span&gt; * language() &lt;span style="color: blue;"&gt;const&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Цвета для стилей&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; QColor defaultColor(&lt;span style="color: blue;"&gt;int&lt;/span&gt; style) &lt;span style="color: blue;"&gt;const&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Шрифты для стилей&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; QFont defaultFont(&lt;span style="color: blue;"&gt;int&lt;/span&gt; style) &lt;span style="color: blue;"&gt;const&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Бакгроунд для стилей&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; QColor defaultPaper(&lt;span style="color: blue;"&gt;int&lt;/span&gt; style) &lt;span style="color: blue;"&gt;const&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Разбор текста на стили&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; styleText (&lt;span style="color: blue;"&gt;int&lt;/span&gt; start, &lt;span style="color: blue;"&gt;int&lt;/span&gt; end);&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Описание&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; QString description (&lt;span style="color: blue;"&gt;int&lt;/span&gt; style) &lt;span style="color: blue;"&gt;const&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;Переменная style - это просто идентификатор стиля. Мы сами ее определяем. Для этого в лексере мы определяем некий enum для наших стилей.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;enum&lt;/span&gt;&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Default&amp;nbsp;= 0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Comment&amp;nbsp;= 1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Binary&amp;nbsp; = 2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;String&lt;/span&gt;&amp;nbsp; = 3,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Keyword1 = 4,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Keyword2 = 5,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Keyword3 = 6,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Keyword4 = 7,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Const&amp;nbsp;&amp;nbsp;= 8&lt;br /&gt;&amp;nbsp; };&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;Имена стилей&amp;nbsp;и их числовые обозначения значения не имеют,&amp;nbsp;далее станет ясно почему.&lt;br /&gt;Самой важной виртуальной функцией является&amp;nbsp;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; styleText (&lt;span style="color: blue;"&gt;int&lt;/span&gt; start, &lt;span style="color: blue;"&gt;int&lt;/span&gt; end);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Именно она отвечает за отрисовку. К этой функции QScintilla обращается всякий раз, когда ей надо перерисовать кусок текста начиная с позиции &lt;span style="background-color: cyan;"&gt;start&lt;/span&gt; до позиции &lt;span style="background-color: cyan;"&gt;end&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-3425993989220963359?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/3425993989220963359/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla-lexer.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3425993989220963359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3425993989220963359'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla-lexer.html' title='QScintilla: пишем Lexer'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-4082679950941374268</id><published>2010-10-07T19:00:00.002+06:00</published><updated>2010-10-08T13:22:51.088+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QScintilla QsciScintilla Lexer'/><title type='text'>QScintilla: создаем свой лексер</title><content type='html'>Как уже было сказано ранее, QScintilla поддерживает около 80 языков, раскрашивая каждый в соответствии с их синтаксисом. Т.е. для C++ комментарии задаются символом //, а для языка R&amp;nbsp;символом #. Соответственно, раскрашивать в каждом случае надо по своему.&lt;br /&gt;&lt;br /&gt;Трудно представить, что кроме этих 80 языков вам может понадобиться что-то свое, но тем не менее такая ситуация возникнуть может и надо знать как тут поступать.&lt;br /&gt;&lt;br /&gt;Вообще, есть два способа добавить свой язык для раскраски.&lt;br /&gt;Первый - это правка собственно исходного кода библиотеки qscintilla2.dll.&lt;br /&gt;Достоинства этого метода - простота добавления. Достаточно взять за пример уже какой-нибудь существующий лексер, скопировать его в новый файл, исправить несколько строк, пересобрать библиотеку и, вуаля, новый лексер готов.&lt;br /&gt;Недостаток этого метода очевиден - необходимость пересобирать библиотеку. Хотелось бы обойтись без этого.&lt;br /&gt;Для этого&amp;nbsp;в QScintilla есть путь истинного воина - наследование от QsciLexerCustom и самостоятельное написание алгоритмов раскраски. Это более сложный путь, на мой взгляд, но зато более правильный с концептуальной точки зрения, т.к. не нужно пересобирать библиотеку.&lt;br /&gt;&lt;br /&gt;Итак, первое что мы должны сделать - это отнаследоваться от QsciLexerCustom:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;#include &amp;lt;qsci/qscilexercustom.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Lexer : &lt;span style="color: blue;"&gt;public&lt;/span&gt; QsciLexerCustom&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; Q_OBJECT&lt;br /&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Конструктор&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Lexer(QObject * parent = 0);&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Деструктор&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; ~Lexer();&lt;br /&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; Lexer(&lt;span style="color: blue;"&gt;const&lt;/span&gt; Lexer &amp;amp;);&lt;br /&gt;&amp;nbsp; Lexer &amp;amp;&lt;span style="color: blue;"&gt;operator&lt;/span&gt;=(&lt;span style="color: blue;"&gt;const&lt;/span&gt; Lexer &amp;amp;);&lt;br /&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;В следующих выпусках мы продолжим написание своего лексера.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-4082679950941374268?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/4082679950941374268/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla_07.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4082679950941374268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4082679950941374268'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla_07.html' title='QScintilla: создаем свой лексер'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7050703096722602657</id><published>2010-10-07T10:42:00.002+06:00</published><updated>2010-10-13T19:50:53.361+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QScintilla QsciScintilla'/><title type='text'>QScintilla: создание редактора</title><content type='html'>Сейчас мы создадим экземпляр QScintilla и зададим ему некоторые свойства.&lt;br /&gt;В качестве языка для подсветки будем использовать C++.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;#include &amp;lt;Qsci/qsciscintilla.h&amp;gt;&lt;br /&gt;#include &amp;lt;Qsci/QsciLexerCPP.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Создаем редактор&lt;/span&gt;&lt;br /&gt;QsciScintilla * textEdit = &lt;span style="color: blue;"&gt;new&lt;/span&gt; QsciScintilla(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Создаем и устанавливаем лексер для C++&lt;/span&gt;&lt;br /&gt;QsciLexerCPP * lexCpp = &lt;span style="color: blue;"&gt;new&lt;/span&gt; QsciLexerCPP(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;br /&gt;textEdit-&amp;gt;setLexer(lexCpp);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Задаем формат ввода - без этого не будут вводиться русские буквы&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setUtf8(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Текущая строка подсвечивается горизонтальной линией&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setCaretLineVisible(&lt;span style="color: blue;"&gt;true&lt;/span&gt;); &lt;br /&gt;&lt;span style="color: green;"&gt;//Цвет линии&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setCaretLineBackgroundColor(QColor(&lt;span style="color: #a31515;"&gt;"gainsboro"&lt;/span&gt;));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Автоматический отступ&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setAutoIndent(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;textEdit-&amp;gt;setIndentationGuides(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: green;"&gt;//Заменять Tab на пробелы&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setIndentationsUseTabs(&lt;span style="color: blue;"&gt;false&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: green;"&gt;//Ширина отступа - 4 пробела&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setIndentationWidth(4);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Задаем символ конца строки&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;#if&lt;/span&gt; defined Q_WS_X11&lt;br /&gt;textEdit-&amp;gt;setEolMode(QsciScintilla::EolUnix);&lt;br /&gt;&lt;span style="color: blue;"&gt;#elif&lt;/span&gt; defined Q_WS_WIN&lt;br /&gt;textEdit-&amp;gt;setEolMode(QsciScintilla::EolWindows);&lt;br /&gt;&lt;span style="color: blue;"&gt;#elif&lt;/span&gt; defined Q_WS_MAC&lt;br /&gt;textEdit-&amp;gt;setEolMode(QsciScintilla::EolMac);&lt;br /&gt;&lt;span style="color: blue;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Задаем цвет вертикальной полосы слева - там где ставятся breakpoints, закладки, номера строк&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setMarginsBackgroundColor(QColor(&lt;span style="color: #a31515;"&gt;"gainsboro"&lt;/span&gt;));&lt;br /&gt;&lt;span style="color: green;"&gt;//Отображать номера строк&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setMarginLineNumbers(1, &lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: green;"&gt;//Ширина полосы - такая чтобы влезли символы до 1000&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setMarginWidth(1, QString(&lt;span style="color: #a31515;"&gt;"1000"&lt;/span&gt;));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Автозавершение лексем&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setAutoCompletionSource(QsciScintilla::AcsAll);&lt;br /&gt;textEdit-&amp;gt;setAutoCompletionCaseSensitivity(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;textEdit-&amp;gt;setAutoCompletionReplaceWord(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;textEdit-&amp;gt;setAutoCompletionShowSingle(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;textEdit-&amp;gt;setAutoCompletionThreshold(2);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Автоподсветка скобок&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setBraceMatching(QsciScintilla::SloppyBraceMatch);&lt;br /&gt;&lt;span style="color: green;"&gt;//Цвет подсветки - желный с синим&lt;/span&gt;&lt;br /&gt;textEdit-&amp;gt;setMatchedBraceBackgroundColor(Qt::yellow);&lt;br /&gt;textEdit-&amp;gt;setUnmatchedBraceForegroundColor(Qt::blue);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Слот на сигнал - "документ изменился"&lt;/span&gt;&lt;br /&gt;connect(textEdit, SIGNAL(textChanged()),&lt;br /&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;, SLOT(documentWasModified()));&lt;br /&gt;&lt;span style="color: green;"&gt;//Слот на сигнал - "курсор сместился"&lt;/span&gt;&lt;br /&gt;connect(textEdit, SIGNAL(cursorPositionChanged(&lt;span style="color: blue;"&gt;int&lt;/span&gt;, &lt;span style="color: blue;"&gt;int&lt;/span&gt;)),&lt;br /&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;, SLOT(cursorMoved(&lt;span style="color: blue;"&gt;int&lt;/span&gt;, &lt;span style="color: blue;"&gt;int&lt;/span&gt;)));&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;За дополнительной информацией по редактору можно обращаться к документации:&lt;br /&gt;&lt;a href="http://www.riverbankcomputing.co.uk/static/Docs/QScintilla2/classQsciScintilla.html"&gt;http://www.riverbankcomputing.co.uk/static/Docs/QScintilla2/classQsciScintilla.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7050703096722602657?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7050703096722602657/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintills.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7050703096722602657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7050703096722602657'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintills.html' title='QScintilla: создание редактора'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-3390386486981804776</id><published>2010-10-06T15:42:00.000+06:00</published><updated>2010-10-06T15:42:45.931+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QScintilla QsciScintilla'/><title type='text'>QScintilla: собираем проект</title><content type='html'>Напишем pro файл для включения QScintilla в свой проект. Я не буду приводить весь файл, а укажу на что нужно обратить внимание.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Конечно подключить библиотеку:&lt;br /&gt;&lt;span style="background-color: cyan;"&gt;unix:LIBS += -lqscintilla2&lt;br /&gt;win32:LIBS += qscintilla2.lib&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: white;"&gt;Определить переменные&lt;br /&gt;&lt;span style="background-color: yellow;"&gt;DEFINES += QSCINTILLA_DLL SCI_LEXER&lt;br /&gt;&lt;span style="background-color: white;"&gt;Здесь определены 2 переменные. Первая говорит, что мы используем экспорт из библиотеки qscintilla2. Вторая, что мы определяем свой лексер. Лексер - это объект, который отвечает за отрисовку текста. Соответственно, если в планах нет желания писать свой лексер (например, для какого-нибудь особо экзотического языка), то переменную SCI_LEXER определять не нужно.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="background-color: white;"&gt;Вот и все изменения в файле проекта. &lt;/span&gt;&lt;br /&gt;В пределах видимости нужно расположить qscintilla2.dll и включить в INCLUDEPATH путь до заголовочных файлов QScintilla (например, QScintilla\Qt4\Qsci\). &lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;После чего можно собирать проект.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-3390386486981804776?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/3390386486981804776/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla_06.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3390386486981804776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3390386486981804776'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla_06.html' title='QScintilla: собираем проект'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-2279864760143099027</id><published>2010-10-06T11:11:00.000+06:00</published><updated>2010-10-06T11:11:41.857+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QScintilla QsciScintilla'/><title type='text'>QScintilla: установка</title><content type='html'>Живет QScintilla здесь:&lt;br /&gt;&lt;a href="http://www.riverbankcomputing.co.uk/software/qscintilla/intro"&gt;http://www.riverbankcomputing.co.uk/software/qscintilla/intro&lt;/a&gt;&lt;br /&gt;Периодически выходят обновления, на сегодняшний день последняя версия - 2.4.5.&lt;br /&gt;QScintilla портирована как для Qt 3, так и для Qt 4. С третьей версией я не работаю и не знаю насколько там все хорошо, но для четверки все нормально, ничего допиливать не надо.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;О лицензии.&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;RiverBank распространяет QScintilla под тремя лицензиями:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GNU General Public License v2&lt;/li&gt;&lt;li&gt;GNU General Public License v3&lt;/li&gt;&lt;li&gt;Riverbank Commercial License&lt;/li&gt;&lt;/ul&gt;К сожалению, GPL. GPL - несвободная лицензия с серьезным ограничением. Вы не сможете использовать QScintilla в коммерческих приложениях. Точнее вам придется тогда открыть весь исходный код вашего приложения. Вы также не сможете включать собранную библиотеку QScintilla в дистрибутив вашего приложения.&lt;br /&gt;Но способ обойти ограничение есть.&lt;br /&gt;&lt;blockquote&gt;Как обмануть GPL: &lt;br /&gt;Например, можно на сайте сделать два линка: один на коммерческую программу , а второй — на GPL драйвер(библиотеку). Две независимые работы можно скачать по отдельности.&lt;/blockquote&gt;Вот такая неприятность.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Установка.&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;В сборке библиотеки нет ничего сложного - скачиваем, распаковываем, переходим в каталог QScintilla/Qt4 и запускаем &lt;span style="background-color: cyan;"&gt;qmake -tp vc&lt;/span&gt;. В итоге получаем проект qscintilla2.vcproj.&lt;br /&gt;Собираем его.&lt;br /&gt;&lt;br /&gt;Получаем в итоге qscintilla2.dll и qscintilla2.lib, которые будем использовать в программе.&lt;br /&gt;&lt;br /&gt;В следующем выпуске начнем работу с Qscintilla.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-2279864760143099027?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/2279864760143099027/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/2279864760143099027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/2279864760143099027'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla.html' title='QScintilla: установка'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-2263195697352097367</id><published>2010-10-06T09:38:00.002+06:00</published><updated>2010-10-06T09:41:54.748+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QScintilla QsciScintilla'/><title type='text'>QScintilla - продвинутый редактор для Qt</title><content type='html'>Открываю цикл статей о QScintilla. QScintilla это порт проекта Scintilla на Qt. Scintilla - это мощный кросплатформенный редактор текста.&lt;br /&gt;В его возможности входит:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Подсветка исходного кода различных языков. Поддерживается 78 самых известных языков (&lt;span style="background-color: yellow; color: blue; font-size: x-small;"&gt;Abaqus, Ada, APDL, Asm, Asn1, ASY, AU3, AVE, Baan, Bash, Basic, Bullant, Caml, CLW, Cmake, COBOL, Conf, CPP, Crontab, Csound, CSS, D, Eiffel, Erlang, EScript, Flagship, Forth, Fortran, GAP, Gen.py, Gui4Cli, Haskell, HTML, Inno, Kix, Lisp, Lout, Lua, Magik, Matlab, Metapost, MMIXAL, MPT, MSSQL, MySQL, Nimrod, Nsis, Opal, Others, Pascal, PB, Perl, PLM, POV, PowerPro, PowerShell, Progress, PS, Python, R, Rebol, Ruby, Scriptol, Smalltalk, SML, Sorcus, Specman, Spice, SQL, TACL, TADS3, TAL, TCL, TeX, VB, Verilog, VHDL, YAML&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Собственно редактирование кода и все, что с ним связано - отступы, cut/copy/paste, подсветка скобок и прочее. Возможностей - на полноценный&amp;nbsp;текстовый редактор.&lt;/li&gt;&lt;li&gt;Есть возможность добавить собственный язык и задать для него собственную раскраску.&lt;/li&gt;&lt;/ul&gt;Среди русской части Интернета крайне мало информации о работе с QScintilla. В основном информацию приходилось собирать по форумам, вникать в документацию, которая, кстати без примеров.&lt;br /&gt;В итоге я хочу в своем блоге выложить все, что мне известно о работе с QScintilla.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-2263195697352097367?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/2263195697352097367/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla-qt.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/2263195697352097367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/2263195697352097367'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/10/qscintilla-qt.html' title='QScintilla - продвинутый редактор для Qt'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6255111836067289281</id><published>2010-06-21T17:43:00.000+06:00</published><updated>2010-06-21T17:43:23.259+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PoDoFo Unicode text'/><title type='text'>Пишем в PDF русские символы и вообще Unicode</title><content type='html'>Продолжаем осваивать SDK PoDoFo для работы с pdf файлами.&lt;br /&gt;Сегодня я расскажу как в pdf-файл записать Unicode строки.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt; writeUnicode() &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Это наша тестовая строка, она извлекается из ресурсов&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Она будет переведена на русский, т.к. у нас включен транслятор&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//QTranslator&lt;/span&gt;&lt;br /&gt;&amp;nbsp; QString sTitle = QObject::tr(&lt;span style="color: #a31515;"&gt;"Test String"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Рисовалка на текущей странице&lt;/span&gt;&lt;br /&gt;&amp;nbsp; PdfPainter painter;&lt;br /&gt;&amp;nbsp; painter.SetPage(currentPage_);&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Кодировка&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; PdfEncoding * pEncoding;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//2х байтная кодировка&lt;/span&gt;&lt;br /&gt;&amp;nbsp; pEncoding = &lt;span style="color: blue;"&gt;new&lt;/span&gt; PdfIdentityEncoding();&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Параметры шрифта&lt;/span&gt;&lt;br /&gt;&amp;nbsp; PdfFont * pFont;&lt;br /&gt;&amp;nbsp; pFont = document_-&amp;gt;CreateFont(&lt;span style="color: #a31515;"&gt;"Arial"&lt;/span&gt;, pEncoding);&lt;br /&gt;&amp;nbsp; pFont-&amp;gt;SetFontSize(18.0);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Здесь конвертируем строку sTitle из QString в PdfString&lt;/span&gt;&lt;br /&gt;&amp;nbsp; QByteArray ba = sTitle.toUtf8();&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;char&lt;/span&gt; * dt = ba.data();&lt;br /&gt;&amp;nbsp; PdfString ps(reinterpret_cast&amp;lt;&lt;span style="color: blue;"&gt;const&lt;/span&gt; pdf_utf8*&amp;gt;(dt));&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//задаем шрифт&lt;/span&gt;&lt;br /&gt;&amp;nbsp; painter.SetFont(pFont);&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//рисуем текст на странице&lt;/span&gt;&lt;br /&gt;&amp;nbsp; painter.DrawText( 100.0, 100.0, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ps, ps.GetLength());&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//заканчиваем работу с рисовалкой&lt;/span&gt;&lt;br /&gt;&amp;nbsp; painter.FinishPage();&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: grey;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&amp;nbsp;Основная трудность была - понять как перевести из QString в PdfString. Ну и какую задать кодировку шрифту тоже было неочевидно. &lt;br /&gt;В итоге можем писать в PDF в любых Unicode символах.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6255111836067289281?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6255111836067289281/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/06/pdf-unicode.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6255111836067289281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6255111836067289281'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/06/pdf-unicode.html' title='Пишем в PDF русские символы и вообще Unicode'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-9078110891229618342</id><published>2010-06-15T14:57:00.001+06:00</published><updated>2010-06-15T14:58:42.336+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pdf PoDoFo'/><title type='text'>Помещаем и извлекаем данные из PDF</title><content type='html'>Разобрался как работать с аттачами в PDF через PoDoFo (кстати он недавно обновился до 0.8.1).&lt;br /&gt;Смысл в следующем - создается страница и к ней прикрепляется аннотация размером 0 на 0. Таких аннотаций на страницу может быть много. В качестве аннотации может быть текст, картинка или вложенный файл. Вот этим и воспользуемся.&lt;br /&gt;Итак - сама страница будет отображать данные в красивом виде, таблички там и прочее. Это нам неинтересно на данном этапе. Сейчас важно научиться создавать вложенные файлы.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Вот пример кода, который поместит все файлы из некого каталога в аннотацию к первой странице PDF.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;{&lt;br /&gt;&amp;nbsp; PdfMemDocument document;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//создаем страницу&lt;/span&gt;&lt;br /&gt;&amp;nbsp; PdfPage* pPage = document.CreatePage( PdfPage::CreateStandardPageSize( ePdfPageSize_A4 ) );&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//визуальное отображение страницы&lt;/span&gt;&lt;br /&gt;&amp;nbsp; PdfPainter painter;&lt;br /&gt;&amp;nbsp; painter.SetPage( pPage );&lt;br /&gt;&amp;nbsp; PdfFont * pFont = document.CreateFont( &lt;span style="color: #a31515;"&gt;"Arial"&lt;/span&gt; );&lt;br /&gt;&amp;nbsp; pFont-&amp;gt;SetFontSize( 18.0 );&lt;br /&gt;&amp;nbsp; painter.SetFont( pFont );&lt;br /&gt;&amp;nbsp; painter.DrawText( 56.69, pPage-&amp;gt;GetPageSize().GetHeight() - 56.69,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"PDF PAGE"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; painter.FinishPage();&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; QDir dr(&lt;span style="color: #a31515;"&gt;"E:\\DIR"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; dr.setFilter(QDir::Files);&lt;br /&gt;&amp;nbsp; QStringList lst = dr.entryList();&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (QString file, lst)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QString filename = dr.absolutePath() + &lt;span style="color: #a31515;"&gt;"/"&lt;/span&gt; + file;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PdfAnnotation * pAnn = pPage-&amp;gt;CreateAnnotation(ePdfAnnotation_FileAttachement,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PdfRect());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PdfFileSpec filespec(filename.toStdString().c_str(), &lt;span style="color: blue;"&gt;true&lt;/span&gt;, &amp;amp;document);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pAnn-&amp;gt;SetFileAttachement(filespec);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; document.Write(&lt;span style="color: #a31515;"&gt;"test.pdf"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;Более сложным было понять как извлечь аттачи. Документаци на этот счет крайне скудна, пришлось разбираться по исходному коду и изучать спецификацию по PDF от Adobe.&lt;br /&gt;Вот код, который извлекает все аттачи и складывает их в папку.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;{&lt;br /&gt;&amp;nbsp; PdfMemDocument doc(&lt;/span&gt;&lt;span style="color: #a31515; font-size: small;"&gt;"test.pdf"&lt;/span&gt;&lt;span style="font-size: small;"&gt;);&lt;br /&gt;&amp;nbsp; PdfVecObjects vec = doc.GetObjects();&lt;br /&gt;&amp;nbsp; PdfPage* page = doc.GetPage(0);&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;int&lt;/span&gt;&lt;span style="font-size: small;"&gt; numann = page-&amp;gt;GetNumAnnots();&lt;br /&gt;&amp;nbsp; QString dirname = &lt;/span&gt;&lt;span style="color: #a31515; font-size: small;"&gt;"e:/OUT/"&lt;/span&gt;&lt;span style="font-size: small;"&gt;;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;for&lt;/span&gt;&lt;span style="font-size: small;"&gt; (&lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;int&lt;/span&gt;&lt;span style="font-size: small;"&gt; i = 0; i &amp;lt; numann; i++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PdfAnnotation * pAnn = page-&amp;gt;GetAnnotation(i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;if&lt;/span&gt;&lt;span style="font-size: small;"&gt; (pAnn-&amp;gt;HasFileAttachement())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PdfFileSpec * attach = pAnn-&amp;gt;GetFileAttachement();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QString filename(attach-&amp;gt;GetFilename().GetString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;int&lt;/span&gt;&lt;span style="font-size: small;"&gt; li = filename.lastIndexOf(&lt;/span&gt;&lt;span style="color: #a31515; font-size: small;"&gt;"/"&lt;/span&gt;&lt;span style="font-size: small;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filename = filename.mid(li + 1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PdfObject * obj = attach-&amp;gt;GetObject();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PdfDictionary pob = obj-&amp;gt;GetDictionary().GetKey(&lt;/span&gt;  &lt;span style="color: #a31515; font-size: small;"&gt;"EF"&lt;/span&gt;&lt;span style="font-size: small;"&gt;)-&amp;gt;GetDictionary();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PdfReference &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;ref&lt;/span&gt;&lt;span style="font-size: small;"&gt; = pob.GetKey(&lt;/span&gt;&lt;span style="color: #a31515; font-size: small;"&gt;"F"&lt;/span&gt;&lt;span style="font-size: small;"&gt;)-&amp;gt;GetReference();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PdfObject * obstream = vec.GetObject(&lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;ref&lt;/span&gt;&lt;span style="font-size: small;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;if&lt;/span&gt;&lt;span style="font-size: small;"&gt; (obstream-&amp;gt;HasStream())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PdfStream * stream = obstream-&amp;gt;GetStream();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;char&lt;/span&gt;&lt;span style="font-size: small;"&gt;*&amp;nbsp;&amp;nbsp;pDecoded;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pdf_long lDecoded;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stream-&amp;gt;GetFilteredCopy(&amp;amp;pDecoded, &amp;amp;lDecoded);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PdfFileOutputStream &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;out&lt;/span&gt;&lt;span style="font-size: small;"&gt;(QString(dirname + filename).toStdString().c_str());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;out&lt;/span&gt;&lt;span style="font-size: small;"&gt;.Write(pDecoded, lDecoded);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;out&lt;/span&gt;&lt;span style="font-size: small;"&gt;.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-9078110891229618342?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/9078110891229618342/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/06/pdf-podofo-0.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/9078110891229618342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/9078110891229618342'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/06/pdf-podofo-0.html' title='Помещаем и извлекаем данные из PDF'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8675022392631132309</id><published>2010-06-03T17:38:00.000+06:00</published><updated>2010-06-03T17:38:15.140+06:00</updated><title type='text'>PDF в Qt</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;Столкнулся со следующей задачей. &lt;br /&gt;&lt;br /&gt;Нужно хранить некие данные (текст + графика) достаточно большого объема (~50 Мб) в одном файле.&lt;br /&gt;Желательно, чтобы это был общедоступный формат типа XML, но чтобы его мог просмотреть неискушенный юзер.&lt;br /&gt;То есть, данные в документе еще должны быть и оформлены красивым образом.&lt;br /&gt;На ум приходят:&lt;br /&gt;1) XML + XSL. Данные храним в XML, для отображения используем файл стилей. Минус — нет сжатия данных, вместо одного файла получаем два.&lt;br /&gt;2) OpenDocument. Не работал с ним.&lt;br /&gt;3) XPS файл.&lt;br /&gt;4) PDF.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Сам больше склоняюсь к PDF. Как SDK можно использовать PoDoFo.&lt;br /&gt;PDF хорош тем, что в нем есть криптование и сжатие.&lt;br /&gt;Минусом является то, что в PDF нет тегов как в XML и как извлекать данные пока не представляю.&lt;br /&gt;К тому же мы получается прописываем в этот файл одно оформление и поменять его на лету как в связке с XML+XSL не сможем.&lt;br /&gt;&lt;br /&gt;В результате выбор был сделан с сторону храненения в PDF.&lt;br /&gt;Схема взаимодействия примерно такая.&lt;br /&gt;&lt;br /&gt;Формируем XML, включающий все нужные данные (графика в Base64). XML сериализуем и запихиваем в PDF аттачем. Отдельно же делаем вьюшку, которую оформляем нужным образом со всеми красивостями. То есть, в PDF будут находиться реальные данные в неискаженном виде (они будут невидимы) и некая выжимка, превьюшка, этих данных.&lt;br /&gt;Соответственно нужно сгородить классы, которые будут все это реализовывать и не забыть синхронизировать данные и превьюшку при измнении.&lt;br /&gt;&lt;br /&gt;Собственно встал вопрос - как же работать с PDF? Есть официальный SDK от Adobe и стоит он некисло баксов. Гугление привело на сайт PoDoFo (http://podofo.sourceforge.net/about.html).&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;PoDoFo&lt;/b&gt; is a library to work with the PDF file format. The name comes from the first letter of PDF (Portable Document Format). A few tools to work with PDF files are already included in the &lt;b&gt;PoDoFo&lt;/b&gt; package. &lt;/blockquote&gt;&amp;nbsp; Сама библиотека podofo распространяется под LSPL, т.е. может быть использована в коммерческих целях, а ряд тулз в наборе под GPL, но нам они и не нужны.&lt;br /&gt;&lt;br /&gt;Сборка PoDoFo отдельная песня.&lt;br /&gt;Расскажу как это сделать под VS 2005.&lt;br /&gt;Во-первых, надо скачать сам podofo (на момент написания статьи доступна версия 0.8.0 от 25.04.10). &lt;br /&gt;Затем тащим библиотеку libjpeg (http://www.ijg.org/). Собираем либу. Выполням пару команд.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;copy jconfig.vc jconfig.h&lt;/code&gt; &amp;amp;&amp;amp; &lt;code&gt;nmake /f makefile.vc /a&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Тащим freetype (http://download.savannah.gnu.org/releases/freetype/)&lt;br /&gt;Разворачиваем, собирать не понадобилось как ни странно.&lt;br /&gt;&lt;br /&gt;Тащим zlib114dll (http://zlib.org/). Я тащил именно этот вариант. Т.к. с zlib125 или zlib123 ничего не вышло. Это уже собранные dll c h-файлом.&lt;br /&gt;&lt;br /&gt;Все эти библиотечки кучкой сложены рядом друг с другом.&lt;br /&gt;&lt;blockquote&gt;freetype-2.3.9&lt;br /&gt;jpeg-8b&lt;br /&gt;podofo-0.8.0&lt;br /&gt;zlib114&lt;/blockquote&gt;Далее. Нам нужен CMake (http://www.cmake.org/HTML/Download.html).&lt;br /&gt;Тащим, устанавливаем. Я ставил cmake-2.8.1-win32-x86.exe&lt;br /&gt;&lt;br /&gt;Вроде все.&lt;br /&gt;Начинаем сборку podofo.&lt;br /&gt;Мне понадобилось набросать такой батничег build.cmd.&lt;br /&gt;&lt;blockquote&gt;del cmakecache.txt&lt;br /&gt;set FTDIR=E:\Work\3rd\freetype-2.3.9&lt;br /&gt;set FTLIBDIR=E:\Work\3rd\freetype-2.3.9\objs\win32\vc2005&lt;br /&gt;set JPEGDIR=E:\Work\3rd\jpeg-8b&lt;br /&gt;set ZLIB_LIBRARY=E:\Work\3rd\zlib114\dll32\zlib.lib&lt;br /&gt;set ZLIB_INCLUDE_DIR=E:\Work\3rd\zlib114&lt;br /&gt;set PATH=E:\Work\3rd\zlib114\dll32;%PATH%&lt;br /&gt;set PATH=E:\Work\3rd\zlib114;%PATH%&lt;br /&gt;&lt;br /&gt;cmake -G "Visual Studio 8 2005" ..\podofo-0.8.0 -DCMAKE_INCLUDE_PATH="%FTDIR%\include;%JPEGDIR%\include;%JPEGDIR%;%ZLIBDIR%\include" -DCMAKE_LIBRARY_PATH="%FTLIBDIR%;%FTDIR%\lib;%JPEGDIR%\lib;%JPEGDIR%;%ZLIBDIR%\lib" -DPODOFO_BUILD_SHARED:BOOL=FALSE -DFREETYPE_LIBRARY_NAMES_DEBUG=freetype239MT_D -DFREETYPE_LIBRARY_NAMES_RELEASE=freetype239MT&lt;/blockquote&gt;&amp;nbsp;В итоге PoDoFo должно собраться и осчастливить появлением библиотеки podofo.dll.&lt;br /&gt;До кучи будут собраны тесты и экземплы.&lt;br /&gt;&lt;br /&gt;Все. Можно создавать PDF. Следующий код создаст PDF с надписью HELLO WORLD&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;&amp;nbsp; #include &lt;span style="color: #a31515;"&gt;"podofo.h"&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;using&lt;/span&gt; &lt;span style="color: blue;"&gt;namespace&lt;/span&gt; PoDoFo;&lt;br /&gt;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp; PdfStreamedDocument document(&lt;span style="color: #a31515;"&gt;"test.pdf"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; PdfPainter painter;&lt;br /&gt;&amp;nbsp; PdfPage* pPage;&lt;br /&gt;&amp;nbsp; PdfFont* pFont;&lt;br /&gt;&amp;nbsp; pPage = document.CreatePage( PdfPage::CreateStandardPageSize( ePdfPageSize_A4 ) );&lt;br /&gt;&amp;nbsp; painter.SetPage( pPage );&lt;br /&gt;&amp;nbsp; pFont = document.CreateFont( &lt;span style="color: #a31515;"&gt;"Arial"&lt;/span&gt; );&lt;br /&gt;&amp;nbsp; pFont-&amp;gt;SetFontSize( 18.0 );&lt;br /&gt;&amp;nbsp; painter.SetFont( pFont );&lt;br /&gt;&lt;br /&gt;&amp;nbsp; painter.DrawText( 56.69, pPage-&amp;gt;GetPageSize().GetHeight() - 56.69,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"HELLO WORLD!"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; painter.FinishPage();&lt;br /&gt;&amp;nbsp; document.Close();&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8675022392631132309?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8675022392631132309/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/06/pdf-qt.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8675022392631132309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8675022392631132309'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/06/pdf-qt.html' title='PDF в Qt'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-2905022156203446368</id><published>2010-03-25T09:06:00.002+05:00</published><updated>2010-03-25T09:23:28.628+05:00</updated><title type='text'>DirectMapTableModel</title><content type='html'>От DirectMap легко породить модель для представления данных.&lt;br /&gt;DirectMapTableModel - представляет простую таблицу из 2-х колонок.&lt;br /&gt;В первой колонке - ключи мапа, во второй - значения.&lt;br /&gt;Это нечто вроде QStringListModel, только с двумя колонками вместо одной.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/S6rg8uMHvYI/AAAAAAAAAJY/hcwLi-q1rq8/s1600/directmaptablemodel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/S6rg8uMHvYI/AAAAAAAAAJY/hcwLi-q1rq8/s320/directmaptablemodel.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;#ifndef DIRECTMAPTABLE_H&lt;br /&gt;&lt;span style="color: blue;"&gt;#define&lt;/span&gt; DIRECTMAPTABLE_H&lt;br /&gt;&lt;br /&gt;#include &amp;lt;QAbstractTableModel&amp;gt;&lt;br /&gt;#include &amp;lt;DirectMap&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; DirectMapTableModel : &lt;span style="color: blue;"&gt;public&lt;/span&gt; QAbstractTableModel&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Конструктор модели для DirectMap&lt;/span&gt;&lt;br /&gt;&amp;nbsp; DirectMapTableModel(&lt;span style="color: blue;"&gt;const&lt;/span&gt; DirectMap&amp;lt;Key, Value&amp;gt; &amp;amp; map,&amp;nbsp;QObject * parent = 0);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Установить заголовок&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; setHeaders(&lt;span style="color: blue;"&gt;const&lt;/span&gt; QString &amp;amp; header1, &lt;span style="color: blue;"&gt;const&lt;/span&gt; QString &amp;amp; header2)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;header1_ = header1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;header2_ = header2;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Количество строк&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; rowCount(&lt;span style="color: blue;"&gt;const&lt;/span&gt; QModelIndex &amp;amp; = QModelIndex()) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; map_.count(); &lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Количество колонок - для мапа их всегда 2&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; columnCount(&lt;span style="color: blue;"&gt;const&lt;/span&gt; QModelIndex &amp;amp; = QModelIndex()) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; 2; &lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! возвращаем данные&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; QVariant data(&lt;span style="color: blue;"&gt;const&lt;/span&gt; QModelIndex &amp;amp; index, &lt;span style="color: blue;"&gt;int&lt;/span&gt; role = Qt::DisplayRole) &lt;span style="color: blue;"&gt;const&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; QVariant headerData(&lt;span style="color: blue;"&gt;int&lt;/span&gt; section,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Qt::Orientation orientation,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; role = Qt::DisplayRole) &lt;span style="color: blue;"&gt;const&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Наш DirectMap&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; DirectMap&amp;lt;Key, Value&amp;gt; map_;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Заголовки &lt;/span&gt;&lt;br /&gt;&amp;nbsp; QString header1_;&lt;br /&gt;&amp;nbsp; QString header2_;&lt;br /&gt;};&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;DirectMapTableModel&amp;lt;Key, Value&amp;gt;::DirectMapTableModel&lt;br /&gt;( &lt;span style="color: blue;"&gt;const&lt;/span&gt; DirectMap&amp;lt;Key, Value&amp;gt; &amp;amp; map,&amp;nbsp;QObject * parent )&lt;br /&gt;: QAbstractTableModel(parent), map_(map)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;QVariant DirectMapTableModel&amp;lt;Key, Value&amp;gt;::data&lt;br /&gt;(&lt;span style="color: blue;"&gt;const&lt;/span&gt; QModelIndex &amp;amp; index, &lt;span style="color: blue;"&gt;int&lt;/span&gt; role) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!index.isValid())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; QVariant();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (role == Qt::DisplayRole)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (index.column() == 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; map_.key(index.row());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (index.column() == 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; map_.&lt;span style="color: blue;"&gt;value&lt;/span&gt;(index.row());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; QVariant();&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;QVariant DirectMapTableModel&amp;lt;Key, Value&amp;gt;::headerData(&lt;span style="color: blue;"&gt;int&lt;/span&gt; section,&lt;br /&gt;&amp;nbsp; Qt::Orientation orientation, &lt;span style="color: blue;"&gt;int&lt;/span&gt; role) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (orientation == Qt::Horizontal &amp;amp;&amp;amp; role == Qt::DisplayRole)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (section == 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; header1_;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (section == 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; header2_;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; QAbstractTableModel::headerData(section, orientation, role);&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;#endif&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Единственное, нужно расширить DirectMap функциями&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; DirectMap : &lt;span style="color: blue;"&gt;private&lt;/span&gt; QList&amp;lt;QPair&amp;lt;Key, Value&amp;gt; &amp;gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: green;"&gt;//.................................&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Количество строк&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; count() &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; QList::count();&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Возвратить ключ определенной строки&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Key key(&lt;span style="color: blue;"&gt;int&lt;/span&gt; row) &lt;span style="color: blue;"&gt;const&lt;/span&gt;; &lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Возвратить значение определенной строки&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Value &lt;span style="color: blue;"&gt;value&lt;/span&gt;(&lt;span style="color: blue;"&gt;int&lt;/span&gt; row) &lt;span style="color: blue;"&gt;const&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: green;"&gt;//.................................&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;Key DirectMap&amp;lt;Key, Value&amp;gt;::key(&lt;span style="color: blue;"&gt;int&lt;/span&gt; row) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; QPair&amp;lt;Key, Value&amp;gt; pair = QList::at(row);&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; pair.first;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;Value DirectMap&amp;lt;Key, Value&amp;gt;::&lt;span style="color: blue;"&gt;value&lt;/span&gt;(&lt;span style="color: blue;"&gt;int&lt;/span&gt; row) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; QPair&amp;lt;Key, Value&amp;gt; pair = QList::at(row);&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; pair.second;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Пример использования&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Создаем мап&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectMap&amp;lt;QString, QString&amp;gt; dmap;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dmap.append(tr(&lt;span style="color: #a31515;"&gt;"Last Name"&lt;/span&gt;), lname);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dmap.append(tr(&lt;span style="color: #a31515;"&gt;"First Name"&lt;/span&gt;), fname);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dmap.append(tr(&lt;span style="color: #a31515;"&gt;"Middle Name"&lt;/span&gt;), pname);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dmap.append(tr(&lt;span style="color: #a31515;"&gt;"Sex"&lt;/span&gt;), psex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dmap.append(tr(&lt;span style="color: #a31515;"&gt;"Birthday"&lt;/span&gt;), pdateb);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dmap.append(tr(&lt;span style="color: #a31515;"&gt;"Place of Residence"&lt;/span&gt;), paddr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Создаем модель&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectMapTableModel&amp;lt;QString, QString&amp;gt; * dmapTableModel &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;span style="color: blue;"&gt;new&lt;/span&gt; DirectMapTableModel&amp;lt;QString, QString&amp;gt;(dmap, &lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Назначаем ей заголовок&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dmapTableModel-&amp;gt;setHeaders(tr(&lt;span style="color: #a31515;"&gt;"Key"&lt;/span&gt;), tr(&lt;span style="color: #a31515;"&gt;"Value"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Устанавливаем модель на представление&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;tableView-&amp;gt;setModel(dmapTableModel);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-2905022156203446368?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/2905022156203446368/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/03/directmaptablemodel.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/2905022156203446368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/2905022156203446368'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/03/directmaptablemodel.html' title='DirectMapTableModel'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZsKM8U6wXHU/S6rg8uMHvYI/AAAAAAAAAJY/hcwLi-q1rq8/s72-c/directmaptablemodel.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8803805262483081081</id><published>2010-03-01T14:20:00.000+05:00</published><updated>2010-03-01T14:20:54.895+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='баг'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Qt баг</title><content type='html'>Под виндой с любой Qt, вплоть до последней, есть такой косяк с тулбаром.&lt;br /&gt;Нужно: QMainWindow с тулбаром. Кнопка на тулбаре должна что-нибудь делать, желательно показывать некий диалог. Диалог должен закрываться по Esc.&lt;br /&gt;Делаем: Быстро быстро клацаем по кнопке тулбара и тут же жмем Esc, закрывая тем самым диалог. На определенной итерации мы увидем, что кнопку тулбара залипла. Так, как будто у нее стоит статус Checkable.&lt;br /&gt;Это легко проверить с Assistant'ом. Вызываем печать через тулбар и отменяем ее по Esc.&lt;br /&gt;Итог: Весьма неприятно. На Qt и так полно нападок от нативщиков, и тут этот очевидный баг.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8803805262483081081?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8803805262483081081/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/03/qt.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8803805262483081081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8803805262483081081'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/03/qt.html' title='Qt баг'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-1829981074176784497</id><published>2010-03-01T09:33:00.000+05:00</published><updated>2010-03-01T09:33:52.284+05:00</updated><title type='text'>Rotated Label</title><content type='html'>Компонента "Вращаемая надпись" - QLabel, который может быть повернут на любой угол. Стандартными Qt выми средствами этого не сделать, поэтому нужно изобретать велосипед.&lt;br /&gt;&lt;br /&gt;Сначала мой &lt;a href="http://docs.google.com/leaf?id=0Bx1VzZRq6XlLNTk3ZjEzNDUtYzI0Yi00MzliLWExNGQtYTI0MTQ5YWU0N2Vl&amp;amp;hl=en"&gt;велосипед&lt;/a&gt;. Здесь используется отрисовка текста QPainter'ом.&lt;br /&gt;И &lt;a href="http://docs.google.com/leaf?id=0Bx1VzZRq6XlLYTMxZWYyNTMtN2EyYy00NDljLTgyYTYtNjYyODUxODNmMzUw&amp;amp;hl=en"&gt;другой велосипед&lt;/a&gt;. От &lt;b&gt;&lt;a href="http://www.prog.org.ru/index.php?action=profile;u=5514" title="Просмотр профиля shapoclak"&gt;shapoclak&lt;/a&gt;.&lt;/b&gt;&lt;br /&gt;Здесь товарищ подошел с более интересной стороны&lt;br /&gt;&lt;blockquote&gt;В качестве девайса отрисовки виджета используется QPixmap. А сам QPixmap после любых манипуляций уже отрисовывается в любом другом месте. Подход хорош тем, что весь функционал QLabel остается.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-1829981074176784497?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/1829981074176784497/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/03/rotated-label.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1829981074176784497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1829981074176784497'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/03/rotated-label.html' title='Rotated Label'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-3195284248757997543</id><published>2010-02-27T15:01:00.000+05:00</published><updated>2010-02-27T15:01:09.716+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DataEdit'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>AbstractDateEdit - замена QDateEdit</title><content type='html'>QDateEdit - компонент для редактирования даты в Qt не умеет задавать пустую дату. Как это ни пародоксально. Пустая дата для него означает 01.01.2000.&lt;br /&gt;Qt сообщество по этому поводу неоднократно сокрушалось и продолжало грызть кактус.&lt;br /&gt;Результат моих грызений - собственный компонент AbstractDateEdit. Он обозван абстрактным, т.к. от него я планирую создать компоненты для работы с другими исчислениями даты. Но этот компонент ни фига не абстрактный а самый обычный, работающий с григорианским счислением. Имеет выпадающий календарик и прочие прелести.&lt;br /&gt;Качать &lt;a href="http://docs.google.com/leaf?id=0Bx1VzZRq6XlLOTIzOTYzMjMtMzZhOS00NTA1LWEyNjEtYjk0NTA0YTdhNTUz&amp;amp;hl=en"&gt;здесь&lt;/a&gt; .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-3195284248757997543?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/3195284248757997543/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/abstractdateedit-qdateedit.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3195284248757997543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3195284248757997543'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/abstractdateedit-qdateedit.html' title='AbstractDateEdit - замена QDateEdit'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-1709548702331657908</id><published>2010-02-27T09:22:00.000+05:00</published><updated>2010-02-27T09:22:31.656+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IP'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Узнаем свой IP под Qt</title><content type='html'>В файле проекта подключаем QT += network&lt;br /&gt;Используем.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;#include &amp;lt;QNetworkInterface&amp;gt;&lt;br /&gt;&lt;br /&gt;QString localIP()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; QString locIP;&lt;br /&gt;&amp;nbsp; QList&amp;lt;QHostAddress&amp;gt; addr = QNetworkInterface::allAddresses();&lt;br /&gt;&amp;nbsp; locIP = addr.first().toString();&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; locIP;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-1709548702331657908?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/1709548702331657908/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/ip-qt.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1709548702331657908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1709548702331657908'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/ip-qt.html' title='Узнаем свой IP под Qt'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6660389950155324234</id><published>2010-02-26T08:54:00.001+05:00</published><updated>2010-02-26T09:44:05.861+05:00</updated><title type='text'>AuthUnit - модуль авторизации</title><content type='html'>Добавил простенький модуль авторизации на Qt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Функции модуля&lt;/b&gt;:&lt;br /&gt;Авторизация пользователя и добавление нового с разграничением прав.&lt;br /&gt;Модуль использует QSQLite. Требуемые модули Qt : QtSql, QtXml.&lt;br /&gt;Пароли хэшируются MD5 и хранятся в конфигурационном файле config.xml.&lt;br /&gt;При отсутствии конф. файла или повреждении его структуры модуль не проводит авторизацию.&lt;br /&gt;&lt;br /&gt;Скачать можно &lt;a href="http://docs.google.com/leaf?id=0Bx1VzZRq6XlLOWNiYzcyYmUtMTM2OS00ZjM4LTg3MWEtODE5OGUyYmM3M2Qw&amp;amp;sort=name&amp;amp;layout=list&amp;amp;num=50"&gt;здесь&lt;/a&gt;. &lt;br /&gt;В архиве файл проекта .pri. Там же есть пример использования.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/S4dEbXAMM0I/AAAAAAAAAJA/W7oPrGshl2U/s1600-h/auth1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/S4dEbXAMM0I/AAAAAAAAAJA/W7oPrGshl2U/s320/auth1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/S4dEfhR68BI/AAAAAAAAAJI/yG5e2kgKtls/s1600-h/auth2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/S4dEfhR68BI/AAAAAAAAAJI/yG5e2kgKtls/s320/auth2.png" /&gt;&lt;/a&gt;&lt;/div&gt;Использовать крайне просто. Нужно прицепить файл проекта к своему проекту вписав в него строчку &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;include(AuthUnit/AuthUnit.pri)&lt;/span&gt;&lt;br /&gt;После этого использовать&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; AuthUnit au;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;if&lt;/span&gt;&lt;span style="font-size: small;"&gt; (au.exec() != QDialog::Accepted)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;isAuthorized = &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;false&lt;/span&gt;&lt;span style="font-size: small;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;return&lt;/span&gt;&lt;span style="font-size: small;"&gt;;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;else&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;isAuthorized = &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;true&lt;/span&gt;&lt;span style="font-size: small;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;UserLogon user = au.logon();&lt;br /&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt; &lt;/blockquote&gt;&amp;nbsp;Используется структура UserLogon.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;&lt;span style="color: blue;"&gt;struct&lt;/span&gt; UserLogon&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; QString name;&lt;br /&gt;&amp;nbsp; QString permission;&lt;br /&gt;};&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6660389950155324234?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6660389950155324234/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/authunit.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6660389950155324234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6660389950155324234'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/authunit.html' title='AuthUnit - модуль авторизации'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZsKM8U6wXHU/S4dEbXAMM0I/AAAAAAAAAJA/W7oPrGshl2U/s72-c/auth1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8778301792893024953</id><published>2010-02-26T08:33:00.001+05:00</published><updated>2010-02-26T08:34:09.806+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DirectMap'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>DirectMap, оператор склейки</title><content type='html'>Расширим DirectMap оператором добавления.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;template &amp;#60;&lt;font color="#0000ff"&gt;class&lt;/font&gt; Key, &lt;font color="#0000ff"&gt;class&lt;/font&gt; Value&amp;#62;&lt;br /&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt; DirectMap&amp;#60;Key, Value&amp;#62;::&lt;font color="#0000ff"&gt;operator&lt;/font&gt;&amp;#60;&amp;#60;(&lt;font color="#0000ff"&gt;const&lt;/font&gt; DirectMap&amp;#60;Key, Value&amp;#62; &amp;#38; right)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;font color="#0000ff"&gt;foreach&lt;/font&gt; (QString key, right.keys())&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;append(key, right[key]);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8778301792893024953?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8778301792893024953/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/directmap.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8778301792893024953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8778301792893024953'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/directmap.html' title='DirectMap, оператор склейки'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-75687971784305458</id><published>2010-02-25T10:59:00.005+05:00</published><updated>2010-02-25T12:09:47.104+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DirectMap'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>DirectMap - упорядоченный map</title><content type='html'>Недостаток ассоциативного массива QMap в том, что в нем ключи упорядочиваются. Т.е. если я добавлю в QMap" Key2", "Key1", то на выходе получу, сюрприз, "Key1", "Key2". Ключи будут отсортированы.&lt;br /&gt;Такое поведение честно говоря подзае..ло, а альтернативы в Qt нету.&lt;br /&gt;В качестве альтернативы они предлагают использовать QList&lt;qpair&gt;&amp;lt;QPair&lt;/qpair&gt;&amp;lt;&lt;qpair&gt;&amp;gt;&amp;gt;. Крайне громоздкая структура.&lt;/qpair&gt;&lt;br /&gt;Наконец я решил сделать класс с удобством пользования как у QMap и с функционалом как у QList, т.е. без автоматического упорядочивания по ключам.&lt;br /&gt;&lt;br /&gt;Начнем пожалуй.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;#ifndef DIRECTMAP_H&lt;br /&gt;&lt;span style="color: blue;"&gt;#define&lt;/span&gt; DIRECTMAP_H&lt;br /&gt;&lt;br /&gt;#include &amp;lt;QList&amp;gt;&lt;br /&gt;#include &amp;lt;QPair&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; DirectMap : &lt;span style="color: blue;"&gt;private&lt;/span&gt; QList&amp;lt;QPair&amp;lt;Key, Value&amp;gt; &amp;gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Добавляем пару&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; append(&lt;span style="color: blue;"&gt;const&lt;/span&gt; Key &amp;amp;, &lt;span style="color: blue;"&gt;const&lt;/span&gt; Value &amp;amp;);&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//! Список ключей&lt;/span&gt;&lt;br /&gt;&amp;nbsp; QList&amp;lt;Key&amp;gt; keys() &lt;span style="color: blue;"&gt;const&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//!&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Value &lt;span style="color: blue;"&gt;operator&lt;/span&gt;[](&lt;span style="color: blue;"&gt;const&lt;/span&gt; Key &amp;amp; key) &lt;span style="color: blue;"&gt;const&lt;/span&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt; DirectMap&amp;lt;Key, Value&amp;gt;::append(&lt;span style="color: blue;"&gt;const&lt;/span&gt; Key &amp;amp; key, &lt;span style="color: blue;"&gt;const&lt;/span&gt; Value &amp;amp; &lt;span style="color: blue;"&gt;value&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; QList::append(qMakePair(key, &lt;span style="color: blue;"&gt;value&lt;/span&gt;));&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;QList&amp;lt;Key&amp;gt; DirectMap&amp;lt;Key, Value&amp;gt;::keys() &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; QList&amp;lt;Key&amp;gt; resKeys;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; QList::count(); ++i)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;resKeys.append(QList::at(i).first);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; resKeys;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;template &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Key, &lt;span style="color: blue;"&gt;class&lt;/span&gt; Value&amp;gt;&lt;br /&gt;Value DirectMap&amp;lt;Key, Value&amp;gt;::&lt;span style="color: blue;"&gt;operator&lt;/span&gt;[](&lt;span style="color: blue;"&gt;const&lt;/span&gt; Key &amp;amp; key) &lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; QList::count(); ++i)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (QList::at(i).first == key)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; QList::&lt;span style="color: blue;"&gt;value&lt;/span&gt;(i).second;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; Value();&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: green;"&gt;//---------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;#endif&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Пример использования:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;&amp;nbsp; DirectMap&amp;lt;QString, QString&amp;gt; dmap;&lt;br /&gt;&amp;nbsp; dmap.append(&lt;span style="color: #a31515;"&gt;"key3"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"value3"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; dmap.append(&lt;span style="color: #a31515;"&gt;"key2"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"value2"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; dmap.append(&lt;span style="color: #a31515;"&gt;"key1"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"value1"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; DirectMap&amp;lt;QString, &lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt; dmap1;&lt;br /&gt;&amp;nbsp; dmap1.append(&lt;span style="color: #a31515;"&gt;"key3"&lt;/span&gt;, 3);&lt;br /&gt;&amp;nbsp; dmap1.append(&lt;span style="color: #a31515;"&gt;"key2"&lt;/span&gt;, 2);&lt;br /&gt;&amp;nbsp; dmap1.append(&lt;span style="color: #a31515;"&gt;"key1"&lt;/span&gt;, 1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt;(QString key, dmap.keys())&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;qDebug() &amp;lt;&amp;lt; key &amp;lt;&amp;lt; dmap[key];&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt;(QString key, dmap1.keys())&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;qDebug() &amp;lt;&amp;lt; key &amp;lt;&amp;lt; dmap1[key];&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Как видим - удобство QMap, но без автосортировки. Удобно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-75687971784305458?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/75687971784305458/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/directmap-map.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/75687971784305458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/75687971784305458'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/directmap-map.html' title='DirectMap - упорядоченный map'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6181592692870731678</id><published>2010-02-24T11:19:00.003+05:00</published><updated>2010-02-25T09:17:14.577+05:00</updated><title type='text'>Qt и zip архивирование</title><content type='html'>Архивирование в Qt представлено методами qCompress() qUnCompress(). Они сожмут/разожмут некую последовательность байт, но обо всем остальном (запись в файл, сохранение структуры директорий, запись комментария и проч.) придется позаботиться тебе.&lt;br /&gt;Поэтому для Qt написано много пакетов для работы с архивами.&lt;br /&gt;Я лично предпочитаю The OSDaB Project.&lt;br /&gt;&lt;a href="http://code.google.com/p/osdab/source/browse/trunk/OSDaB-Zip"&gt;http://code.google.com/p/osdab/source/browse/trunk/OSDaB-Zip&lt;/a&gt;&lt;br /&gt;Meet a couple of pure-Qt/C++ classes capable of handling PKZIP 2.0 compatible  zip archives.&lt;br /&gt;&lt;br /&gt;Чтобы им пользоваться Qt должна быть собрана с поддержкой zlib. Само использование крайне легко, в примерах все описано.&lt;br /&gt;Я же расскажу о неком досадном баге в этом пакете.&lt;br /&gt;Я не буду углубляться в формат zip файла, он довольно сложен, главное вот это&lt;br /&gt;&lt;blockquote&gt;&lt;span onmouseout="_tipoff()" onmouseover="_tipon(this)"&gt;Файл ZIP определяется наличием &lt;i&gt;центрального каталога&lt;/i&gt;, который расположен в конце файла.&lt;/span&gt;&lt;span onmouseout="_tipoff()" onmouseover="_tipon(this)"&gt; В каталоге хранится список имен записей (файлов или каталогов), которые хранятся в файле ZIP, наряду с другими метаданными о входе и смещении в файле ZIP, указывающими на фактическое расположение сжатых данных.&lt;/span&gt;&lt;/blockquote&gt;Проблема в том, что OSDaB считает что центральный каталог начинается начинается с минус 22 байта от конца архива. Т.е. он отступает 22 байта от конца файла архива и ищет там начало секции Центрального Каталога. Секция ЦК начинается с байт PK56. Так вот если он ее там не найдет, то начинается двигаться в начало файла но с шагом кратным 22. Для большинства архивов это работает. По ходу работы пришлось столкнуться с архивами у которых ЦК начинается вовсле не с -22 байта, а с 18 или 21. Поэтому проект пришлось подправить чтобы начинал поиск секции ЦК с 18 и шагал по 1 байту в начало. Это понижает скорость работы архиватора, но по крайней мере нужные мне архивы стали нормально читаться.&lt;br /&gt;&lt;br /&gt;Правки, которые пришлось сделать, располагаются в файле&amp;nbsp; unzip.cpp&lt;br /&gt;Магический параметр UNZIP_EOCD_SIZE установлен равным 18 &lt;br /&gt;В функции &lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;UnZip::ErrorCode UnzipPrivate::seekToCentralDirectory()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;закоментарена строчка &lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;//offset -= UNZIP_EOCD_SIZE;&lt;/span&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;чтобы шаг был 1 байт. Кроме того&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;offset -= 1 &lt;span style="color: green;"&gt;/*UNZIP_EOCD_SIZE*/&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;И ввел дополнительную проверку&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: x-small;"&gt;&lt;span style="color: blue; font-size: small;"&gt;if&lt;/span&gt;&lt;span style="font-size: small;"&gt; (offset &amp;gt; length)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;offset = getSULong((&lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;const&lt;/span&gt;&lt;span style="font-size: small;"&gt; unsigned &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;char&lt;/span&gt;&lt;span style="font-size: small;"&gt;*) buffer1, UNZIP_EOCD_OFF_CDOFF + 4);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;Определив функцию &lt;span style="font-size: small;"&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New;"&gt;getSULong&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;quint32 UnzipPrivate::getSULong(&lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;const&lt;/span&gt;&lt;span style="font-size: small;"&gt; unsigned &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;char&lt;/span&gt;&lt;span style="font-size: small;"&gt;* data, quint32 offset) &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;const&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; quint32 res = (quint32) data[offset];&lt;br /&gt;&amp;nbsp;&amp;nbsp; res |= (((quint32)data[offset+1]) &amp;lt;&amp;lt; 8);&lt;br /&gt;&amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;return&lt;/span&gt;&lt;span style="font-size: small;"&gt; res;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6181592692870731678?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6181592692870731678/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qt-zip.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6181592692870731678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6181592692870731678'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qt-zip.html' title='Qt и zip архивирование'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-5808311193565606584</id><published>2010-02-20T02:05:00.002+05:00</published><updated>2010-02-20T02:05:38.478+05:00</updated><title type='text'>Цытата</title><content type='html'>Плакал от цитаты. Насколько верно....&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: Tahoma, 'Times New Roman', Verdana, Arial, sans-serif; font-size: 12px;"&gt;Eсли кучку программистов оставить на некоторое время без присмотра (читай без управления), они очень быстро скатываются в производство не продукта, а прикольных фиговин для самих себя. Как правило, эти фиговины остальным людям не интересны, поэтому программистам перестают давать за них деньги.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;Прикольные фиговины для себя - моя слабость ))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-5808311193565606584?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/5808311193565606584/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/blog-post_20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5808311193565606584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5808311193565606584'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/blog-post_20.html' title='Цытата'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-1006330475920907452</id><published>2010-02-19T16:31:00.000+05:00</published><updated>2010-02-19T16:31:00.535+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iq'/><title type='text'>Мой вселенский IQ</title><content type='html'>Проверялся по тесту и в середине жутко захотелось по маленькому.&lt;br /&gt;Поставить тест на паузу нельзя, поэтому побежал до ветру.&lt;br /&gt;Чтобы уложиться во времени пришлось пропускать часть вопросов.&lt;br /&gt;Итог - 133. Ну хоть не 85. Позже пройду еще раз - гляну скок наберу.&lt;br /&gt;&lt;div style="border-style: groove; border-width: thick; width: 380px;" title="Узнай свой IQ!"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td height="117px" width="80px"&gt;&lt;img src="http://sly2m.com/sly2m/IQ/images/brain.jpg" /&gt;&lt;/td&gt;&lt;td align="center" width="280px"&gt;&lt;div style="color: blue; font-family: Verdana; font-weight: bold; line-height: 2;"&gt;Мой IQ - &lt;span style="color: red; font-size: larger;"&gt;133&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sly2m.com/sly2m/IQ"&gt;www.sly2m.com/sly2m/IQ&lt;/a&gt;&lt;/div&gt;&lt;a href="http://sly2m.livejournal.com/102834.html" style="text-decoration: none;"&gt;&lt;img border="0" src="" width="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-1006330475920907452?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/1006330475920907452/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/iq.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1006330475920907452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1006330475920907452'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/iq.html' title='Мой вселенский IQ'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-1747852541078116844</id><published>2010-02-16T10:17:00.000+05:00</published><updated>2010-02-16T10:17:47.619+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Криптография'/><title type='text'>Криптография под Qt выпуск 4</title><content type='html'>Набор библиотек для переноса QCA:&lt;br /&gt;plugins\crypto\qca-ossl2.dll&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 196 Kb&lt;br /&gt;qca2.dll&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 749 Kb&lt;br /&gt;libeay32.dll &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1 Mb&lt;br /&gt;ssleay32.dll&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200 Kb&lt;br /&gt;&lt;br /&gt;Получается довесок в пару мегабайт за возможность шифровать/дешифровать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-1747852541078116844?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/1747852541078116844/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qt-4.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1747852541078116844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1747852541078116844'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qt-4.html' title='Криптография под Qt выпуск 4'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-4553756756303609936</id><published>2010-02-16T09:47:00.000+05:00</published><updated>2010-02-16T09:47:29.563+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Криптография'/><title type='text'>Криптография под Qt выпуск 3</title><content type='html'>Криптография с симметричным ключом вполне заработала. Ширфемся по алгоритму AES.&lt;br /&gt;&lt;br /&gt;Чтобы расшифроваться нужно у чипера&amp;nbsp; поменять &lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;QCA::Encode на &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;QCA::Decode.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;QString encrypt(&lt;span style="color: blue;"&gt;const&lt;/span&gt; QString &amp;amp; strToEnrypt)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//инициализация&lt;/span&gt;&lt;br /&gt;&amp;nbsp; QCA::Initializer init;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//переводим строку в засекречивамый массив&lt;/span&gt;&lt;br /&gt;&amp;nbsp; QCA::SecureArray arg = QVariant(strToEnrypt).toByteArray();&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; QString res;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;// проверка что поддерживаем алгоритм AES128 testing&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (QCA::isSupported(&lt;span style="color: #a31515;"&gt;"aes128-cbc-pkcs7"&lt;/span&gt;))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QString sKey = &lt;span style="color: #a31515;"&gt;"aes128-cbc-pkcs7-sn93-sh21-jks-12"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//некоторые преобразования над ключом&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//по идее должны затруднять реверсинг&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QStringList lst = sKey.split(&lt;span style="color: #a31515;"&gt;"-"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst = lst.replaceInStrings(&lt;span style="color: #a31515;"&gt;"c"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"s"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst.removeAt(0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst.removeAt(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QString sKeyCh = lst.join(&lt;span style="color: #a31515;"&gt;"."&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//создаем ключ&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QCA::SymmetricKey key(QVariant(lst.join(&lt;span style="color: #a31515;"&gt;"."&lt;/span&gt;)).toByteArray());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Создать случайный инициализирующий вектор&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//вам нужно это значение чтобы расшифровать результат шифра&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//но это нужно хранить в секрете в отличие от ключа&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QCA::InitializationVector iv(QVariant(lst.join(&lt;span style="color: #a31515;"&gt;"&amp;gt;"&lt;/span&gt;)).toByteArray());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//содать 128 битный AES шифр объект используя CBC режим&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QCA::Cipher cipher(QString(&lt;span style="color: #a31515;"&gt;"aes128"&lt;/span&gt;), QCA::Cipher::CBC,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//использовать отступ по умолчанию который эквивалентен PKCS7 для CBC&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QCA::Cipher::DefaultPadding,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// этот объект будет зашифрован&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QCA::Encode,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; key, iv);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QCA::SecureArray u = cipher.update(arg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (!cipher.ok()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; res;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QCA::SecureArray f = cipher.final();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (!cipher.ok()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; res;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;res = QString(f.data());&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; res;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;В следующем выпуске рассмотрим какие библиотеки нужны для переноса OpenSSL на чистую машину.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-4553756756303609936?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/4553756756303609936/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qt-3.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4553756756303609936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4553756756303609936'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qt-3.html' title='Криптография под Qt выпуск 3'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8771307134935097952</id><published>2010-02-15T16:40:00.008+05:00</published><updated>2010-02-15T17:55:22.066+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Криптография'/><title type='text'>Криптография под Qt выпуск 2</title><content type='html'>Как оказалось, чтобы собрать нормальную дебаг версию надо было указать ключ --debug-and-release для configure.exe.&lt;br /&gt;Но это еще не все.&lt;br /&gt;По умолчанию QCA поддерживает только алгоритмы SHA1 и MD5. Чтобы получить остальное нужно ставить дополнительный плагин &lt;a href="http://delta.affinix.com/download/qca/2.0/plugins/qca-ossl-2.0.0-beta3.tar.bz2"&gt;qca-ossl-2.0.0-beta3.tar.bz2&lt;/a&gt;.&lt;br /&gt;Установка его дает нам такой комбайн поддерживаемых алгоритмов: TLS, CMS, X.509, RSA, DSA, Diffie-Hellman, PKCS#7, PKCS#12, SHA0, SHA1, SHA224, SHA256, SHA384, SHA512, MD2, MD4, MD5, RIPEMD160, Blowfish, DES, 3DES, AES128, AES192, AES256, CAST5, HMAC(SHA1, MD5, RIPEMD160), PBKDF1(MD2, SHA1), PBKDF2(SHA1).&lt;br /&gt;Этот плагин в свою очередь зависит от OpenSSL версии не ниже 0.9.6&lt;br /&gt;Взять его можно здесь &lt;a href="http://www.openssl.org/source/openssl-0.9.8l.tar.gz"&gt;openssl-0.9.8l&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;OpenSSL&lt;/b&gt;&amp;nbsp;— &lt;a href="http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F" title="Криптография"&gt;криптографический&lt;/a&gt; пакет &lt;a href="http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5" title="Открытое программное обеспечение"&gt;с открытым исходным кодом&lt;/a&gt; для работы с &lt;a href="http://ru.wikipedia.org/wiki/SSL" title="SSL"&gt;SSL&lt;/a&gt;/&lt;a href="http://ru.wikipedia.org/wiki/TLS" title="TLS"&gt;TLS&lt;/a&gt;. Позволяет создавать ключи &lt;a href="http://ru.wikipedia.org/wiki/RSA" title="RSA"&gt;RSA&lt;/a&gt;, DH, &lt;a href="http://ru.wikipedia.org/wiki/DSA" title="DSA"&gt;DSA&lt;/a&gt; и &lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82_%28%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F%29" title="Сертификат (криптография)"&gt;сертификаты&lt;/a&gt; &lt;a href="http://ru.wikipedia.org/wiki/X.509" title="X.509"&gt;X.509&lt;/a&gt;, подписывать их, формировать &lt;a class="new" href="http://ru.wikipedia.org/w/index.php?title=CSR&amp;amp;action=edit&amp;amp;redlink=1" title="CSR (страница отсутствует)"&gt;CSR&lt;/a&gt; и CRT. Также имеется возможность шифрования данных и тестирования &lt;a href="http://ru.wikipedia.org/wiki/SSL" title="SSL"&gt;SSL&lt;/a&gt;/&lt;a href="http://ru.wikipedia.org/wiki/TLS" title="TLS"&gt;TLS&lt;/a&gt; соединений. &lt;br /&gt;OpenSSL поддерживает разные алгоритмы &lt;a href="http://ru.wikipedia.org/wiki/%D0%A8%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" title="Шифрование"&gt;шифрования&lt;/a&gt; и &lt;a href="http://ru.wikipedia.org/wiki/%D0%A5%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" title="Хеширование"&gt;хеширования&lt;/a&gt;:&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;Симметричные&lt;/dt&gt;&lt;dd&gt;&lt;a href="http://ru.wikipedia.org/wiki/Blowfish" title="Blowfish"&gt;Blowfish&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/Camellia" title="Camellia"&gt;Camellia&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/DES" title="DES"&gt;DES&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/RC2" title="RC2"&gt;RC2&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/RC4" title="RC4"&gt;RC4&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/RC5" title="RC5"&gt;RC5&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/IDEA" title="IDEA"&gt;IDEA&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/Advanced_Encryption_Standard" title="Advanced Encryption Standard"&gt;AES&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/%D0%93%D0%9E%D0%A1%D0%A2_28147-89" title="ГОСТ 28147-89"&gt;ГОСТ 28147-89&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;Хеш-функции&lt;/dt&gt;&lt;dd&gt;&lt;a href="http://ru.wikipedia.org/wiki/MD5" title="MD5"&gt;MD5&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/MD2" title="MD2"&gt;MD2&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/SHA" title="SHA"&gt;SHA&lt;/a&gt;, &lt;a class="new" href="http://ru.wikipedia.org/w/index.php?title=MDC-2&amp;amp;action=edit&amp;amp;redlink=1" title="MDC-2 (страница отсутствует)"&gt;MDC-2&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/%D0%93%D0%9E%D0%A1%D0%A2_%D0%A0_34.11-94" title="ГОСТ Р 34.11-94"&gt;ГОСТ Р 34.11-94&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;Асимметричные&lt;/dt&gt;&lt;dd&gt;&lt;a href="http://ru.wikipedia.org/wiki/RSA" title="RSA"&gt;RSA&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/DSA" title="DSA"&gt;DSA&lt;/a&gt;, &lt;a class="new" href="http://ru.wikipedia.org/w/index.php?title=Diffie-Hellman_key_exchange&amp;amp;action=edit&amp;amp;redlink=1" title="Diffie-Hellman key exchange (страница отсутствует)"&gt;Diffie-Hellman key exchange&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/%D0%93%D0%9E%D0%A1%D0%A2_%D0%A0_34.10-2001" title="ГОСТ Р 34.10-2001"&gt;ГОСТ Р 34.10-2001&lt;/a&gt;, &lt;a class="mw-redirect" href="http://ru.wikipedia.org/wiki/%D0%93%D0%9E%D0%A1%D0%A2_%D0%A0_34.10-94#oldGost" title="ГОСТ Р 34.10-94"&gt;ГОСТ Р 34.10-94&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;Поддержка алгоритмов ГОСТ появилась в версии 1.0.0, в данный момент находящейся в стадии &lt;a href="http://ru.wikipedia.org/wiki/%D0%91%D0%B5%D1%82%D0%B0-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" title="Бета-тестирование"&gt;бета-тестирования&lt;/a&gt;.&lt;/blockquote&gt;Чтобы собрать OpenSSL нужен Perl. Пришлось поставить Strawberry Perl.&lt;br /&gt;&lt;br /&gt;После чего конфигуряется командой&lt;br /&gt;&lt;b&gt;&amp;gt; perl Configure VC-WIN32 --prefix=c:/some/openssl/dir &lt;/b&gt;&lt;br /&gt;Затем&lt;br /&gt;&lt;b&gt;&amp;gt; ms\do_ms&lt;/b&gt;&lt;br /&gt;И&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;gt; nmake -f ms\ntdll.mak&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;gt; nmake -f ms\ntdll.mak install&lt;/b&gt;&lt;br /&gt;После установки OpenSSL нужно сплясать еще один танец с бубном. Это касатся уже установки плагина &lt;a href="http://delta.affinix.com/download/qca/2.0/plugins/qca-ossl-2.0.0-beta3.tar.bz2"&gt;qca-ossl&lt;/a&gt;.&lt;br /&gt;В Папке %QTDIR% \mkspecs\features нужно создать файл winlocal.prf со строчкой WINLOCAL_PREFIX = D:/OpenSSL&lt;br /&gt;То есть, указать путь до собранной OpenSSL.&lt;br /&gt;&lt;br /&gt;В ходе сборки плагина у меня выскакивала ошибка, что де не найден OBJ_whirlpool. Эта переменная определена в OpenSSL, и управляет включением алгоритма &lt;b&gt;Whirlpool&lt;/b&gt;&amp;nbsp;— &lt;a class="mw-redirect" href="http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D1%85%D0%B5%D1%88-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8" title="Криптографические хеш-функции"&gt;криптографическая хеш-функция&lt;/a&gt;.&lt;br /&gt;Однако плагин в упор не видит исходного кода алгоритма и вылетает. Пришлось в коде плагина убрать упоминания о Whirlpool.&lt;br /&gt;В итоге плагин qca-ossl2.dll все таки собрался.&lt;br /&gt;Копируем его в %QTDIR%\plugins\crypto.&lt;br /&gt;Завтра будем пробовать. По крайней мере if(QCA::isSupported("aes128-cbc-pkcs7")) стало возвращать true.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8771307134935097952?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8771307134935097952/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qt-2.html#comment-form' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8771307134935097952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8771307134935097952'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qt-2.html' title='Криптография под Qt выпуск 2'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6498041738256693878</id><published>2010-02-15T11:10:00.000+05:00</published><updated>2010-02-15T11:10:48.785+05:00</updated><title type='text'>Конвертация QString в LPTSTR</title><content type='html'>LPTSTR это 32-битный указатель на Unicode строку.&lt;br /&gt;Возвращать указатель из функции не совсем корректно и, например, у нас на фирме запрещено писать функции, возвращающие указатели. Т.к. программист в такой функции выделяет память и возвращает указатель на нее. А об удалении должен заботиться прикладной программист, а он может легко это забыть и получим утечку ресурсов.&lt;br /&gt;Поэтому я приведу кусок кода, конвертирующий QString в LPTSTR без этих тонкостей. Кому надо напишут нужную функцию.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;&amp;nbsp; QString str = &lt;span style="color: #a31515;"&gt;"String"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; WCHAR * wStr = &lt;span style="color: blue;"&gt;new&lt;/span&gt; WCHAR[str.length() + 1];&lt;br /&gt;&amp;nbsp; MultiByteToWideChar( 0, 0, str.toAscii().data(), str.length(), wStr, str.length());&lt;br /&gt;&amp;nbsp; wStr[str.length()] = &lt;span style="color: #a31515;"&gt;'\0'&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; LPTSTR lpszStr = wStr;&lt;br /&gt;&amp;nbsp; delete [] wStr;&lt;br /&gt;&amp;nbsp; wStr = 0;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6498041738256693878?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6498041738256693878/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qstring-lptstr.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6498041738256693878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6498041738256693878'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qstring-lptstr.html' title='Конвертация QString в LPTSTR'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7758882491052211002</id><published>2010-02-12T16:59:00.004+05:00</published><updated>2010-02-15T16:40:27.985+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Криптография'/><title type='text'>Криптография под Qt выпуск 1</title><content type='html'>В стандартной поставке Qt совсем немного средств для криптографии. По сути все ограничивается одним классом &lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Arial; font-size: 17px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Arial; font-size: 17px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;QCryptographicHash.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Этот класс может получать хэш от некоторых данных, представленных в QByteArray, используя алгоритмы &lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Arial; font-size: 17px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;Md4, Md5, Sha.&lt;/span&gt; &lt;br /&gt;Ну а что такое хэш? Хэш это необратимая последовательность символов, зная которую исходные данные никак не получить. Это удобно для хранения паролей. Хранишь хэш пароля и сравниваешь хэши паролей вместо них самих.&lt;br /&gt;Однако в ряде случаев этого бывает недостаточно. И хочется иметь нормальное обратимое шифрование с ключами.&lt;br /&gt;&lt;br /&gt;Порыскал в инете на эту тему, нашел пакет Qt Cryptographic Architecture (QCA).&lt;br /&gt;Обитает он на:&lt;br /&gt;http://delta.affinix.com/qca/&lt;br /&gt;Скачиваем, разворачиваем в %QTDIR%/src/3rdparty/&lt;br /&gt;Далее, configure.exe &amp;amp; nmake &amp;amp; installwin.exe&lt;br /&gt;В результате оно установит Qt feature, т.е. фишку Qt.&lt;br /&gt;Теперь в файле проекта можно написать CONFIG += crypto&lt;br /&gt;И использовать в коде #include &amp;lt;QtCrypto&amp;gt;&lt;qtcrypto&gt;&lt;qtcrypto&gt;&lt;/qtcrypto&gt;&lt;/qtcrypto&gt;&lt;br /&gt;&lt;br /&gt;На этом пока мое знакомство с QCA закончилось. В дебаге оно почему то не может найти либу qcad.lib, в релизе собирается нормально. Будем разбираться дальше.&lt;br /&gt;&lt;br /&gt;Upd:&lt;br /&gt;Для дебага пришлось поправить строку в %QTDIR%/mkspecs/features/crypto.prf&lt;br /&gt;Вместо&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; windows:LINKAGE = -lqcad&lt;br /&gt;написал &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; windows:LINKAGE = -lqca2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7758882491052211002?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7758882491052211002/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qt.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7758882491052211002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7758882491052211002'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/qt.html' title='Криптография под Qt выпуск 1'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-3105694870241837250</id><published>2010-02-12T15:55:00.008+05:00</published><updated>2010-02-12T16:25:08.686+05:00</updated><title type='text'>Поднимаем привилегии до админа под Windows XP</title><content type='html'>Понадобилось мне как-то сделать так, чтобы моя программа, будучи запущенной под ограниченным пользователем,&amp;nbsp; могла сама себе поднимать привилегии до администраторских.&lt;br /&gt;&lt;br /&gt;Исходные условия: Windows XP, известные логин и пароль админа.&lt;br /&gt;Цель: Научить программу поднимать себе привилегии.&lt;br /&gt;&lt;br /&gt;Все оказалось достаточно просто:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;#include &lt;span style="color: #a31515;"&gt;"windows.h"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//Поднять права до админских&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt; logonAsAdmin()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; LPTSTR lpszUsername = L&lt;span style="color: #a31515;"&gt;"Admin"&lt;/span&gt;; &lt;span style="color: green;"&gt;// логин админа&lt;/span&gt;&lt;br /&gt;&amp;nbsp; LPTSTR lpszDomain = NULL;&amp;nbsp; &lt;span style="color: green;"&gt;// домен&lt;/span&gt;&lt;br /&gt;&amp;nbsp; LPTSTR lpszPassword = L&lt;span style="color: #a31515;"&gt;"passw"&lt;/span&gt;; &lt;span style="color: green;"&gt;// пароль админа&lt;/span&gt;&lt;br /&gt;&amp;nbsp; HANDLE&amp;nbsp;hToken;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//маркер доступа (токен) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Получаем токен админа&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!LogonUser(lpszUsername, lpszDomain, lpszPassword, LOGON32_LOGON_INTERACTIVE,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGON32_PROVIDER_DEFAULT, &amp;amp;hToken))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: green;"&gt;//Прикидываемся админом&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!ImpersonateLoggedOnUser(hToken))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;Но тут надо помнить о дыре, которую дает данный код. Дело в том, что в программе может быть код, дающий пользователю доступ к файловой системе с правами админа. Например, если в вашей программе есть диалог открытия файла и вы дали своей программе админский доступ, то такой доступ получит и пользователь программы.&lt;br /&gt;Поэтому, перед тем как вызвать диалог открытия/сохранения файла - верните программе юзерский уровень и поднимите его обратно после работы с диалогом. &lt;br /&gt;Или давайте админский уровень своей программе только на очень короткий срок и немедленно возвращайте его обратно, как только надобность в нем отпадет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-3105694870241837250?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/3105694870241837250/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/windows-xp.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3105694870241837250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3105694870241837250'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/windows-xp.html' title='Поднимаем привилегии до админа под Windows XP'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-5735879012192240967</id><published>2010-02-08T15:23:00.001+05:00</published><updated>2010-02-08T15:24:09.139+05:00</updated><title type='text'>Кролик московский обыкновенный</title><content type='html'>Вот такой московский кролик обитает на служебной квартире в Москве.&lt;br /&gt;Кличка Пуша. Пуша самочка. Роет по ночам нору в своей клетке.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/S2_mCEExpOI/AAAAAAAAAIw/PT70-GiPpb8/s1600-h/ZE20.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/S2_mCEExpOI/AAAAAAAAAIw/PT70-GiPpb8/s400/ZE20.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&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;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Справа - мои ноги.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-5735879012192240967?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/5735879012192240967/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/blog-post_08.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5735879012192240967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5735879012192240967'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/blog-post_08.html' title='Кролик московский обыкновенный'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZsKM8U6wXHU/S2_mCEExpOI/AAAAAAAAAIw/PT70-GiPpb8/s72-c/ZE20.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6932495014167060001</id><published>2010-02-07T18:24:00.000+05:00</published><updated>2010-02-07T18:24:30.691+05:00</updated><title type='text'>Вход в яхту снизу</title><content type='html'>Посмотрел намедни замечательный американский фильм Дрейф. Много забавных моментов.&lt;br /&gt;Сюжет достаточно&amp;nbsp;примитивен - группа юных&amp;nbsp;американцев каталась на яхте в открытом океане. Приспичило им искупаться - попрыгали за борт, забыв опустить трап. Обратно подняться не могут - борта высокие. Вот они плавают возле яхты и не знают чо делать.&lt;br /&gt;Немножко поистерили, немножко в обморок попадали, полчаса прыгали, пытались зацепиться за борт, тратя драгоценные ресурсы организма.&amp;nbsp;Спустя полчаса экранного времени им пришло в голову, то что мне пришло в голову сразу - связать свои плавки и сделать из них веревку. Причем у них плавки - это типа шорты - на веревку хватит точно. У одного чувака даже оказался НОЖ! Нормально да, отправляясь купаться прихватил с собой нож. Ну в общем они связали свои шортики, кое как зацепили их за борт и самый толстый американет полез по ним и веревка, естественно, оборвалась. То что рядом плавают девушки, которые гораздо легче накачанных парней никого не смутило. Кстати, сразу же после первой неудачи они приуныли и даже больше не стали пытаться перевязать веревку и попробовать еще раз.&lt;br /&gt;Им пришла в голову более гениальная мысль - поискать вход в яхту снизу! Услышав это я чуть не разбудил хохотом весь дом.&lt;br /&gt;Входа снизу как ни странно не оказалось, зато один герой, плавая под яхтой приложился головой об винт и потонул.&lt;br /&gt;Дальше я смотреть не смог...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6932495014167060001?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6932495014167060001/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/blog-post_07.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6932495014167060001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6932495014167060001'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/blog-post_07.html' title='Вход в яхту снизу'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7122102304525087689</id><published>2010-02-01T23:28:00.001+05:00</published><updated>2010-02-20T01:11:09.054+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Покер'/><title type='text'>Амстердам и  покер</title><content type='html'>&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&lt;span style="color: blue;"&gt;#define&lt;/span&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;/span&gt;&lt;br /&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey; font-size: xx-small;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;По прибытию из Амстердама состоялась встреча в&amp;nbsp;покерном клубе. Состав прежний, обкатали фишки номиналом на $25. Поначалу участникам казалось, что фишки на 25 не нужны вообще. Затем их стали использовать для накопления капитала, т.е. выигравший игрок менял свои пятаки на 25 и расчитывал больше&amp;nbsp;никогда их не тратить. Под конец игры&amp;nbsp;25-ки стали активно участвовать в ставках и получили окончательную прописку за покерным столом.&lt;br /&gt;&lt;br /&gt;Что можно сказать по прошедшей игре. По накалу и динамизму она пожалуй превосходит все прочие встречи покерного клуба.&lt;br /&gt;Обычный чип-лидер Волос неожиданно скатывается до нуля и выходит из игры. Опытный Санчез цепляется из последних сил за остатки своего стека. Зяма, он же Ззукаринка, элементарно обчищает всех! Ему везет, у него внушительная стопка зеленых 25-ок. Единственным конкурентом его являюсь я. Я еще могу померяться с ним своим столбиком фишек. Время 20-00, 2 часа игры позади. Волос давно уже переквалифицировался в крупье и занят только раздачей карт. Санчез меняет на фишки последний полтинник. И тут происходит перелом в игре. Санчез срывает банк несколько раз подряд. Фишки чип-лидеров тают. Волос видя такой поворот событий бросает колоду и меняет свой полтос на фишки. И ему тоже везет. Фишки перетекают к прежним аутсайдерам. Мы с Ззукарникой в ахуе.&lt;br /&gt;Я лихорадочно пытаюсь сменить стиль игры, но безуспешно. Еще через полтора часа все встает на свои места. Практически все вышли из игры с тем с чем вошел.&lt;br /&gt;Мой плюс это $3. Т.е. практически ничего.&lt;br /&gt;Немного самоанализа. Я много пасовал в этот раз, ждал выгодной комбинации. Как и следовало ожидать, выгодная комбинация не приходила. Пару раз я срывал значительный банк, остальное время пасовал. по ходу игры у меня был стек в $300, но я его пофукал под конец игры.&lt;br /&gt;Чтож, покер игра джентельменов, игра была джентельменской.&lt;br /&gt;Всем спасибо, до встречи за покерным столом.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7122102304525087689?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7122102304525087689/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/02/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7122102304525087689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7122102304525087689'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/02/blog-post.html' title='Амстердам и  покер'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-5490401498040111013</id><published>2010-01-27T15:50:00.006+05:00</published><updated>2010-01-27T15:55:54.792+05:00</updated><title type='text'>Продолжаем удалять файлы и каталоги</title><content type='html'>Функция рекурсивного удаления папок не работает если в папке есть файлы только для чтения.&lt;br /&gt;Функция QFile::remove() при попытке удалить такой файл возвращает false. Чтобы этого избежать нужно выставлять права для таких файлов. В Qt для этого есть функция&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 16px; font-weight: bold;"&gt;bool QFile::setPermissions ( const&amp;nbsp;&lt;a href="http://www.blogger.com/qstring.html" style="color: #004faf; text-decoration: none;"&gt;QString&lt;/a&gt;&amp;nbsp;&amp;amp;&amp;nbsp;&lt;i&gt;fileName&lt;/i&gt;,&amp;nbsp;&lt;a href="http://www.blogger.com/qfile.html#Permission-enum" style="color: #004faf; text-decoration: none;"&gt;Permissions&lt;/a&gt;&amp;nbsp;&lt;i&gt;permissions&lt;/i&gt;&amp;nbsp;)&amp;nbsp;&amp;nbsp;&lt;tt&gt;&amp;nbsp;[static]&lt;/tt&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 16px; font-weight: bold;"&gt;&lt;tt&gt;&lt;span style="font-size: medium; font-weight: normal;"&gt;Таким образом окончательный вид функции удаления каталога имеет вид:&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;b&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&lt;span style="color: green;"&gt;&lt;span style="font-weight: normal;"&gt;//Функция удаления папки&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="color: blue;"&gt;&lt;span style="font-weight: normal;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; removeFolder(QDir &amp;amp; dir)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;&lt;span style="font-weight: normal;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; res = 0;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;&lt;span style="font-weight: normal;"&gt;//Получаем список каталогов&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&amp;nbsp; QStringList lstDirs&amp;nbsp;= dir.entryList(QDir::Dirs&amp;nbsp;|&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QDir::AllDirs |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QDir::NoDotAndDotDot);&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;&lt;span style="font-weight: normal;"&gt;//Получаем список файлов&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&amp;nbsp; QStringList lstFiles = dir.entryList(QDir::Files);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt; &lt;span style="color: green;"&gt;&lt;span style="font-weight: normal;"&gt;//Удаляем файлы&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-weight: normal;"&gt;foreach&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; (QString entry, lstFiles)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QString entryAbsPath = dir.absolutePath() + &lt;/span&gt;&lt;span style="color: #a31515;"&gt;&lt;span style="font-weight: normal;"&gt;"/"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; + entry;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QFile::setPermissions(entryAbsPath, QFile::ReadOwner | QFile::WriteOwner);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QFile::remove(entryAbsPath);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt; &lt;span style="color: green;"&gt;&lt;span style="font-weight: normal;"&gt;//Для папок делаем рекурсивный вызов&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-weight: normal;"&gt;foreach&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; (QString entry, lstDirs)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QString entryAbsPath = dir.absolutePath() + &lt;/span&gt;&lt;span style="color: #a31515;"&gt;&lt;span style="font-weight: normal;"&gt;"/"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; + entry;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QDir dr(entryAbsPath);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;removeFolder(dr);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt; &lt;span style="color: green;"&gt;&lt;span style="font-weight: normal;"&gt;//Удаляем обрабатываемую папку&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-weight: normal;"&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; (!QDir().rmdir(dir.absolutePath()))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;res = 1;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;/span&gt; &lt;span style="color: blue;"&gt;&lt;span style="font-weight: normal;"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; res;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: grey;"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style="color: grey;"&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-5490401498040111013?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/5490401498040111013/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_27.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5490401498040111013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5490401498040111013'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_27.html' title='Продолжаем удалять файлы и каталоги'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-3024881432058334744</id><published>2010-01-23T20:23:00.000+05:00</published><updated>2010-01-23T20:23:25.531+05:00</updated><title type='text'>Фишки для покера</title><content type='html'>Отоварился в Москве фишками для покера. 25 штук номиналом в 25. Фишки зеленые с номиналом и с изображением флеш-рояла. Вышло не очень дешево - 16 рублей за штуку в ТЦ Новые Черемушки. На вес тяжелые, грамм 14 весят точно.&lt;br /&gt;Так что покер клуб растет и ширится.&lt;br /&gt;&lt;br /&gt;Вот точно так и выглядят фишки:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/S1sUH_ChOpI/AAAAAAAAAIo/SPF5xIu6WUg/s1600-h/8221_standart_.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/S1sUH_ChOpI/AAAAAAAAAIo/SPF5xIu6WUg/s320/8221_standart_.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-3024881432058334744?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/3024881432058334744/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_23.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3024881432058334744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3024881432058334744'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_23.html' title='Фишки для покера'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZsKM8U6wXHU/S1sUH_ChOpI/AAAAAAAAAIo/SPF5xIu6WUg/s72-c/8221_standart_.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-2009698997767013332</id><published>2010-01-21T20:53:00.003+05:00</published><updated>2010-01-21T20:54:13.593+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Очистка каталога</title><content type='html'>&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt; cleanFolder(&lt;font color="#0000ff"&gt;const&lt;/font&gt; QString &amp;#38; folder)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; QDir dir(folder);&lt;br /&gt;&amp;nbsp; &lt;font color="#008000"&gt;//Получаем список файлов&amp;nbsp; &lt;/font&gt;&lt;br /&gt;&amp;nbsp; QStringList lstFiles = dir.entryList(QDir::Files);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;font color="#008000"&gt;//Удаляем файлы&lt;/font&gt;&lt;br /&gt;&amp;nbsp; &lt;font color="#0000ff"&gt;foreach&lt;/font&gt; (QString entry, lstFiles)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QString entryAbsPath = dir.absolutePath() + &lt;font color="#A31515"&gt;"/"&lt;/font&gt; + entry;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QFile::remove(entryAbsPath);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-2009698997767013332?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/2009698997767013332/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_21.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/2009698997767013332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/2009698997767013332'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_21.html' title='Очистка каталога'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7636640636457623429</id><published>2010-01-19T23:10:00.001+05:00</published><updated>2010-01-19T23:11:12.395+05:00</updated><title type='text'>Подсветка кода для блога</title><content type='html'>Изначально я планировал в этом блоге писать о программировании на Qt. Однако сейчас на блоге больше всего постов о покере, Москве, пиве и прочем непотребстве.&lt;br /&gt;Объясняю в чем секрет - отсутствие толковой подсветки кода. Те куски кода, что я помещал в блог имели столь ужасное форматирование и подсветку, что без содрогания читать программу просто невозможно. Я перепробовал множество подсветчиков, однако у всех были недостатки - кто-то по &amp;nbsp;глупому делает подсветку, кто-то мутит с CSS, что вызывает трудности со вставкой кода.&lt;br /&gt;&lt;br /&gt;Наконец я нашел приличный подсветчик:&amp;nbsp;&lt;a href="http://source.virtser.net/"&gt;http://source.virtser.net&lt;/a&gt;&lt;br /&gt;Он не использует CSS и делает подсветку аналогично Visual Studio.&lt;br /&gt;&lt;br /&gt;Вот пример сгенеренного им кода.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Courier New" color="black"&gt;ApPhotoRobot::ApPhotoRobot(QWidget * parent )&lt;br /&gt;: DirSelecter(tr(&lt;font color="#A31515"&gt;"Applications - PhotoRobot"&lt;/font&gt;), parent)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; lstlblPath.at(0)-&amp;#62;setText(tr(&lt;font color="#A31515"&gt;"Folder of Bars PhotoRobot"&lt;/font&gt;));&lt;br /&gt;&amp;nbsp; lstlblName.at(0)-&amp;#62;setText(tr(&lt;font color="#A31515"&gt;"Executable name of Bars PhotoRobot"&lt;/font&gt;));&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; leOut = &lt;font color="#0000ff"&gt;new&lt;/font&gt; QLineEdit(&lt;font color="#0000ff"&gt;this&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; QLabel * lblOut = &lt;font color="#0000ff"&gt;new&lt;/font&gt; QLabel(tr(&lt;font color="#A31515"&gt;"Output folder for Bars Photorobot"&lt;/font&gt;), &lt;font color="#0000ff"&gt;this&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; QToolButton * btnBars = &lt;font color="#0000ff"&gt;new&lt;/font&gt; QToolButton(&lt;font color="#0000ff"&gt;this&lt;/font&gt;);&lt;br /&gt;&amp;nbsp; btnBars-&amp;#62;setFixedSize(20, 20);&lt;br /&gt;&amp;nbsp; btnBars-&amp;#62;setText(&lt;font color="#A31515"&gt;"..."&lt;/font&gt;);&lt;br /&gt;&amp;nbsp; connect(btnBars, SIGNAL(clicked()), &lt;font color="#0000ff"&gt;this&lt;/font&gt;, SLOT(browseDir()));&lt;br /&gt;&lt;br /&gt;&amp;nbsp; mapBtnEdt[btnBars] = leOut;&lt;br /&gt;&amp;nbsp; grid-&amp;#62;addItem(&lt;font color="#0000ff"&gt;new&lt;/font&gt; QSpacerItem(1, 10, QSizePolicy::Fixed, QSizePolicy::Fixed), 5, 0);&amp;nbsp; &lt;br /&gt;&amp;nbsp; grid-&amp;#62;addWidget(lblOut, 6, 0, 1, 2);&lt;br /&gt;&amp;nbsp; grid-&amp;#62;addWidget(leOut, 7, 0);&lt;br /&gt;&amp;nbsp; grid-&amp;#62;addWidget(btnBars, 7, 1);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; grid-&amp;#62;setRowStretch(8, 1);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;font size="1" color="gray"&gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;font size="1" color="gray"&gt;Source Code Highlighter&lt;/font&gt;&lt;/a&gt;.&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;На мой взгляд - лучшее решение для вставки кода в блог.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7636640636457623429?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7636640636457623429/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_19.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7636640636457623429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7636640636457623429'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_19.html' title='Подсветка кода для блога'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6182426103935128624</id><published>2010-01-16T11:39:00.002+05:00</published><updated>2010-01-16T11:42:21.143+05:00</updated><title type='text'>Предмосковский покер</title><content type='html'>Состоялась предмосковская встреча покерного клуба.&lt;br /&gt;Собралсь исключительно тайтовые игроки, слово Чек звучало как никогда часто. Без Волоса не было сильного ажиотажа. Были успешно отработаны некоторые психологические приемы. В итоге вышел из игры с +$125. Зяма стал понимать суть игры и не проигрался в ноль, чему был сильно рад.&lt;br /&gt;Таким образом, по сумме всех встреч у меня положительный баланс +$32. &lt;br /&gt;Отъезжаю в командировку в Москву на две недели, поэтому покерный клуб возьмет перерыв на пару недель. По приезду можно будет собраться.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6182426103935128624?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6182426103935128624/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_16.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6182426103935128624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6182426103935128624'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_16.html' title='Предмосковский покер'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7097259180998093746</id><published>2010-01-15T09:43:00.000+05:00</published><updated>2010-01-15T09:43:18.987+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Покер'/><title type='text'>Покер и абсент</title><content type='html'>Последняя встреча в покер клубе прошла под знаком абсента. Початую литровую бутыль темно-зеленой жидкости предложил гостям хозяин покер-рума.&lt;br /&gt;В комплект также входили:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Отломанная половинка чеснокодавилки&lt;/li&gt;&lt;li&gt;Коробка с коричневым сахаром рафинадом&lt;/li&gt;&lt;li&gt;Толстая свеча из человеческого сала&lt;/li&gt;&lt;li&gt;Графин с водой &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Спички&lt;/li&gt;&lt;li&gt;Рюмки&lt;/li&gt;&lt;/ol&gt;Кусок коричневого сахара клался в чеснокодавилку, сверху лился в рюмку абсент, затем сахар поджигался с помощью свечи. Капли оплавленного сахара падали в рюмку, остатки сахара высыпались туда же и все разбавлялось водой. Вот такой вот технологический процесс, чтобы выпить одну рюмку приходилось затратить минут 5. Посему абсент пился весьма размеренно.&lt;br /&gt;&lt;br /&gt;Пара слов о покере.&lt;br /&gt;Игра удалась. На моем балансе +$7.&lt;br /&gt;Что стоит отметить. Нужно активно играть, меньше пасовать на префлопе. Еще один интересный вывод - игра вживую не имеет ни малейшего сходства с игрой на компе. На компе можно только отточить вероятности появления комбинаций, но в игре по ставкам это небо и земля. На компе можно легко было двинуть ва-банк не имея ничего и все оппоненты бы пасовали. В реале такого не наблюдается - либо жаба давит все двигать, либо найдется тот кто ответит и сыграет с тобой.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7097259180998093746?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7097259180998093746/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_15.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7097259180998093746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7097259180998093746'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2010/01/blog-post_15.html' title='Покер и абсент'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-4532494780616411212</id><published>2009-12-28T21:45:00.001+05:00</published><updated>2009-12-28T22:32:29.895+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Покер'/><title type='text'>Отчет о субботнем покере</title><content type='html'>Субботний покер принес сугубо положительные ощущения. Самый главный плюс - это конечно то, что я в итоге остался в плюсе. Плюс правда незначителен и по сумме трех встреч я по прежнему в минусе.&lt;br /&gt;Статистика игр такова:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Первая встреча: прибыль $0&lt;/li&gt;&lt;li&gt;Вторая встреча: прибыль -$150&lt;/li&gt;&lt;li&gt;Третья встреча: прибыль $50&lt;/li&gt;&lt;li&gt;Итог: -100&lt;/li&gt;&lt;/ol&gt;Хроника последней игры. После первого часа я проигрываю первую сотку, допиваю бутылку французского белого вина и решаю разменять еще полста баксов. Мои соперники играют хладнокровно и не употребляют вообще. Все это происходит на кухне с обшарпанными стенами и тусклой лампочкой под потолком. Жалюзи на окнах опущены. Сгущается тьма. Нервы игроков на пределе, натянуты как струна, чувствуется - малейший повод и в ход пойдут ножи. Так и играем.&lt;br /&gt;Ножи в ход таки пошли - я воспользовался им чтобы отрезать ломтик сыра.&lt;br /&gt;Немного о соперниках. Волос. Играет, по его словам, чисто для удовольствия, совершенно не считает варианты выигрыша, часто блефует и играет вообще агрессивно. Таких называют лузовыми игроками. Понимание его стратегии игры позволило обернуть ее против него самого. Например - типичная для него ошибка - на столе лежит двусторонний стрит дро на терне. Он начинает повышать совершенно не думая о том, что у меня может быть стрит (третий игрок, Санчез, благоразумно вышел из игры загодя)&amp;nbsp;. Так собствено и было - у меня был стрит. Волос продолжает повышать, мне остается только принимать, применяя слоуплей. В итоге когда доходит до шотдауна - на столе стопка фишек, и у Артема старший король. Мне эта стопка позволила выйти из минуса на текущей игре, а Артему стоит задуматься о своей стратегии.&lt;br /&gt;Второй игрок. Санчез, он же Шурик. Создатель деревянных фишек. Урфин Джус и его деревянные фишки.&lt;br /&gt;Опытный игрок, оттачивает свои умения в интернете на различных покер-румах. Очень любит комментировать игру, рассуждать о всяческих вариантах. Является экспертом во всяких тонких вопросах покера. В последней игре остался фаворитом, собрав со стола почти все фишки. Стиль его игры описать трудно, он может быть как тайтовым, так и лузовым игроком. Его слабым местом может быть следование правилам, описанным в интернете, ибо правила эти пишут те, кому нужна рыба. Как я понял, зачастую этими правилами надо пренебречь и воспользоваться принципом - "выигрывают любые две карты".&lt;br /&gt;Вот пример, руки от которой однозначно бы отказался Санчез, а они дают в итоге фулл-хауз.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SzjgolM4OaI/AAAAAAAAAII/IpAcKsxX_6g/s1600-h/full.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SzjgolM4OaI/AAAAAAAAAII/IpAcKsxX_6g/s640/full.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Еще примеры того, что&amp;nbsp; Санчез назовет хреновыми картами, но они приводят к выигрышу не так уж редко.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/Szjq9SMtFCI/AAAAAAAAAIQ/qtf3LsH_lKs/s1600-h/%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/Szjq9SMtFCI/AAAAAAAAAIQ/qtf3LsH_lKs/s320/%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9-1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/Szjrpb7yWQI/AAAAAAAAAIY/IVyzmKbulao/s1600-h/%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/Szjrpb7yWQI/AAAAAAAAAIY/IVyzmKbulao/s320/%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9-2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-4532494780616411212?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/4532494780616411212/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_28.html#comment-form' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4532494780616411212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4532494780616411212'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_28.html' title='Отчет о субботнем покере'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZsKM8U6wXHU/SzjgolM4OaI/AAAAAAAAAII/IpAcKsxX_6g/s72-c/full.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6129332163794715292</id><published>2009-12-20T18:01:00.002+05:00</published><updated>2009-12-20T18:12:53.443+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Покер'/><title type='text'>Неудачный покер</title><content type='html'>Вчерашний субботний покер принес разочарование&amp;nbsp;- я в минусе.&lt;br /&gt;Надо делать выводы, менять стратегию и тактику игры.&lt;br /&gt;Изначально карты приходили неплохие, типа 9 10; 6 7; AQ.&lt;br /&gt;Но почему-то у соперника оказывалось AK. В общем, не мой день.&lt;br /&gt;Поднять банк удавалось только на блефе, но в конечном счете это приводит к проигрышу.&lt;br /&gt;Но стоит отметить, что атакующий стиль - когда ты почти всегда идешь на повышение - приносит неплохие результаты. Интересный ход - это после терна сделать значительное повышение, особенно если на терн пришел туз или картинка. На флопе успели прилично пополнить банк, осталось всех напугать на терне и снять бабки. Пару раз такое прокатывало. Будем искать еще стратегии.&lt;br /&gt;&lt;br /&gt;Кстати, в этот раз прошла обкатака новой колоды из Москвы, специально купленной для этого случая.&lt;br /&gt;&lt;br /&gt;Плотные пластиковые карты, удобно мешать.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/Sy4irxnEG_I/AAAAAAAAAIA/0ASbdvlVOyc/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+009.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/Sy4irxnEG_I/AAAAAAAAAIA/0ASbdvlVOyc/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+009.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6129332163794715292?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6129332163794715292/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_20.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6129332163794715292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6129332163794715292'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_20.html' title='Неудачный покер'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZsKM8U6wXHU/Sy4irxnEG_I/AAAAAAAAAIA/0ASbdvlVOyc/s72-c/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+009.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-5213767968661814139</id><published>2009-12-19T16:04:00.000+05:00</published><updated>2009-12-19T16:04:51.991+05:00</updated><title type='text'>Патриарший мост</title><content type='html'>В последний день командировки выбрался в центр Москвы. Дошел до Храма Христа, зашел внутрь - убранство, конечно, впечатляет.&lt;br /&gt;От храма идет пешеходный Патриарший мостик через Москву-реку. На перилах мостика густо навешаны навесные замки с надписями. Оказывается это местная традиция - новобрачные приезжают на мост и цепляют на перила навесные замки с именами.&lt;br /&gt;Ключ после этого надо полагать вышвыривается в Москва-реку.&lt;br /&gt;Хотя среди замочков попадаются и с кодовым замком. Видимо кто-то оставляет себе шанс вернуться и подобрать кодик.&lt;br /&gt;Есть красивые замочки в виде сердечка, есть побольше. Наших "уралазовских" замков я там не видел.&lt;br /&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/Syyyh4dUBVI/AAAAAAAAAHY/hqw1cNgg9IM/s1600-h/%D0%A4%D0%BE%D1%82%D0%BE046.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/Syyyh4dUBVI/AAAAAAAAAHY/hqw1cNgg9IM/s320/%D0%A4%D0%BE%D1%82%D0%BE046.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyyywJhgTnI/AAAAAAAAAH4/ffxATn0XWp8/s1600-h/%D0%A4%D0%BE%D1%82%D0%BE042.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyyywJhgTnI/AAAAAAAAAH4/ffxATn0XWp8/s320/%D0%A4%D0%BE%D1%82%D0%BE042.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SyyytL_ZukI/AAAAAAAAAHw/xiYYQif2e0A/s1600-h/%D0%A4%D0%BE%D1%82%D0%BE045.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SyyytL_ZukI/AAAAAAAAAHw/xiYYQif2e0A/s320/%D0%A4%D0%BE%D1%82%D0%BE045.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/Syyyq-FtbbI/AAAAAAAAAHo/sUkbSNvlV6Y/s1600-h/%D0%A4%D0%BE%D1%82%D0%BE044.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/Syyyq-FtbbI/AAAAAAAAAHo/sUkbSNvlV6Y/s320/%D0%A4%D0%BE%D1%82%D0%BE044.jpg" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SyyynKfK1xI/AAAAAAAAAHg/Mqq0nTGbWbg/s1600-h/%D0%A4%D0%BE%D1%82%D0%BE040.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SyyynKfK1xI/AAAAAAAAAHg/Mqq0nTGbWbg/s320/%D0%A4%D0%BE%D1%82%D0%BE040.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-5213767968661814139?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/5213767968661814139/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_19.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5213767968661814139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5213767968661814139'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_19.html' title='Патриарший мост'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZsKM8U6wXHU/Syyyh4dUBVI/AAAAAAAAAHY/hqw1cNgg9IM/s72-c/%D0%A4%D0%BE%D1%82%D0%BE046.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-1742916300177102111</id><published>2009-12-16T11:40:00.000+05:00</published><updated>2009-12-16T11:40:54.499+05:00</updated><title type='text'>Злая холодная Москва</title><content type='html'>Злая холодная Москва приветствует провинциалов, - подумал я.&lt;br /&gt;Сюрпризом стало сообщение стюардессы: температура в аэропорту Домодедово -22.&lt;br /&gt;А ведь вылетая я посмотрел прогноз на гисметео - обещали что-то вроде -5 -10.&lt;br /&gt;Позже узнал, что так в общем-то и было - утром в Москве было -5, а вечером -22.&lt;br /&gt;&lt;br /&gt;Я в очередной раз вылетел в командировку на этот раз на пять дней. Два дня уже прошло, работа в принципе вся выполнена и сейчас сижу на хате. Дома тепло и мороза можно не бояться, а за окном зима, зима и -25.&lt;br /&gt;&lt;br /&gt;В такую погоду никуда выползать неохота, хотя надо бы выползти за пачкой чая.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-1742916300177102111?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/1742916300177102111/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_16.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1742916300177102111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1742916300177102111'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_16.html' title='Злая холодная Москва'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-638968394228684222</id><published>2009-12-13T16:23:00.000+05:00</published><updated>2009-12-13T16:23:40.509+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Покер'/><title type='text'>Покерное рубилово</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;Вчера знатно поиграли в покер после долгого полугодовалого перерыва.&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;Перерыв в полгода не пропал зря - были изготовлены самодельные деревянные фишки для покера.&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;Обкатали фишки - в целом очень довольны, лакированные фишки с номиналом радуют глаз. Правда пока изготовлены только номиналом в 1 и 5 доллара :) В планах сделать еще на 25.&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyTGkvxCStI/AAAAAAAAAFY/wCHsDvn1ZDQ/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+001.jpg"&gt;&lt;em&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5414670986605906642" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyTGkvxCStI/AAAAAAAAAFY/wCHsDvn1ZDQ/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+001.jpg" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/em&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;Ключ на старт. Фишки&lt;br /&gt;розданы. Пиво вскрыто. Не распечатана только колода карт.&lt;/em&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; text-align: center;"&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; text-align: center;"&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SyTGky_whqI/AAAAAAAAAFg/z3fqrBnVVOc/s1600/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+004.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5414670987472963234" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SyTGky_whqI/AAAAAAAAAFg/z3fqrBnVVOc/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+004.jpg" style="display: block; margin-top: 0px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; text-align: center;"&gt;&lt;em&gt;Первая раздача. На столе сразу три тройки. Играем в техасский холд-ем.&lt;/em&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;Кстати, розовая свинка на столе стоит не просто так - это фишка дилера.&lt;br /&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SyTJsnP4wBI/AAAAAAAAAFo/ro_j43_7hxY/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+014.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SyTJsnP4wBI/AAAAAAAAAFo/ro_j43_7hxY/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+014.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Похоже мои две дамы бьют две четверки Волоса.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SyTJ_CVfsaI/AAAAAAAAAFw/U7qHXH7vHYk/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+016.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SyTJ_CVfsaI/AAAAAAAAAFw/U7qHXH7vHYk/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+016.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Похоже я неплохо поднялся на первых же порах. За это надо выпить. Темные очки - чтобы соперники не могли читать по глазам. Взяты напрокат у жены.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyTKwTyTI5I/AAAAAAAAAF4/iEx-B4FnkVU/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+015.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyTKwTyTI5I/AAAAAAAAAF4/iEx-B4FnkVU/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+015.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Благосотояние растет.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyTLCCUcd7I/AAAAAAAAAGA/wq1Mb9l2m48/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+020.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyTLCCUcd7I/AAAAAAAAAGA/wq1Mb9l2m48/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+020.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SyTLQfwMXGI/AAAAAAAAAGI/0WVoiJxpcVc/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+038.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SyTLQfwMXGI/AAAAAAAAAGI/0WVoiJxpcVc/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+038.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Волос только что неплохо поднялся. Моя стопка фишек тает на глазах. Во всем виновато пиво (((&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SyTLmJRVKgI/AAAAAAAAAGQ/YhIdUKtKvns/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+041.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SyTLmJRVKgI/AAAAAAAAAGQ/YhIdUKtKvns/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+041.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Ничья.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyTLwaTv9AI/AAAAAAAAAGY/9Dtsa3b80tg/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+044.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyTLwaTv9AI/AAAAAAAAAGY/9Dtsa3b80tg/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+044.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SyTL7L5L2OI/AAAAAAAAAGg/5HcRCjg8LVU/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+047.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SyTL7L5L2OI/AAAAAAAAAGg/5HcRCjg8LVU/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+047.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Очень серьезная заруба. Ставки растут.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SyTMQcGVjWI/AAAAAAAAAGo/0aw6H1e5iiU/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+050.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SyTMQcGVjWI/AAAAAAAAAGo/0aw6H1e5iiU/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+050.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;И вот итог - три пятерки бьют две пары.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SyTMtNlmE6I/AAAAAAAAAGw/mlPsYRmyvrY/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+054.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SyTMtNlmE6I/AAAAAAAAAGw/mlPsYRmyvrY/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+054.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;После игры. Нора фишек у Волоса, я с чем вошел, с тем и вышел, Зяма на нуле, Шурик похоже немного поднялся.&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SyTND_ArsLI/AAAAAAAAAG4/v-pSgfTzPCQ/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+056.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SyTND_ArsLI/AAAAAAAAAG4/v-pSgfTzPCQ/s400/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+056.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Общий ракурс.&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;Собственно портреты игроков.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SyTNXwG0vqI/AAAAAAAAAHA/RqO717s26Ng/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+008.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SyTNXwG0vqI/AAAAAAAAAHA/RqO717s26Ng/s200/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+008.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SyTNhP7TQHI/AAAAAAAAAHI/XkpBXaPh9rw/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+009.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SyTNhP7TQHI/AAAAAAAAAHI/XkpBXaPh9rw/s200/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+009.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SyTOTg9HjpI/AAAAAAAAAHQ/p0HcplrUr-k/s1600-h/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+010.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SyTOTg9HjpI/AAAAAAAAAHQ/p0HcplrUr-k/s200/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+010.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-638968394228684222?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/638968394228684222/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_13.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/638968394228684222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/638968394228684222'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_13.html' title='Покерное рубилово'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZsKM8U6wXHU/SyTGkvxCStI/AAAAAAAAAFY/wCHsDvn1ZDQ/s72-c/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+001.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-9186195156440102555</id><published>2009-12-07T09:35:00.001+05:00</published><updated>2009-12-07T09:36:58.759+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Настоящий программист'/><title type='text'>Настоящий программист</title><content type='html'>Понравилась цитата:&lt;br /&gt;Настоящий программист не использует буфер обмена. (с)&lt;br /&gt;&lt;br /&gt;От себя добавлю - Настоящий программист  использует наследование.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-9186195156440102555?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/9186195156440102555/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_07.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/9186195156440102555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/9186195156440102555'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post_07.html' title='Настоящий программист'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-4764730462037509511</id><published>2009-12-02T08:51:00.001+05:00</published><updated>2009-12-02T08:51:45.765+05:00</updated><title type='text'>Ваш код отстой</title><content type='html'>&lt;a href="http://rsdn.ru/article/philosophy/whyyourcode.xml#EIB"&gt;&lt;b&gt;Ваш код – отстой, если он не работает&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://rsdn.ru/article/philosophy/whyyourcode.xml#ESB"&gt;&lt;b&gt;Ваш код – отстой, если он не поддаётся тестированию&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://rsdn.ru/article/philosophy/whyyourcode.xml#EFC"&gt;&lt;b&gt;Ваш код – отстой, если его трудно прочесть&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://rsdn.ru/article/philosophy/whyyourcode.xml#ERC"&gt;&lt;b&gt;Ваш код – отстой, если он непонятен&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://rsdn.ru/article/philosophy/whyyourcode.xml#EXC"&gt;&lt;b&gt;Ваш код – отстой, если он догматично следует ультрамодным framework ценою соблюдения хороших практик дизайна и имплементации&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://rsdn.ru/article/philosophy/whyyourcode.xml#EDD"&gt;&lt;b&gt;Ваш код – отстой, если в нём есть дублирование&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://rsdn.ru/article/philosophy/whyyourcode.xml#EKD"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-4764730462037509511?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/4764730462037509511/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4764730462037509511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4764730462037509511'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/12/blog-post.html' title='Ваш код отстой'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6847661685275721922</id><published>2009-11-26T17:51:00.004+05:00</published><updated>2009-11-26T18:03:26.163+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='идиотизм'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='маразм'/><title type='text'>Недалекий gcc</title><content type='html'>Сегодня случилось компилировать кусок с рекурсивным удалением каталогов под Linux.&lt;br /&gt;&lt;a href="http://qtcoder.blogspot.com/2009/10/qt.html"&gt;Здесь про рекурсивное удаление&lt;/a&gt;&lt;br /&gt;Компилятор gcc преподнес сюрприз. Не хотел компилировать безобидный кусок кода:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(255, 102, 51);"&gt;int&lt;/span&gt; removeFolder&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;(&lt;/span&gt;&lt;/b&gt;QDir&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt; &amp;amp;&lt;/span&gt;&lt;/b&gt; dir&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;)&lt;br /&gt;{&lt;br /&gt;......&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;   QString entryAbsPath&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt; =&lt;/span&gt;&lt;/b&gt; dir&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;.&lt;/span&gt;&lt;/b&gt;absolutePath&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;() +&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; "/"&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt; +&lt;/span&gt;&lt;/b&gt; entry&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  removeFolder&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;(&lt;/span&gt;&lt;/b&gt;QDir&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;(&lt;/span&gt;&lt;/b&gt;entryAbsPath&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;));&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;......&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;}&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;То есть здесь идет рекурсивный вызов функции removeFolder(QDir &amp;amp;). В качестве параметра я передаю временный объект QDir, предполагая, что компилятор сможет получить ссылку на временный объект. Это не вызывает трудностей у MS Studio 2005, но повергает в шок gcc.&lt;br /&gt;Пришлось за него самому создавать объект. В итоге код пришлось переписать в :&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(255, 102, 51);"&gt;int&lt;/span&gt; removeFolder&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;(&lt;/span&gt;&lt;/b&gt;QDir&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt; &amp;amp;&lt;/span&gt;&lt;/b&gt; dir&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;)&lt;br /&gt;{&lt;br /&gt;......&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;   QString entryAbsPath&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt; =&lt;/span&gt;&lt;/b&gt; dir&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;.&lt;/span&gt;&lt;/b&gt;absolutePath&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;() +&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; "/"&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt; +&lt;/span&gt;&lt;/b&gt; entry&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  QDir dr&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;(&lt;/span&gt;&lt;/b&gt;entryAbsPath&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;)&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;  removeFolder&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;(dr&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;);&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;......&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;}&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6847661685275721922?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6847661685275721922/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/11/gcc.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6847661685275721922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6847661685275721922'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/11/gcc.html' title='Недалекий gcc'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8063784286731062046</id><published>2009-11-24T15:39:00.001+05:00</published><updated>2009-11-24T15:40:55.919+05:00</updated><title type='text'>Я дома</title><content type='html'>Снег в Москве успел растаять, несколько раз выпасть, опять растаять. Я съездил в Санкт-Петербург  к старому другу и наконец-то, самое главное, вернулся домой.&lt;br /&gt;Кстати, у моего друга были усы, и после моих слов он их расправил.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8063784286731062046?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8063784286731062046/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post_24.html#comment-form' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8063784286731062046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8063784286731062046'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post_24.html' title='Я дома'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-1285976882072264705</id><published>2009-11-06T23:34:00.003+05:00</published><updated>2009-11-07T01:06:15.118+05:00</updated><title type='text'>Москва, снег</title><content type='html'>В Москве выпал снег по колено.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-1285976882072264705?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/1285976882072264705/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post_2608.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1285976882072264705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1285976882072264705'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post_2608.html' title='Москва, снег'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-5532725823264425655</id><published>2009-11-06T10:46:00.002+05:00</published><updated>2009-11-06T10:53:56.579+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Свиной грипп'/><category scheme='http://www.blogger.com/atom/ns#' term='Москва'/><title type='text'>Москва, свиной грипп</title><content type='html'>Как известно человечество находится на грани исчезновения. Грипп угрожает схавать человечество в одно рыло. Самые страшные фантазии писателей-фантастов начинают воплощаться. Пророк Стивен Кинг в своем романе Противостояние описал постапокалиптический мир, появившийся в результате свиного гриппа. Грядет армагеддец, друзья мои.&lt;br /&gt;Примерно такую истерику можно услышать в СМИ.&lt;br /&gt;Несознательные москвичи тем не менее не хотят в это верить. Практически никто не носит намордников. Только редких пассажиров метро можно узреть в медицинских масках. Остальные чихать хотели на этот грипп.&lt;br /&gt;Ну посмотрим, что случится дальше. Все новости можно будет прочитать в моем предапокалиптическом дневнике.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-5532725823264425655?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/5532725823264425655/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post_06.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5532725823264425655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5532725823264425655'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post_06.html' title='Москва, свиной грипп'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8540290765257473298</id><published>2009-11-03T15:05:00.002+05:00</published><updated>2009-11-03T15:08:38.139+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Командировка в Москву'/><title type='text'>Улетаю в Москву</title><content type='html'>Улетаю 5-го в командировку в Москву аж на 16 дней.&lt;br /&gt;Фотоотчета скорее всего не будет, т.к. фотик отдал племяннику - они уехали на каникулы в Санкт-Петербург.&lt;br /&gt;Попробую вести блог оттуда.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8540290765257473298?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8540290765257473298/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post_03.html#comment-form' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8540290765257473298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8540290765257473298'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post_03.html' title='Улетаю в Москву'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-4017740809434706296</id><published>2009-11-02T22:49:00.004+05:00</published><updated>2009-11-02T22:51:45.947+05:00</updated><title type='text'>Машгородок до кризиса</title><content type='html'>Когда-то Машгородо был чистым и ухоженным. Сейчас просто свалка. Запустение царит на улицах.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/Su8b9fWilSI/AAAAAAAAAEg/628j9BAxEYQ/s1600-h/1152764918440076.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5399565221442524450" border="0" alt="" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/Su8b9fWilSI/AAAAAAAAAEg/628j9BAxEYQ/s320/1152764918440076.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-4017740809434706296?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/4017740809434706296/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post_02.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4017740809434706296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4017740809434706296'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post_02.html' title='Машгородок до кризиса'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZsKM8U6wXHU/Su8b9fWilSI/AAAAAAAAAEg/628j9BAxEYQ/s72-c/1152764918440076.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6972135032389616962</id><published>2009-11-02T22:30:00.003+05:00</published><updated>2009-11-02T22:39:00.349+05:00</updated><title type='text'>Командировка в Москву, стена Цоя</title><content type='html'>&lt;div align="center"&gt;Будучи в прошлом поклонником Виктора Цоя и группы Кино, не мог пройти мимо одноименной стены на Арбате.&lt;br /&gt;Когда то я носил хаер, рваные джинсы, футболку с Цоем, кованные боты и прочие атрибуты нонконформизма.&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/Su8YMwkqTTI/AAAAAAAAAEQ/uXXx0FitnXA/s1600-h/0310+069.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5399561085716679986" border="0" alt="" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/Su8YMwkqTTI/AAAAAAAAAEQ/uXXx0FitnXA/s320/0310+069.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;Альтернативная стена со словами сука&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/Su8YMrqgr7I/AAAAAAAAAEI/t9qFfiWUDaA/s1600-h/0310+066.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5399561084399038386" border="0" alt="" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/Su8YMrqgr7I/AAAAAAAAAEI/t9qFfiWUDaA/s320/0310+066.jpg" /&gt;&lt;/a&gt; Классическая стена Цоя&lt;br /&gt;&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/Su8YMbVplgI/AAAAAAAAAEA/rEj_6oLVNvg/s1600-h/0310+064.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5399561080016573954" border="0" alt="" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/Su8YMbVplgI/AAAAAAAAAEA/rEj_6oLVNvg/s320/0310+064.jpg" /&gt; &lt;p align="center"&gt;&lt;/a&gt;Неувядающие цветы Цоя&lt;br /&gt;&lt;/p&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/Su8YNCPgZzI/AAAAAAAAAEY/78zc5taewKc/s1600-h/0310+071.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5399561090459789106" border="0" alt="" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/Su8YNCPgZzI/AAAAAAAAAEY/78zc5taewKc/s320/0310+071.jpg" /&gt; &lt;p align="center"&gt;&lt;/a&gt; Дверь Цоя&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6972135032389616962?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6972135032389616962/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6972135032389616962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6972135032389616962'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/11/blog-post.html' title='Командировка в Москву, стена Цоя'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZsKM8U6wXHU/Su8YMwkqTTI/AAAAAAAAAEQ/uXXx0FitnXA/s72-c/0310+069.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8610299860380964272</id><published>2009-10-30T11:46:00.001+05:00</published><updated>2009-10-30T11:49:13.633+05:00</updated><title type='text'>Рекурсивное удаление каталогов в Qt</title><content type='html'>Удаляем рекурсивно папки.&lt;br /&gt;&lt;br /&gt;&lt;PRE&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;//Функция удаления папки&lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;&lt;FONT COLOR="#FF6633"&gt;int&lt;/FONT&gt; removeFolder&lt;B&gt;&lt;FONT COLOR="#663300"&gt;(&lt;/FONT&gt;&lt;/B&gt;QDir&lt;B&gt;&lt;FONT COLOR="#663300"&gt; &amp;amp;&lt;/FONT&gt;&lt;/B&gt; dir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;)&lt;br /&gt;{&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#FF6633"&gt;&lt;br /&gt;&lt;br /&gt;   int&lt;/FONT&gt; res&lt;B&gt;&lt;FONT COLOR="#663300"&gt; =&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#999900"&gt; 0&lt;/FONT&gt;&lt;B&gt;&lt;FONT COLOR="#663300"&gt;;&lt;/FONT&gt;&lt;/B&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;&lt;br /&gt;   //Получаем список каталогов&lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;   QStringList lstDirs&lt;B&gt;&lt;FONT COLOR="#663300"&gt;  =&lt;/FONT&gt;&lt;/B&gt; dir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;.&lt;/FONT&gt;&lt;/B&gt;entryList&lt;B&gt;&lt;FONT COLOR="#663300"&gt;(&lt;/FONT&gt;&lt;/B&gt;QDir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;::&lt;/FONT&gt;&lt;/B&gt;Dirs&lt;B&gt;&lt;FONT COLOR="#663300"&gt;  |&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;                                   QDir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;::&lt;/FONT&gt;&lt;/B&gt;AllDirs&lt;B&gt;&lt;FONT COLOR="#663300"&gt; |&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;                                   QDir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;::&lt;/FONT&gt;&lt;/B&gt;NoDotAndDotDot&lt;B&gt;&lt;FONT COLOR="#663300"&gt;);&lt;/FONT&gt;&lt;/B&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;&lt;br /&gt;   //Получаем список файлов   &lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;   QStringList lstFiles&lt;B&gt;&lt;FONT COLOR="#663300"&gt; =&lt;/FONT&gt;&lt;/B&gt; dir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;.&lt;/FONT&gt;&lt;/B&gt;entryList&lt;B&gt;&lt;FONT COLOR="#663300"&gt;(&lt;/FONT&gt;&lt;/B&gt;QDir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;::&lt;/FONT&gt;&lt;/B&gt;Files&lt;B&gt;&lt;FONT COLOR="#663300"&gt;);&lt;/FONT&gt;&lt;/B&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;&lt;br /&gt;&lt;br /&gt;   //Удаляем файлы&lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;   foreach&lt;B&gt;&lt;FONT COLOR="#663300"&gt; (&lt;/FONT&gt;&lt;/B&gt;QString entry&lt;B&gt;&lt;FONT COLOR="#663300"&gt;,&lt;/FONT&gt;&lt;/B&gt; lstFiles&lt;B&gt;&lt;FONT COLOR="#663300"&gt;)&lt;br /&gt;   {&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;      QString entryAbsPath&lt;B&gt;&lt;FONT COLOR="#663300"&gt; =&lt;/FONT&gt;&lt;/B&gt; dir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;.&lt;/FONT&gt;&lt;/B&gt;absolutePath&lt;B&gt;&lt;FONT COLOR="#663300"&gt;() +&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#009900"&gt; "/"&lt;/FONT&gt;&lt;B&gt;&lt;FONT COLOR="#663300"&gt; +&lt;/FONT&gt;&lt;/B&gt; entry&lt;B&gt;&lt;FONT COLOR="#663300"&gt;;&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;      QFile&lt;B&gt;&lt;FONT COLOR="#663300"&gt;::&lt;/FONT&gt;&lt;/B&gt;remove&lt;B&gt;&lt;FONT COLOR="#663300"&gt;(&lt;/FONT&gt;&lt;/B&gt;entryAbsPath&lt;B&gt;&lt;FONT COLOR="#663300"&gt;);&lt;br /&gt;   }&lt;/FONT&gt;&lt;/B&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;&lt;br /&gt;&lt;br /&gt;   //Для папок делаем рекурсивный вызов    &lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;   foreach&lt;B&gt;&lt;FONT COLOR="#663300"&gt; (&lt;/FONT&gt;&lt;/B&gt;QString entry&lt;B&gt;&lt;FONT COLOR="#663300"&gt;,&lt;/FONT&gt;&lt;/B&gt; lstDirs&lt;B&gt;&lt;FONT COLOR="#663300"&gt;)&lt;br /&gt;   {&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;      QString entryAbsPath&lt;B&gt;&lt;FONT COLOR="#663300"&gt; =&lt;/FONT&gt;&lt;/B&gt; dir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;.&lt;/FONT&gt;&lt;/B&gt;absolutePath&lt;B&gt;&lt;FONT COLOR="#663300"&gt;() +&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#009900"&gt; "/"&lt;/FONT&gt;&lt;B&gt;&lt;FONT COLOR="#663300"&gt; +&lt;/FONT&gt;&lt;/B&gt; entry&lt;B&gt;&lt;FONT COLOR="#663300"&gt;;&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;      removeFolder&lt;B&gt;&lt;FONT COLOR="#663300"&gt;(&lt;/FONT&gt;&lt;/B&gt;QDir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;(&lt;/FONT&gt;&lt;/B&gt;entryAbsPath&lt;B&gt;&lt;FONT COLOR="#663300"&gt;));&lt;br /&gt;   }&lt;/FONT&gt;&lt;/B&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;&lt;br /&gt;&lt;br /&gt;   //Удаляем обрабатываемую папку&lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;&lt;FONT COLOR="#FF0000"&gt;   if&lt;/FONT&gt;&lt;B&gt;&lt;FONT COLOR="#663300"&gt; (!&lt;/FONT&gt;&lt;/B&gt;QDir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;().&lt;/FONT&gt;&lt;/B&gt;rmdir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;(&lt;/FONT&gt;&lt;/B&gt;dir&lt;B&gt;&lt;FONT COLOR="#663300"&gt;.&lt;/FONT&gt;&lt;/B&gt;absolutePath&lt;B&gt;&lt;FONT COLOR="#663300"&gt;()))&lt;br /&gt;   {&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;      res&lt;B&gt;&lt;FONT COLOR="#663300"&gt; =&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#999900"&gt; 1&lt;/FONT&gt;&lt;B&gt;&lt;FONT COLOR="#663300"&gt;;&lt;br /&gt;   }&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#FF0000"&gt;&lt;br /&gt;   return&lt;/FONT&gt; res&lt;B&gt;&lt;FONT COLOR="#663300"&gt;;&lt;br /&gt;}&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8610299860380964272?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8610299860380964272/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/qt.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8610299860380964272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8610299860380964272'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/qt.html' title='Рекурсивное удаление каталогов в Qt'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-4995822467883160893</id><published>2009-10-29T14:23:00.004+05:00</published><updated>2009-10-29T14:57:46.633+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='полный идиотизм'/><title type='text'>Расширение типов зависимостей в форме ввода</title><content type='html'>Некоторые люди спрашивают, почему у тебя в форме ввода зависимости между компонентами обусловлены по RTTI? Ведь это налагает ограничения на разновидности зависимостей. То есть, ты четко прописываешь связку, например, FSexEdit (выбор пола) и FComboList (список фамилий) и в зависимости от пола меняешь окончания фамилий. А если тебе надо будет добавить некую другую зависимость, когда в FComboList будут не фамилии а нечто другое, как тогда?&lt;br /&gt;&lt;br /&gt;Отвечаю, добавление новой зависимости не составит труда. В утилите Rule нужно добавить третий параметр - тип зависимости.&lt;br /&gt;&lt;br /&gt;Вот код утилиты Rule::applyRule&lt;br /&gt;&lt;br /&gt;&lt;PRE&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;//-----------------------------------------------------------------------------------&lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;&lt;FONT COLOR="#FF6633"&gt;void&lt;/FONT&gt; Rule&lt;B&gt;&lt;FONT COLOR="#663300"&gt;::&lt;/FONT&gt;&lt;/B&gt;applyRule&lt;B&gt;&lt;FONT COLOR="#663300"&gt;(&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#990000"&gt;const&lt;/FONT&gt; AbstractFormComponent&lt;B&gt;&lt;FONT COLOR="#663300"&gt; &amp;amp;&lt;/FONT&gt;&lt;/B&gt; master&lt;B&gt;&lt;FONT COLOR="#663300"&gt;,&lt;/FONT&gt;&lt;/B&gt; AbstractFormComponent&lt;B&gt;&lt;FONT COLOR="#663300"&gt; &amp;amp;&lt;/FONT&gt;&lt;/B&gt; slave&lt;B&gt;&lt;FONT COLOR="#663300"&gt;)&lt;br /&gt;{&lt;/FONT&gt;&lt;/B&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;&lt;br /&gt;&lt;br /&gt;   //преобразование мастера&lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;&lt;FONT COLOR="#990000"&gt;   const&lt;/FONT&gt; FSexEdit&lt;B&gt;&lt;FONT COLOR="#663300"&gt; *&lt;/FONT&gt;&lt;/B&gt; masterSex&lt;B&gt;&lt;FONT COLOR="#663300"&gt; =&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#990000"&gt; dynamic_cast&lt;/FONT&gt;&lt;B&gt;&lt;FONT COLOR="#663300"&gt;&amp;lt;&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#990000"&gt;const&lt;/FONT&gt; FSexEdit&lt;B&gt;&lt;FONT COLOR="#663300"&gt; *&amp;gt;(&amp;amp;&lt;/FONT&gt;&lt;/B&gt;master&lt;B&gt;&lt;FONT COLOR="#663300"&gt;);&lt;/FONT&gt;&lt;/B&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;&lt;br /&gt;&lt;br /&gt;   //преобразование раба&lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;   FComboTextList&lt;B&gt;&lt;FONT COLOR="#663300"&gt; *&lt;/FONT&gt;&lt;/B&gt; slaveCombo&lt;B&gt;&lt;FONT COLOR="#663300"&gt; =&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#990000"&gt; dynamic_cast&lt;/FONT&gt;&lt;B&gt;&lt;FONT COLOR="#663300"&gt;&amp;lt;&lt;/FONT&gt;&lt;/B&gt;FComboTextList&lt;B&gt;&lt;FONT COLOR="#663300"&gt; *&amp;gt;(&amp;amp;&lt;/FONT&gt;&lt;/B&gt;slave&lt;B&gt;&lt;FONT COLOR="#663300"&gt;);&lt;/FONT&gt;&lt;/B&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;&lt;br /&gt;&lt;br /&gt;   //зависимости от секса&lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;&lt;FONT COLOR="#FF0000"&gt;   if&lt;/FONT&gt;&lt;B&gt;&lt;FONT COLOR="#663300"&gt; (&lt;/FONT&gt;&lt;/B&gt;masterSex&lt;B&gt;&lt;FONT COLOR="#663300"&gt;)&lt;br /&gt;   {&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#FF0000"&gt;&lt;br /&gt;      if&lt;/FONT&gt;&lt;B&gt;&lt;FONT COLOR="#663300"&gt; (&lt;/FONT&gt;&lt;/B&gt;slaveCombo&lt;B&gt;&lt;FONT COLOR="#663300"&gt;)&lt;br /&gt;      {&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;         apply&lt;B&gt;&lt;FONT COLOR="#663300"&gt;(*&lt;/FONT&gt;&lt;/B&gt;masterSex&lt;B&gt;&lt;FONT COLOR="#663300"&gt;, *&lt;/FONT&gt;&lt;/B&gt;slaveCombo&lt;B&gt;&lt;FONT COLOR="#663300"&gt;);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;}&lt;/FONT&gt;&lt;/B&gt;&lt;I&gt;&lt;FONT COLOR="#999999"&gt;&lt;br /&gt;//-----------------------------------------------------------------------------------&lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;Как видно из кода - я делаю динамическое преобразование с помощью dynamic_cast, а затем в зависимости от результата вызываю функцию apply, аргументами которой являются уже конкретные типы FSexEdit и FComboTextList.&lt;br /&gt;Чтобы расширить набор зависимостей, мне нужно в функции apply добавить третий параметр - вид зависимости.&lt;br /&gt;&lt;PRE&gt;&lt;FONT COLOR="#FF6633"&gt;void&lt;/FONT&gt; Rule&lt;B&gt;&lt;FONT COLOR="#663300"&gt;::&lt;/FONT&gt;&lt;/B&gt;apply&lt;B&gt;&lt;FONT COLOR="#663300"&gt;(&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#990000"&gt;const&lt;/FONT&gt; FSexEdit&lt;B&gt;&lt;FONT COLOR="#663300"&gt; &amp;amp;&lt;/FONT&gt;&lt;/B&gt; sex&lt;B&gt;&lt;FONT COLOR="#663300"&gt;,&lt;/FONT&gt;&lt;/B&gt; FComboTextList&lt;B&gt;&lt;FONT COLOR="#663300"&gt; &amp;amp;&lt;/FONT&gt;&lt;/B&gt; combo&lt;B&gt;&lt;FONT COLOR="#663300"&gt;,&lt;/FONT&gt;&lt;/B&gt;&lt;FONT COLOR="#FF6633"&gt; int&lt;/FONT&gt; depType&lt;B&gt;&lt;FONT COLOR="#663300"&gt;)&lt;/FONT&gt;&lt;/B&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;Тип зависимости будет узнавать функция applyRule из экземпляра master.&lt;br /&gt;&lt;br /&gt;Так, что изменения минимальны, код легко расширяется. Все изменения не выходят за границы утилиты класса.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-4995822467883160893?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/4995822467883160893/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_29.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4995822467883160893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4995822467883160893'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_29.html' title='Расширение типов зависимостей в форме ввода'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-3927022286590582555</id><published>2009-10-27T16:39:00.003+05:00</published><updated>2009-10-27T17:07:34.598+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='маразм крепчал'/><title type='text'>Реализация зависимостей в форме ввода</title><content type='html'>Сегодня набросал механизм зависимостей. Вроде работает, но внутреннее чувство неправильности сделанного осталось.&lt;br /&gt;Мне не нравится, что я использовал:&lt;br /&gt;- множественное наследование&lt;br /&gt;- RTTI &lt;br /&gt;&lt;br /&gt;Это ведет к усложнению проекта. Проект должен быть прост и красив, но сделать просто очень трудно.&lt;br /&gt;&lt;br /&gt;Дальше технические детали.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Сначала нужно понять как происходит формирование зависимостей между компонентами.&lt;br /&gt;1) Форма считывает свой файл описания и создает согласно описанию компоненты. Компоненты размещаются в &lt;span style="font-style:italic;"&gt;QVector&amp;lt;AbstractFormComponent *&gt; components_;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2) Форма смотрит свойства компонентов и определяет по именам зависимые компоненты.&lt;br /&gt;Например, для компонента Sex (Пол) свойство DependentFields содержит имена LastName, FirstName. Это значит, что выбор пола влияет на компоненты с именами LastName, FirstName.&lt;br /&gt;&lt;br /&gt;Теперь нужно определить правила, по которым происходят изменения. Для этого я определил класс Rule.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;class Rule&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;&lt;blockquote&gt;   static void applyRule(const AbstractFormComponent &amp; master,        AbstractFormComponent &amp; slave);&lt;br /&gt;&lt;br /&gt;   static void apply(const FSexEdit &amp; sex, FComboTextList &amp; combo);&lt;br /&gt;&lt;/blockquote&gt;};&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Этот класс - утилита класса AbstractFormComponent. Функция applyRule() принимает указатель на ведущий (master) и ведомый компонент (slave).&lt;br /&gt;Далее, используя RTTI dynamic_cast она определяет тип компонентов и вызывает перегружаемую функцию apply(...).&lt;br /&gt;&lt;br /&gt;Это первый минус. Не хотелось бы использовать RTTI, но попытки сделать через шаблоны провалились. Поэтому пока так.&lt;br /&gt;&lt;br /&gt;Далее, заводим класс DependentManager, управляющий зависимостями. В его обязанности входит хранение &lt;span style="font-style:italic;"&gt;QMultiMap&amp;lt;AbstractFormComponent * master, AbstractFormComponent * slave&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Экземпляр класса DependentManager должен быть в форме один.&lt;br /&gt;&lt;br /&gt;И наконец, создаем класс-примесь Dependent, который будем примешивать к наследникам AbstractFormComponent для задания им возможности работать с DependentManager.&lt;br /&gt;&lt;br /&gt;Вот здесь вырисовывается второй минус - множественное наследование.&lt;br /&gt;&lt;br /&gt;Компонент выбора пола выглядит так&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;class FSexEdit : public QObject, public AbstractFormComponent, public Dependent&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;QObject нужен для приема сигналов от композитного компонента SexEdit. AbstractFormComponent - основной супер-класс, Dependent - примесь.&lt;br /&gt;&lt;br /&gt;В принципе ничего сверх страшного, но изящество и простота катастрофически тают уже в начале проекта. А это грозит усложнением дальнейшего сопровождения.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-3927022286590582555?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/3927022286590582555/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_27.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3927022286590582555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3927022286590582555'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_27.html' title='Реализация зависимостей в форме ввода'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7270791758274250443</id><published>2009-10-26T17:08:00.002+05:00</published><updated>2009-10-26T17:43:55.685+05:00</updated><title type='text'>Ваяем форму ввода</title><content type='html'>Продолжаю ваять &lt;a href="http://qtcoder.blogspot.com/2009/09/blog-post_12.html"&gt;Форму ввода текста&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Пока остановился на том, что все компоненты, родные Qt и самописные должны наследовать от некого абстрактного класса, который я назвал &lt;span style="font-weight:bold;"&gt;AbstractFormComponent&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Класс содержит ряд чисто виртуальных функций, которые, следовательно, нужно переобпределять потомкам.&lt;br /&gt;Интерфейс класса пока выглядит так.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;class AbstractFormComponent&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;   &lt;blockquote&gt;void setName(const QString &amp; name)&lt;br /&gt;   {&lt;br /&gt;      name_ = name;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   QString name() const &lt;br /&gt;   {&lt;br /&gt;      return name_;&lt;br /&gt;   }&lt;br /&gt;   virtual void setValue(const QVariant &amp;) = 0;&lt;br /&gt;   virtual QVariant value() const = 0;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;protected:&lt;br /&gt;   &lt;blockquote&gt;virtual QWidget * widget() const = 0;&lt;br /&gt;   virtual void setCaps(Caps) = 0;&lt;/blockquote&gt;&lt;br /&gt;private:&lt;br /&gt;  &lt;blockquote&gt; QString name_;&lt;/blockquote&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Класс содержит пару функций для задания имени компонента, чтобы каждый компонент мог сказать как его зовут.&lt;br /&gt;Дальше идут две основополагающие функции setValue и value. Они устанавливают и получают значение компонента.&lt;br /&gt;Здесь пришлось использовать тип QVariant, хотя мне хотелось бы это сделать на чистом С. Тип QVariant удобен тем, что может хранить любой тип - int, QString, QDate и многие другие.&lt;br /&gt;Каждый компонент сам понимает с каким типом он работает, преобразует QVariant в нужный тип и работает с ним.&lt;br /&gt;&lt;br /&gt;Далее идет функция widget() - она возвращает виджет, который будет отражен на форме.&lt;br /&gt;&lt;br /&gt;Такой подход, т.е. наследование всех компоненто от единой основы, позволяет отделить интерфейс компонента от реализации. Например, если захочу я переписать компонент QComboBox, то все что мне понадобится, чтобы пристыковать новый компонент - это соблюсти небольшой интерфейс абстрактного класса AbstractFormComponent.&lt;br /&gt;&lt;br /&gt;А все компоненты я могу поместить в вектор&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  QVector&amp;lt;AbstractFormComponent *&gt; components_;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;и работать с ними как с одним типом.&lt;br /&gt;&lt;br /&gt;Следующим этапом нужно разработать класс для осуществления зависимостей между компонентами. Например, чтобы выбор в компоненте выбора пола влиял на окончания фамилий в справочнике фамилий. Причем таких зависимостей может быть сколько угодно и совершенно разнообразного поведения.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7270791758274250443?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7270791758274250443/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_26.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7270791758274250443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7270791758274250443'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_26.html' title='Ваяем форму ввода'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-735526724972857110</id><published>2009-10-26T07:54:00.000+05:00</published><updated>2009-10-26T08:00:37.066+05:00</updated><title type='text'>Снег и холода</title><content type='html'>Все таки грамотно все устроено у матери природы - перед тем как вдарить холодом, она присыпает землю одеялом из снега.&lt;br /&gt;Вчера сыпал снег весь день, а седня утром шел на работу яйцами звеня - (-11 &lt;sup&gt;○&lt;/sup&gt;С)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-735526724972857110?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/735526724972857110/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_25.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/735526724972857110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/735526724972857110'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_25.html' title='Снег и холода'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6254753525498769352</id><published>2009-10-25T20:25:00.001+05:00</published><updated>2009-10-25T20:31:44.723+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Командировка в Москву'/><title type='text'>Командировка в Москву, Арбат дом номер 8</title><content type='html'>Прогулка по Арбату в день моего дня рождения.&lt;br /&gt;&lt;br /&gt;Пытался найти Арбат дом номер 8, про который поег Григорян:&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;Какого хрена, это оказался чистенький прилизанный домик, прямо как с картинки.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuRu4VRirMI/AAAAAAAAADU/YCrjQtLUxwg/s1600-h/0310+074.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuRu4VRirMI/AAAAAAAAADU/YCrjQtLUxwg/s320/0310+074.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5396560167559146690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SuRu4Yp_4UI/AAAAAAAAADM/eCMLlO--Pfo/s1600-h/0310+073.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SuRu4Yp_4UI/AAAAAAAAADM/eCMLlO--Pfo/s320/0310+073.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5396560168467030338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Не ожидал я такого. Даж засомневался, уточнил у скучающего охранника, который никак не мог понять, что я КОНКРЕТНО ищу. Я сказал что Григорян, группа Крематорий, охранник сказал, что не увлекается и потерял ко мне интерес.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6254753525498769352?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6254753525498769352/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/8.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6254753525498769352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6254753525498769352'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/8.html' title='Командировка в Москву, Арбат дом номер 8'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuRu4VRirMI/AAAAAAAAADU/YCrjQtLUxwg/s72-c/0310+074.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-5116536477119840621</id><published>2009-10-23T23:14:00.000+06:00</published><updated>2009-10-23T23:25:53.853+06:00</updated><title type='text'>Командировка в Москву, день рождения</title><content type='html'>Так случилось, что свои 30 лет я встретил в командировке в Москве.&lt;br /&gt;Тридцатого числа мне исполнилось 30 лет. И пожалуй, то, что место встречи оказалась Москва, не случайно.&lt;br /&gt;Специфика командировки была такова, что свободной минуты просто не находилось. Все дни, включая выходные, были в работе. Накануне 29-го Лена Педяш, рулившая проектом, предложила сходить в центр Москвы утром до прихода в офис, ибо из офиса уйти нереально.&lt;br /&gt;Чтож я так и сделал, утром встал, взлянул на себя в зеркало - оттуда глянул 30-ти летний мужик и сказал - Парень, это рубеж, надо его как-то отметить.&lt;br /&gt;И я поехал в центр. Коллега же мой пошел в офис.&lt;br /&gt;&lt;br /&gt;Шел дождь, было мокро и противно, но это был мой день рождения, мои 30 лет. Выйдя на охотном ряду я купил пива и отметил сам с собой мои 30 лет. Немного погулял по центру.&lt;br /&gt;&lt;br /&gt;Врмемя раннее - 9-30 утра.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuHmo7BHPtI/AAAAAAAAAC8/n8C88qdWuMA/s1600-h/0310+041.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuHmo7BHPtI/AAAAAAAAAC8/n8C88qdWuMA/s320/0310+041.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395847419278081746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuHmoeiJKUI/AAAAAAAAACs/XWLD8Exw4xM/s1600-h/0310+028.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuHmoeiJKUI/AAAAAAAAACs/XWLD8Exw4xM/s320/0310+028.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395847411631991106" /&gt;&lt;/a&gt;&lt;br /&gt;Дождь&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuHmozlDy2I/AAAAAAAAADE/MsUMWuyWoRk/s1600-h/0310+047.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuHmozlDy2I/AAAAAAAAADE/MsUMWuyWoRk/s320/0310+047.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395847417281366882" /&gt;&lt;/a&gt;&lt;br /&gt;Выплывает Красная площадь&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuHmonH8XwI/AAAAAAAAAC0/Pt7lyC0tBQY/s1600-h/0310+034.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuHmonH8XwI/AAAAAAAAAC0/Pt7lyC0tBQY/s320/0310+034.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395847413938020098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SuHmoDfVsrI/AAAAAAAAACk/ZUllDd6sSd8/s1600-h/0310+021.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SuHmoDfVsrI/AAAAAAAAACk/ZUllDd6sSd8/s320/0310+021.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395847404372472498" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-5116536477119840621?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/5116536477119840621/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_23.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5116536477119840621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5116536477119840621'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_23.html' title='Командировка в Москву, день рождения'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZsKM8U6wXHU/SuHmo7BHPtI/AAAAAAAAAC8/n8C88qdWuMA/s72-c/0310+041.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6019460721673001053</id><published>2009-10-22T22:58:00.000+06:00</published><updated>2009-10-22T23:10:47.347+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Командировка в Москву'/><title type='text'>Командировка в Москву, общие впечатления</title><content type='html'>Что меня удивило в Москве в сравнении с нашим Мухосранском:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Очень чисто на улицах, метут постоянно и одни урюки. Под окном шла стройка, рыли большую канаву - все что нарыли грузили в грузовики, грузовики накрывали тентом, а колеса грузовиков МЫЛИ! водой из шланга. Только после этого машины выезжали в город.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SuCQoS5FlCI/AAAAAAAAACE/8mkEC3HMePw/s1600-h/0310+004.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/SuCQoS5FlCI/AAAAAAAAACE/8mkEC3HMePw/s320/0310+004.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395471375530300450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Урюки в магазинах, много урюков&lt;br /&gt;&lt;li&gt; Неприветливость в тех же магазинах&lt;br /&gt;&lt;li&gt; Много красивых девушек, больше чем у нас в городе. И наряды более откровенные.&lt;br /&gt;&lt;li&gt; Цены. В двух соседних магазинах одно и тоже пиво отличается в цене на 30-50%&lt;br /&gt;&lt;li&gt; Мягкий климат. Дышится свободно и легче чем у нас. Несмотря на обилие машин не ощущается загрязненности воздуха. Воздуха хватает на всех.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Удивила большая поляна усеянная газончиком, из которой торчали здоровые трубы.&lt;br /&gt;Оказалось это подземная парковка, а трубы - вентиляция.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SuCRRAYVqrI/AAAAAAAAACU/6H3m4mV2z70/s1600-h/0310+016.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SuCRRAYVqrI/AAAAAAAAACU/6H3m4mV2z70/s320/0310+016.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395472074935741106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SuCRQ_3tt6I/AAAAAAAAACM/qPdlX1E4xw4/s1600-h/0310+015.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_ZsKM8U6wXHU/SuCRQ_3tt6I/AAAAAAAAACM/qPdlX1E4xw4/s320/0310+015.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395472074798905250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Миасс-мебель в торговом центре Черемушки&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SuCR3g87K5I/AAAAAAAAACc/8iKNlhWGl_k/s1600-h/0310+019.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SuCR3g87K5I/AAAAAAAAACc/8iKNlhWGl_k/s320/0310+019.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395472736514157458" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6019460721673001053?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6019460721673001053/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_22.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6019460721673001053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6019460721673001053'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_22.html' title='Командировка в Москву, общие впечатления'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZsKM8U6wXHU/SuCQoS5FlCI/AAAAAAAAACE/8mkEC3HMePw/s72-c/0310+004.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-4329652885113575521</id><published>2009-10-21T22:25:00.000+06:00</published><updated>2009-10-21T22:48:33.190+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Командировка в Москву'/><category scheme='http://www.blogger.com/atom/ns#' term='самолеты'/><title type='text'>Командировка в Москву</title><content type='html'>Наконец-то появилось время отчитаться о командировке в Москву.&lt;br /&gt;Собственно, это моя первая в карьере командировка, надеюсь не последняя ибо понравилось )))&lt;br /&gt;Начнем по порядку. Ранним утром, точнее в 2-30 ночи меня подобрали на машине и рванули в аэропорт в Ебург. Путь не близкий, автобус обычно пилит 5 часов, если у него ничего не отваливается по дороге. Но мы (я и коллега) ехали не на автобусе, а на машине с водителем, дай бог памяти как она называлась - Спейс Вагон по-моему.&lt;br /&gt;На ней долетели за 2 часа 45 минут, без остановок на поссать и перекурить. И кстати зря, к концу поездки думал мой мочевой пузырь не выдержит. Однако выдержал, в аэропорту бегом кинулся к ближайшему WC и облегчил душу.&lt;br /&gt;&lt;br /&gt;Прикатили мы в аэропорт Кольцово, тут же объявили регистрацию, сдали багаж, пошли в чистую зону. С этим все в порядке. Надо сказать, что летел я первый раз самолетом, поэтому жутко боялся. И вот мой первый выход на взлетную полосу - самолеты, самолеты, кругом самолеты. Нас пассажиров погрузили в автобус без сидений и отвезли к нашему самолету. Тонкость тут в том, что ты заранее не знаешь на чем полетишь, это узнаешь только когда тебя выгрузят у трапа самолета. В глубине души я надеялся, что это будет Боинг, т.к. слышал о них много хорошего. Моим надеждам сбыться не было суждено - ревя всеми двигателями, нас поджидала грациозная, как лань, Тушка 154.&lt;br /&gt;Место нам выпало символическое - в хвосте самолета возле туалета. Рев двигателей сводил с ума.&lt;br /&gt;&lt;br /&gt;Ощущения от первого взлета трудно описать - было страшно, я вцепился в подлокотники и не верил, что полет возможен. Однако самолет набирал высоту и я решился перевести дыхание - ничего страшного не происходило, наоборот, я видел чудо воочию - я летел! Это было прекрасное ощущение, хотелось заорать от восторга, как на атракционе. Но этого я делать не стал. Мой опытный товарищ вообще делл вид, что ничего не происходит и притворялся спящим - дело происходило утром - всю ночь мы не спали. Поэтому я взял себя в руки и не стал орать. &lt;br /&gt;&lt;br /&gt;Наконец, мы взлетели, скорость 850 км/ч, высота 10 км, температура за бортом -55. Холодновато.&lt;br /&gt;&lt;br /&gt;Продолжение следует... &lt;br /&gt;&lt;br /&gt;Несколько фоток из серии "Москва глазами провинциала".&lt;br /&gt;&lt;br /&gt;Проблема парковки для Москвы особенно актуальна. Все тротуары забиты машинами.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/St86Xi3R-rI/AAAAAAAAABk/ibug-XRYviQ/s1600-h/0310+006.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/St86Xi3R-rI/AAAAAAAAABk/ibug-XRYviQ/s320/0310+006.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395095054783216306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/St86X0-bX5I/AAAAAAAAABs/NZTk74twg5k/s1600-h/0310+007.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/St86X0-bX5I/AAAAAAAAABs/NZTk74twg5k/s320/0310+007.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395095059645030290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Причудливые архитектурные решения - разноцветный круглый (цилиндрический) дом.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/St86YN3GGdI/AAAAAAAAAB8/uzcq_nMknI8/s1600-h/0310+009.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/St86YN3GGdI/AAAAAAAAAB8/uzcq_nMknI8/s320/0310+009.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395095066325162450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Эээ.. Городской пейзаж&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/St86Xw7AtsI/AAAAAAAAAB0/Tb_6ilzo1fM/s1600-h/0310+008.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/St86Xw7AtsI/AAAAAAAAAB0/Tb_6ilzo1fM/s320/0310+008.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395095058556958402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Это все район Новые Черемушки. Фотографировать начал только там. Фотик пропутешествовал в багаже, потому ни самолет, ни вид из окна самолета не снял.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-4329652885113575521?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/4329652885113575521/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_21.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4329652885113575521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4329652885113575521'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_21.html' title='Командировка в Москву'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZsKM8U6wXHU/St86Xi3R-rI/AAAAAAAAABk/ibug-XRYviQ/s72-c/0310+006.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7373119131266159083</id><published>2009-10-19T22:29:00.000+06:00</published><updated>2009-10-19T22:35:25.100+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='закат'/><title type='text'>Роскошный закат</title><content type='html'>Вышел из офиса и был покорен роскошным закатом.&lt;br /&gt;Багрово-свинцовые облака нависали над городом с запада, уходя на восток зловеще темной полосой. В облаках пробивались лазурные дыры, неся угасающий свет солнца.&lt;br /&gt;Что мог заснял своим телефоном, за качество извиняюсь.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/StyUmmuFCUI/AAAAAAAAABc/4bvt88GfuhU/s1600-h/%D0%A4%D0%BE%D1%82%D0%BE001.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/StyUmmuFCUI/AAAAAAAAABc/4bvt88GfuhU/s320/%D0%A4%D0%BE%D1%82%D0%BE001.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5394349844632766786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/StyUmOkvfNI/AAAAAAAAABU/-2IKjyK-I9Y/s1600-h/%D0%A4%D0%BE%D1%82%D0%BE000.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/StyUmOkvfNI/AAAAAAAAABU/-2IKjyK-I9Y/s320/%D0%A4%D0%BE%D1%82%D0%BE000.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5394349838151154898" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Я вижу, как закат стёкла оконные плавит,&lt;br /&gt;День прожит, а ночь оставит тени снов в углах.&lt;br /&gt;Мне не вернуть назад серую птицу печали,&lt;br /&gt;Всё в прошлом, так быстро тают замки в облаках.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7373119131266159083?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7373119131266159083/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_19.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7373119131266159083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7373119131266159083'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post_19.html' title='Роскошный закат'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZsKM8U6wXHU/StyUmmuFCUI/AAAAAAAAABc/4bvt88GfuhU/s72-c/%D0%A4%D0%BE%D1%82%D0%BE001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6589891546698911414</id><published>2009-10-10T16:12:00.000+06:00</published><updated>2009-10-10T16:26:27.951+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='комфорт'/><category scheme='http://www.blogger.com/atom/ns#' term='Переезд'/><category scheme='http://www.blogger.com/atom/ns#' term='сервер'/><title type='text'>Устранение сервера</title><content type='html'>На работе добился переноса сервера из под стола коллеги в серверную.&lt;br /&gt;Напомню, что не так давно был переезд на работе и на новом месте вдруг выяснилось, что дико шумит сервер. Причем окружающие 5 человек на этот шум совершенно не реагировали. А на меня этот шум действовал совершенно угнетающим образом.&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;Все таки, на рабочем месте должно быть комфортно - здесь мы проводим большую часть жизни. Я редко работаю меньше 9 часов, "а в середине треть жизни мы спим, не молившись перед сном".&lt;br /&gt;&lt;br /&gt;Поэтому неправы те, кто говорит, что мы типа идем на работу не за комфортом. В комфортной обстановке куда легче и продуктивнее работается.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6589891546698911414?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6589891546698911414/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6589891546698911414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6589891546698911414'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/blog-post.html' title='Устранение сервера'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-9037770754814100975</id><published>2009-10-07T08:07:00.000+06:00</published><updated>2009-10-07T08:11:16.140+06:00</updated><title type='text'>Калинов Мост SWA 2006</title><content type='html'>Что ж так вставляет так альбом этот?&lt;br /&gt;Песня "Как Хотел Тебя (Обидеть)" просто крышу рвет.&lt;blockquote&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;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-9037770754814100975?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/9037770754814100975/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/10/swa-2006.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/9037770754814100975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/9037770754814100975'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/10/swa-2006.html' title='Калинов Мост SWA 2006'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-5254312503186918799</id><published>2009-09-20T21:17:00.000+06:00</published><updated>2009-09-20T21:29:55.182+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='полный идиотизм'/><category scheme='http://www.blogger.com/atom/ns#' term='будда'/><title type='text'>Идиотская притча о будде</title><content type='html'>Сначала обширная цитата - типа притча про будду, рассказанная на одном из форумов.&lt;br /&gt;Предполагается, что после этой притчи народ прослезится и поймет свои ошибки и радостно бросится под лоно буддизма.&lt;br /&gt;Об этом, в частности, говорят комментарии.&lt;br /&gt;&lt;blockquote&gt;:-))) почему люди такие простые вещи понимают (и то если понимают) только через красивые легенды?&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;)))...уж очень ко времени для меня пришлась эта притча, спасибо Валентин...))) &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;И мне тоже как нельзя кстати...&lt;/blockquote&gt;&lt;br /&gt;Однако история сама по себе, увы, очень тупа и примитивна. В конце я написал продолжение данной истории.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Итак, притча:&lt;br /&gt;&lt;blockquote&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;— Но мы же оскорбляли тебя, почему же ты не сердишься на нас? &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;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;И теперь мое продолжение:&lt;br /&gt;&lt;blockquote&gt;Тогда один ученик спросил:&lt;br /&gt;- Учитель, а если бы жители другой деревни принесли не фрукты и угощения, а ведра навоза и начали бы нас закидывать грязью. От того что мы бы не приняли их навоз и грязь - это же не означает, что мы бы не стояли все перемазанные в дерьме по уши.&lt;br /&gt;&lt;br /&gt;Тогда будда тяжко вздохнул и сказал:&lt;br /&gt;- Да, чот я хуйню сморозил&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Речь о том, что непонятно с какого перепугу будда сравнил проклятия с какими-то угощениями и фруктами. Хотя правильно было бы сравнить их с кусками говна, которыми жители закидывали будду и учеников.&lt;br /&gt;&lt;br /&gt;Я вообще негативно отношусь к буддизму. Теория полного пофигизма не для меня.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-5254312503186918799?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/5254312503186918799/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5254312503186918799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/5254312503186918799'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_20.html' title='Идиотская притча о будде'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-7091765301636400797</id><published>2009-09-18T22:12:00.000+06:00</published><updated>2009-09-18T22:18:25.836+06:00</updated><title type='text'>Работа в Перми на Qt</title><content type='html'>Предлагали седня работу в Перми. Что-то писать на Qt, под некий прибор. Можно удаленно, прибор обещали выслать на дом. &lt;br /&gt;Я отказался, но может кому интересно.&lt;br /&gt;Из нашей переписки&lt;br /&gt;&lt;blockquote&gt;На самом деле прибор выслать никаких проблем нет. Ему нужно только 10-30В. И провод из компа с miniUSB. Прошивку в прибор, я могу через интернет загонять, а можете и Вы сами через USB (это для случая интенсивной работы совместной). У вас инет быстрый и скоростной?&lt;br /&gt;Расскажу о нас. Мы фирма к-ая засталяет глаза и рты клиентов широко открываться от удивления (мы делаем невероятные вещи. Невероятные во всём). Для информации можете посмотреть на Galileosky.com. Оболденный дизайн. Обалденный функционал. Обалденная надежность. У него есть юсби, в к-ом реализовано виртуальный ком-порт. Налажен протокол и внедрен в прибор. Написана прога на билдере (первая версия конфигуратора). Работает отлично, но хочем переделать. Вот только у нас нет специалиста к-ый бы разработал шикарную прогу "конфигуратор", к-ая бы позволила широко открыть глаза и рты клиентов! &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.prog.org.ru/topic_10644_0.html"&gt;Ссылка на объяву&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-7091765301636400797?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/7091765301636400797/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/qt.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7091765301636400797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/7091765301636400797'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/qt.html' title='Работа в Перми на Qt'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8577145191084158950</id><published>2009-09-18T21:53:00.000+06:00</published><updated>2009-09-18T22:11:50.713+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='стресс'/><category scheme='http://www.blogger.com/atom/ns#' term='Переезд'/><category scheme='http://www.blogger.com/atom/ns#' term='маразм'/><category scheme='http://www.blogger.com/atom/ns#' term='адаптация'/><title type='text'>Переезд на работе</title><content type='html'>Переезд - это, все таки, офигенный стресс. Не далее как вчера спустился с третьего этажа на второй и начинаю заново приспосабливаться.&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;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SrOxLyFJaAI/AAAAAAAAABM/hAK_80Rm_2o/s1600-h/1038081841_thumb.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 120px; height: 90px;" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/SrOxLyFJaAI/AAAAAAAAABM/hAK_80Rm_2o/s320/1038081841_thumb.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5382840795617912834" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8577145191084158950?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8577145191084158950/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_18.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8577145191084158950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8577145191084158950'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_18.html' title='Переезд на работе'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZsKM8U6wXHU/SrOxLyFJaAI/AAAAAAAAABM/hAK_80Rm_2o/s72-c/1038081841_thumb.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8033530739794836093</id><published>2009-09-17T21:59:00.000+06:00</published><updated>2009-09-17T22:14:48.055+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='просто маразм'/><title type='text'>Складской учет</title><content type='html'>Близок срок сдачи &lt;a href="http://qtcoder.blogspot.com/2009/09/visual-basic-2005.html"&gt;калыма&lt;/a&gt;.&lt;br /&gt;Освежил в памяти Visual Basic, в принципе язык даже понравился. В сравнении с C++ писанины, конечно, больше. Например, виртуальные функции базового класса надо описывать как &lt;strong&gt;Overridable&lt;/strong&gt;, перегруженные функции производных классов как &lt;strong&gt;Overrides&lt;/strong&gt;. У C++ в этом плане более лаконично - просто &lt;strong&gt;virtual&lt;/strong&gt; на все случаи жизни. &lt;br /&gt;Еще позабавила скорость компиляции (очень быстро), ну и роль среды разработки в качестве компилятора - это когда студия сразу начинает подчеркивать волнистыми линиями неправильные места. Типа spellchecker. Что, впрочем, не спасает от run-time ошибок, типа присвоения экземпляру базового класса экземпляра производного класса. &lt;br /&gt;Вылетает обломс. Тут, кстати, тоже нет той гибкости C++, с его reinterpret_cast, который может преобразовывать что угодно во что угодно.&lt;br /&gt;&lt;br /&gt;Ну и, собственно, пример наструганного безобразия.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SrJfzUIuoZI/AAAAAAAAABE/T_0MaODuSCw/s1600-h/sklad.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 298px;" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/SrJfzUIuoZI/AAAAAAAAABE/T_0MaODuSCw/s320/sklad.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5382469839844450706" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8033530739794836093?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8033530739794836093/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_17.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8033530739794836093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8033530739794836093'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_17.html' title='Складской учет'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SrJfzUIuoZI/AAAAAAAAABE/T_0MaODuSCw/s72-c/sklad.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-3015172668706611506</id><published>2009-09-17T07:19:00.000+06:00</published><updated>2009-09-17T07:22:55.535+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Гради Буч'/><category scheme='http://www.blogger.com/atom/ns#' term='С++'/><category scheme='http://www.blogger.com/atom/ns#' term='ООП'/><title type='text'>Чтение Гради Буча</title><content type='html'>Продолжаем &lt;a href="http://qtcoder.blogspot.com/2009/09/blog-post_14.html"&gt;читать Гради Буча&lt;/a&gt;. Пока чтение трудностей не вызывает, скорее наоборот - похоже на легкое развлекательное чтиво )). Впрочем я пока не ушел дальше первых двух глав, осиленных и раньше.&lt;br /&gt;&lt;br /&gt;Единственное отличие от моей системы мировоззрения - это называние (или перевод такой) композиции агрегацией. Резануло глаз.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-3015172668706611506?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/3015172668706611506/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_16.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3015172668706611506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/3015172668706611506'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_16.html' title='Чтение Гради Буча'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-6477043122790160983</id><published>2009-09-16T16:52:00.000+06:00</published><updated>2009-09-16T17:03:19.178+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='Trolltech'/><category scheme='http://www.blogger.com/atom/ns#' term='кругом маразм'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt Software'/><title type='text'>pro файлы против vcproj</title><content type='html'>Есть два метода создания нового проекта под Qt.&lt;br /&gt;Один мой, другой неправильный. Тот что мой, на самом деле, общеупотребителен.&lt;br /&gt;Новый проект начинается написания pro-файла. В нем описываются все исходники, зависимости, используемые библиотеки и т.п.&lt;br /&gt;Полученный файл легко преобразуется в Makefile под nix системы или в vcproj для Visual Studio под виндой.&lt;br /&gt;&lt;br /&gt;Теперь о неправильном методе. Непонятно с какого перепугу у нас на работе повсеместно используют непосредственно студию для создания нового проекта. Создают в ней новый проект и потом давай лазить по опциям проекта и выставлять всякие вещи.&lt;br /&gt;Этот метод надо запретить под страхом смертной казни, потому что:&lt;br /&gt;а) лазание по опциям проекта утомительно и гиморно&lt;br /&gt;б) проект непереносим - на вопрос что делать если надо перенести под nix коллеги отвечают: а) написать вручную Makefile, б) написать конвертер из vcproj в pro-файл&lt;br /&gt;&lt;br /&gt;На мой вопрос зачем такой гимор, когда надо всего лишь посмотреть на создание проекта с другого конца, пожимают плечами. Вот что значит зашоренность и привычка к студии. Qt Software(она же Trolltech, она же Nokia) создала замечательный инструмент qmake, который игнорируется некоторыми несознательными личностями.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-6477043122790160983?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/6477043122790160983/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/pro-vcproj.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6477043122790160983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/6477043122790160983'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/pro-vcproj.html' title='pro файлы против vcproj'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8697002131839147076</id><published>2009-09-15T23:18:00.001+06:00</published><updated>2009-09-15T23:25:06.215+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Basic 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='маразм'/><title type='text'>Подработка Visual Basic 2005</title><content type='html'>Озадачился калымом. Нужно написать программу складского учета на Visual Basic 2005 для студентки некого местного университета.&lt;br /&gt;Бэйсик изучал давно и причем 6-ю версию. После С++ и Qt пишется крайне туго. Но, по крайней мере, осваиваю новое.&lt;br /&gt;Для программы складского учета я уже нашел логотип ака банер.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/Sq_NjAQcFWI/AAAAAAAAAA0/02968gSwagw/s1600-h/sklad_ph.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 100px;" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/Sq_NjAQcFWI/AAAAAAAAAA0/02968gSwagw/s320/sklad_ph.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5381746080979096930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Был еще вариант, но я его забраковал&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_ZsKM8U6wXHU/Sq_NzorVrCI/AAAAAAAAAA8/mtPuBvQ4JUg/s1600-h/1_12.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 109px;" src="http://1.bp.blogspot.com/_ZsKM8U6wXHU/Sq_NzorVrCI/AAAAAAAAAA8/mtPuBvQ4JUg/s320/1_12.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381746366707248162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Слишком уж брутально и похоже на реальность.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8697002131839147076?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8697002131839147076/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/visual-basic-2005.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8697002131839147076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8697002131839147076'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/visual-basic-2005.html' title='Подработка Visual Basic 2005'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZsKM8U6wXHU/Sq_NjAQcFWI/AAAAAAAAAA0/02968gSwagw/s72-c/sklad_ph.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-2465582808685507808</id><published>2009-09-14T21:26:00.000+06:00</published><updated>2009-09-14T21:32:53.371+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Гради Буч'/><category scheme='http://www.blogger.com/atom/ns#' term='маразм крепчал'/><category scheme='http://www.blogger.com/atom/ns#' term='С++'/><category scheme='http://www.blogger.com/atom/ns#' term='ООП'/><title type='text'>Гради Буч</title><content type='html'>Откопал на балконе книгу Гради Буча про Объектно-ориентированное проектирование программ на С++.&lt;br /&gt;Когда то давно она мне попалась еще во время студенчества. Тогда в ней было много непонятного, посему книжка не пошла дальше пары глав и была заброшена на балкон. Теперь по прошествии десятка лет хочу открыть и глянуть заново, может пойдет.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_ZsKM8U6wXHU/Sq5hy1F0zBI/AAAAAAAAAAc/PG1v1s2k920/s1600-h/gradi.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5381346130627185682" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 224px; CURSOR: hand; HEIGHT: 320px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_ZsKM8U6wXHU/Sq5hy1F0zBI/AAAAAAAAAAc/PG1v1s2k920/s320/gradi.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-2465582808685507808?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/2465582808685507808/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_14.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/2465582808685507808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/2465582808685507808'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_14.html' title='Гради Буч'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZsKM8U6wXHU/Sq5hy1F0zBI/AAAAAAAAAAc/PG1v1s2k920/s72-c/gradi.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-1997814713145365280</id><published>2009-09-13T10:08:00.000+06:00</published><updated>2009-09-14T18:08:26.202+06:00</updated><title type='text'>Форма ввода текста</title><content type='html'>Озадачился полностью отрефакторить форму ввода текста, писанную на Qt.&lt;br /&gt;Форма ввода текста - это простая dll-ка, которая по xml-файлу создает полноценный виджет со всеми нужными полями ввода. У формы до кучи самописных компонентов, которые все так или иначе регулируются своими свойствами.&lt;br /&gt;&lt;br /&gt;Итак, рефакторинг я начну с постановки технического задания, раз уж ранее не додумался до этого.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;ТЗ&lt;/span&gt;&lt;br /&gt;&lt;div style="background: gainsboro none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;   &lt;p style="margin-bottom: 0cm;"&gt;Есть набор компонентов, как родных Qt так и расширенных. Все они так или иначе отображают данные и позволяют их править. Методы установки и получения данных в компоненты различаются названиями. Например setDate, setValue, setText, setData и т.п.&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Компоненты должны уметь: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;изменять регистр  отображаемых данных&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;взаимодействовать  друг с другом, т.е. данные введенные в  один компонент могут влиять на данные  в других компонентах. Например, выбор  пола влияет на список фамилий. Выбор  даты влияет на блокировку поля возраст.  Выбор из выпадающего списка влияет на  видимость других полей, и т.п.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;отображать свою  обязательность для ввода&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;принять и отдать  данные неким единым методом  SetValue/GetValue.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Для каждого компонента есть надпись. Надпись может располагаться с любой из 4-х сторон от компонента и может быть развернута на n градусов.&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Совокупность компонента и надписи дает т.н. экранный элемент (ЭЭ).&lt;/p&gt;   &lt;p style="margin-bottom: 0cm;"&gt;ЭЭ на форме могут располагаться:&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;а) ленточно&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;б) в табличном виде&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;в) частично в ленточном, частично в табличном виде&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;По ходу рефакторинга ТЗ планируется уточнять.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-1997814713145365280?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/1997814713145365280/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_12.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1997814713145365280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/1997814713145365280'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post_12.html' title='Форма ввода текста'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8817506476172057693</id><published>2009-09-13T09:06:00.000+06:00</published><updated>2009-09-13T09:16:06.414+06:00</updated><title type='text'>Вид с Лысой горы</title><content type='html'>Неделю назад поднимались с друзьями на Лысую гору.&lt;br /&gt;Оттуда прекрасный вид на наш городок и окрестности.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZsKM8U6wXHU/Sqxj4hfpeHI/AAAAAAAAAAU/zG5hrGVLT8c/s1600-h/img_3296.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZsKM8U6wXHU/Sqxj4hfpeHI/AAAAAAAAAAU/zG5hrGVLT8c/s320/img_3296.jpg" alt="" id="BLOGGER_PHOTO_ID_5380785477515835506" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8817506476172057693?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8817506476172057693/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8817506476172057693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8817506476172057693'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/blog-post.html' title='Вид с Лысой горы'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZsKM8U6wXHU/Sqxj4hfpeHI/AAAAAAAAAAU/zG5hrGVLT8c/s72-c/img_3296.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-4662069842750041227</id><published>2009-09-12T22:45:00.000+06:00</published><updated>2009-09-12T23:06:08.221+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Heroes of Migth and Magic 2'/><title type='text'>Heroes of Migth and Magic 2</title><content type='html'>В свободное время люблю играть в Героев меча и магии 2. Это как привет из детства. Новые игры типа Сталкера, конечно же приемлю, однако с Героями у меня связаны одни из приятных воспоминаний. В бытность стдентами мы с друзьями рубились в этих героев напропалую день и ночь. Компьютеры тогда были ладно если Пентиум-166, в основном 486-е. Однако Герои были неприхотливы и запускались везде. После этого у меня левое полушарие как-то еще соображает, а вот правое совсем никуда.&lt;br /&gt;&lt;br /&gt;Так вот, теперь, будучи 30 летним мужичиной, играю в Героев от Буки с качественной локализацией и расширенным набором карт. Играю на уровне Эксперт. Это чуть ниже чем уровень Невозможно, но тоже достойно. Рейтинг 160%. И надо сказать, что на этом уровне игра стала открываться совсем другим боком.&lt;br /&gt;&lt;br /&gt;Победить стало крайне сложно, промчаться по материку этаким татаро-монгольким игом больше не получается. Противник стал умен, использует все свои возможности, активно пользуется Телепортацией, угнаться за ним одним героем просто нереально.&lt;br /&gt;&lt;br /&gt;Пару раз я пытался загнать его методично захватывая замки, однако продвигаясь вдоль материка я их так же методически терял из-за упомянутого использования противником Телепортацией. Оставление защиты в замке не помогало, враг был силен и брал своими умениями. Средние характеристики вражеских героев были:&lt;br /&gt;Атака - 19&lt;br /&gt;Защита - 15&lt;br /&gt;Сила магии - 13&lt;br /&gt;Маны - 10&lt;br /&gt;&lt;br /&gt;У меня же был герой с характеристиками по всем параметрам за 20, но он был один, а новые герои с нулевыми показателями были не в состоянии противостоять вражеским героям.&lt;br /&gt;Однако, резво уничтожая вражеских героев, я вдруг обратил внимание, что через некоторое время они снова появляются на карте. Это значит, что они не умирали навсегда и их можно было покупать в замках через некоторое время.&lt;br /&gt;&lt;br /&gt;Я тут же задумался - не могу ли я их купить? Проверка не замедлила себя ждать. Я стал покупать и тут же увольнять героев в замках. И что вы думаете? Где то на 5-й итерации я вдруг увидел доступным для покупки вражеского героя, убитого мною буквально вчера.&lt;br /&gt;Я тут же укомплектовал свою армию крутыми героями, из бывших вражеских, собрал для них армию и повел ее в наступление по всем фронтам.&lt;br /&gt;В итоге победа была за нами и безо всякого читерства.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-4662069842750041227?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/4662069842750041227/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/heroes-of-migth-and-magic-2.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4662069842750041227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/4662069842750041227'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/heroes-of-migth-and-magic-2.html' title='Heroes of Migth and Magic 2'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2022495993688215761.post-8580087608252133231</id><published>2009-09-12T22:18:00.000+06:00</published><updated>2009-09-12T22:39:19.849+06:00</updated><title type='text'>Доктор Браун, Марти, 80 долларов</title><content type='html'>В третьей части трилогии "Назад в будущее" Марти узнает, что доктор Браун, он же Док, будет убит в спину в 1885 году из-за 80 долларов.&lt;br /&gt;Их обоих, Марти и Дока, это известие из прошлого повергает в шок, и Марти отправляется на выручку, застрявшему в 19 веке Доку.&lt;br /&gt;Обратим внимание, что по тем временам (1885 года) 80 долларов далеко не маленькая сумма. Например, избирательная компания Джорджа Вашингтона составляла 100 долларов и эта сумма была непосильна для бедняка. Хороший конь тогда стоил 5 долларов, корова - 3. Вот и прикидывайте, сколько это будет по нынешнему курсу.&lt;br /&gt;В фильме явно не говорится, зачем Доку понадобилась такая сумма, но мы вполне можем догадаться, что на открытие кузницы и закупку всяческого оборудования. Возможно, Доку было необходимо обрудование для ремонта машины времени. Так или иначе, он занял 80 баксов у Бифа Танена Бешеного Пса. Почему он не пошел в банк, мы тоже понимаем. Человеку прибывшему из будущего, без документов, гораздо проще занять денег у бандита под открытие кузницы, чем у банка, которому он вряд ли смог объяснить, кто он и откуда взялся.&lt;br /&gt;Биф дал ему денег, расчитывая, что кузница быстро окупит эти деньги, однако Док был отличный ученый, но никудышный делец. Подковы, которыми он подковал коня Танена были настолько плохи, что конь сломал ногу и его пришлось пристрелить. Понятно, что у такого дельца клиентов быть не могло, что мы и видим в фильме. В кузницу никто не заходит, Док копошится в одиночестве со своими гениальными идеями, Танен постепенно звереет и понимает, что деньги вброшены в никуда.&lt;br /&gt;Вот такова подоплека убийства Дока в 1885 году.&lt;br /&gt;&lt;br /&gt;Однако ни Марти, ни Док в 1955 году совершенно этого не понимают.  Они считают, что убийство произошло исключительно по наезду Танена, так сказать по беспределу. Сумма в 80 долларов им кажется смехотворной, для них это как убийство за пачку сигарет. Им и не приходит в голову, что Танен вполне нормальный бизнесмен того времени, браток, так сказать, российских 90-х, и спускать крупную сумму не собирается.&lt;br /&gt;Если бы Марти и Док из 1955 года понимали это, они бы достали те самые 80 долларов образца 1885 года и Марти, отправившись в прошлое, проспонсировал бы Дока, чтобы тот расчитался с Бешеным Псом.&lt;br /&gt;Тем не менее этого не происходит и мы имеем то, что имеем. Марти, отправляясь в прошлое, не только не решает проблем, но и значительно увеличивает их число.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2022495993688215761-8580087608252133231?l=qtcoder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qtcoder.blogspot.com/feeds/8580087608252133231/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://qtcoder.blogspot.com/2009/09/80.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8580087608252133231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2022495993688215761/posts/default/8580087608252133231'/><link rel='alternate' type='text/html' href='http://qtcoder.blogspot.com/2009/09/80.html' title='Доктор Браун, Марти, 80 долларов'/><author><name>Cyril Kissel</name><uri>http://www.blogger.com/profile/12700924076588097659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_ZsKM8U6wXHU/SvZg5uaBCLI/AAAAAAAAAEo/jP1qW9kV6Xo/S220/1.bmp'/></author><thr:total>0</thr:total></entry></feed>
