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

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF106:Qt4&amp;diff=8494&amp;oldid=prev</id>
		<title>Yaleks в 17:28, 22 августа 2009</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF106:Qt4&amp;diff=8494&amp;oldid=prev"/>
				<updated>2009-08-22T17:28:42Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 17:28, 22 августа 2009&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 39:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 39:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Желая убедиться, что система работает, можно просто дописать в программу две строки:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Желая убедиться, что система работает, можно просто дописать в программу две строки:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; engine = new QScriptEngine();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; engine = new QScriptEngine();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; qint32 result = engine-&amp;gt;evaluate(“2 + 2”).toInt32();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; qint32 result = engine-&amp;gt;evaluate(“2 + 2”).toInt32();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 66:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 66:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;так, например, можно вывести на консоль ругательное сообщение:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;так, например, можно вывести на консоль ругательное сообщение:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue result = engine-&amp;gt;evaluate(script);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue result = engine-&amp;gt;evaluate(script);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; if (result.isError())&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; if (result.isError())&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 91:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 91:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;конструктора):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;конструктора):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue objectWnd = engine-&amp;gt;newQObject(this);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue objectWnd = engine-&amp;gt;newQObject(this);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; engine-&amp;gt;globalObject().setProperty(“MainWindow”, objectWnd);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; engine-&amp;gt;globalObject().setProperty(“MainWindow”, objectWnd);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 117:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 117:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;окно программы-часов.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;окно программы-часов.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; class Clock : public QDialog, public Ui::MainForm&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; class Clock : public QDialog, public Ui::MainForm&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 148:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 148:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Теперь, когда мы знаем, как передать объект, рассмотрим простейший сценарий (программа ''Cloc''k читает его из файла '''clock.config'''):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Теперь, когда мы знаем, как передать объект, рассмотрим простейший сценарий (программа ''Cloc''k читает его из файла '''clock.config'''):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; MainWindow.timeFormat = “hh:mm:ss”;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; MainWindow.timeFormat = “hh:mm:ss”;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; MainWindow.dateFormat = “MM/dd/yy (dddd)”;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; MainWindow.dateFormat = “MM/dd/yy (dddd)”;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 183:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 183:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;строчки в самой программе):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;строчки в самой программе):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; MainWindow.dateLabel.hide();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; MainWindow.dateLabel.hide();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; MainWindow.dateText.hide();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; MainWindow.dateText.hide();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 212:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 212:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Например, вызов:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Например, вызов:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue objectWnd = engine-&amp;gt;newQObject(this,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue objectWnd = engine-&amp;gt;newQObject(this,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptEngine::QtOwnership, QScriptEngine::ExcludeSuperClassMethods |&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptEngine::QtOwnership, QScriptEngine::ExcludeSuperClassMethods |&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 241:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 241:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;фрагмент:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;фрагмент:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; function onTimer()&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; function onTimer()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 293:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 293:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;важен процесс, а не результат:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;важен процесс, а не результат:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue toUnicode(QScriptContext *context, QScriptEngine *engine)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue toUnicode(QScriptContext *context, QScriptEngine *engine)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 308:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 308:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;следующее:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;следующее:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue func = engine-&amp;gt;newFunction(toUnicode);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue func = engine-&amp;gt;newFunction(toUnicode);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; engine-&amp;gt;globalObject().setProperty(“toUnicode”, func);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; engine-&amp;gt;globalObject().setProperty(“toUnicode”, func);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 338:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 338:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''clock'' следует объявить функцию&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''clock'' следует объявить функцию&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue newTextInputDialog(QScriptContext *context, QScriptEngine *engine)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; QScriptValue newTextInputDialog(QScriptContext *context, QScriptEngine *engine)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 353:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 353:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;случае '''ToUnicode()'''. Теперь в сценарии можно писать следующее:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;случае '''ToUnicode()'''. Теперь в сценарии можно писать следующее:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;c&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cpp-qt&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; var Dlg = newTextInputDialog();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; var Dlg = newTextInputDialog();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; var Text;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; var Text;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF106:Qt4&amp;diff=7756&amp;oldid=prev</id>
		<title>Yaleks: /* Популярно об автоматизации */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF106:Qt4&amp;diff=7756&amp;oldid=prev"/>
				<updated>2009-05-01T19:23:56Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Популярно об автоматизации&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 19:23, 1 мая 2009&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 3:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 3:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Популярно об автоматизации==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Популярно об автоматизации==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{{Цикл/Qt4}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;: '''ЧАСТЬ 5''' Плюетесь при упоминании о ''VBA''? Зря – скрипты и макросы могут оказаться весьма полезными, особенно когда все необходимое уже под рукой. '''Андрей Боровский''' раскроет перед вами богатства системы ''QtScript''!&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;: '''ЧАСТЬ 5''' Плюетесь при упоминании о ''VBA''? Зря – скрипты и макросы могут оказаться весьма полезными, особенно когда все необходимое уже под рукой. '''Андрей Боровский''' раскроет перед вами богатства системы ''QtScript''!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF106:Qt4&amp;diff=7616&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF106:Qt4&amp;diff=7616&amp;oldid=prev"/>
				<updated>2009-04-15T11:18:54Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''Программирование в стиле ''Qt''''' Осваиваем технологии, лежащие в основе нашумевшего KDE4&lt;br /&gt;
[[Категория:Учебники]]&lt;br /&gt;
&lt;br /&gt;
==Популярно об автоматизации==&lt;br /&gt;
&lt;br /&gt;
: '''ЧАСТЬ 5''' Плюетесь при упоминании о ''VBA''? Зря – скрипты и макросы могут оказаться весьма полезными, особенно когда все необходимое уже под рукой. '''Андрей Боровский''' раскроет перед вами богатства системы ''QtScript''!&lt;br /&gt;
&lt;br /&gt;
Довольно картинок! Сегодня речь пойдет о том, что может порадовать взгляд разве что прожженных программистов и заядлых линуксоидов – о системе скриптов ''Qt 4.3'' (и выше). На протяжении многих лет библиотека ''Qt'' пополнялась различными&lt;br /&gt;
классами, не имеющими прямого отношения к GUI. Сейчас есть даже&lt;br /&gt;
специальная версия ''Qt Console'' для создания неграфических программ. Пользователям открытой редакции ''Qt'' доступны все модули&lt;br /&gt;
''Qt Console'', в том числе, ''QtScript'', пришедший на замену ''Qt Script for Applications'' (QSA) для ''Qt3''.&lt;br /&gt;
&lt;br /&gt;
Изучение системы скриптов похоже на путешествие по неизведанной стране. Нам придется часто останавливаться и сверяться&lt;br /&gt;
с картой – то есть с общими представлениями о том, как работают&lt;br /&gt;
встроенные интерпретируемые языки.&lt;br /&gt;
&lt;br /&gt;
Для чего в приложении могут понадобиться скрипты? Они широко&lt;br /&gt;
используются в офисных пакетах (для автоматизации рутинных задач&lt;br /&gt;
и передачи вирусов), почтовиках (для создания оригинальных заголовков к письмам и передачи вирусов), web-браузерах (для поддержки&lt;br /&gt;
динамических web-страниц и передачи вирусов). Теперь все эти возможности стали доступны и разработчикам открытых ''Qt''-программ.&lt;br /&gt;
&lt;br /&gt;
Мы продемонстрируем работу ''QtScript'' на примере подсистемы&lt;br /&gt;
настройки приложения. Главное преимущество скриптов, по сравнению с обычными конфигурационными файлами, заключается в их&lt;br /&gt;
гибкости. Впрочем, оно превращается в опасность, когда возможности сценариев оказываются слишком широкими (я не случайно трижды упомянул вирусы).&lt;br /&gt;
&lt;br /&gt;
===Ку-ку или не ку-ку?===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF106_86_1.jpg|Рис. 1|300px]]Рис. 1. Часы-будильник – с виду ничего необычного.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
В качестве примера напишем программу-часы (рис. 1), без кукушки,&lt;br /&gt;
но зато с мощной системой настройки. Исходные тексты вы найдете&lt;br /&gt;
на диске в файле '''clock.tar.gz'''.&lt;br /&gt;
&lt;br /&gt;
Модуль '''QtScript''' использует язык '''ECMAScript''', на котором основаны '''JScript''' и '''JavaScript'''. Вдаваться в детали синтаксиса '''ECMAScript''' мы не станем: если вы имели дело с '''JavaScript''', то уже все знаете, остальных же отсылаем к http://doc.trolltech.com. С точки зрения ''Qt''-приложения, центральным элементом системы скриптов является класс '''QScriptEngine''', который инкапсулирует скриптовый движок.&lt;br /&gt;
Чтобы программа поддерживала сценарии, ее необходимо собрать с&lt;br /&gt;
подключением модуля''' QtScript''' и создать хотя бы один объект класса '''QScriptEngine'''. Рабочая лошадка '''QScriptEngine''' – метод '''evaluate()''': именно он выполняет скрипты.&lt;br /&gt;
&lt;br /&gt;
Желая убедиться, что система работает, можно просто дописать в программу две строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 engine = new QScriptEngine();&lt;br /&gt;
 qint32 result = engine-&amp;gt;evaluate(“2 + 2”).toInt32();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В '''pro'''-файл следует добавить директиву&lt;br /&gt;
&lt;br /&gt;
 QT += script&lt;br /&gt;
&lt;br /&gt;
В результате выполнения программы в переменную '''result''' будет записано число 4. Главным аргументом метода '''evaluate()''' (есть и&lt;br /&gt;
другие, со значениями по умолчанию) является строка, содержащая&lt;br /&gt;
тело скрипта.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы оптимально использовать сценарии в вашей программе, необходимо понимать некоторые ключевые особенности&lt;br /&gt;
встроенного скриптового языка. Какими бы широкими возможностями он не обладал, для выполнения полезной работы ему потребуется&lt;br /&gt;
доступ к объектам вашей программы. Каким же образом выполняется передача данных между приложением и скриптом? Вспомним, что&lt;br /&gt;
переменные в интерпретируемых языках ('''ECMAScript''' – не исключение) обычно полиморфны, то есть, например, могут рассматриваться&lt;br /&gt;
и как число, и как строка – в зависимости от контекста. Это обстоятельство играет роль не только при написании сценариев: значение&lt;br /&gt;
любой переменной скрипта '''QtScript''' может быть представлено в виде&lt;br /&gt;
объекта класса '''QScriptValue'''. В зависимости от контекста, вы можете&lt;br /&gt;
привести его к тому или иному простому (составному) типу. Объекты&lt;br /&gt;
'''QScriptValue''' – своего рода посредники между скриптом и приложением. Например, метод '''evaluate()''' возвращает результат выполнения&lt;br /&gt;
сценария как раз в виде объекта '''QScriptValue'''. Он может содержать&lt;br /&gt;
величину простого типа (как в примере выше), сведения об ошибке&lt;br /&gt;
(если таковая произошла) или пустое значение (аналог типа '''void'''). Вот&lt;br /&gt;
так, например, можно вывести на консоль ругательное сообщение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 QScriptValue result = engine-&amp;gt;evaluate(script);&lt;br /&gt;
 if (result.isError())&lt;br /&gt;
              qDebug() &amp;lt;&amp;lt; “Script error:” &amp;lt;&amp;lt; result.toString();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Создай окружение===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Глобальный объект|Содержание= Для тех, кто хочет добраться до сути вещей, приведем более&lt;br /&gt;
строгое объяснение. Язык '''ECMAScript''' является чистым объектно-ориентированным. Иначе говоря, весь код скрипта выполняется&lt;br /&gt;
в контексте некоего глобального объекта. Последний создается&lt;br /&gt;
автоматически движком скрипта и доступен в ''Qt''-приложении&lt;br /&gt;
посредством свойства '''globalObject()''' объекта '''QScriptEngine''' (как&lt;br /&gt;
и все, что связано со скриптами, глобальный объект среды&lt;br /&gt;
представлен в ''Qt''-приложении объектом класса '''QScriptValue''').&lt;br /&gt;
Метод '''setProperty()''' просто создает новое свойство глобального&lt;br /&gt;
объекта.&lt;br /&gt;
|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Таким образом, чтобы передать объект приложения в среду выполнения скрипта, надо предварительно упаковать его в '''QScriptValue''' (а&lt;br /&gt;
также задать имя, под которым объект будет известен сценарию). Для&lt;br /&gt;
потомков '''QObject''' это делается легко. Например, передадим скрипту&lt;br /&gt;
объект, реализующий главное окно нашей программы (это фрагмент&lt;br /&gt;
конструктора):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 QScriptValue objectWnd = engine-&amp;gt;newQObject(this);&lt;br /&gt;
 engine-&amp;gt;globalObject().setProperty(“MainWindow”, objectWnd);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Методу '''newQObject()''' передается указатель на объект, который&lt;br /&gt;
нужно упаковать в '''QScriptValue''' (и другие аргументы со значениями по умолчанию). Во второй строке мы задаем имя объекта&lt;br /&gt;
в среде скрипта и назначаем ему глобальную область видимости.&lt;br /&gt;
В результате наше главное окно будет доступно сценариям как&lt;br /&gt;
'''MainWindow'''.&lt;br /&gt;
&lt;br /&gt;
Передача объекта в среду окружения скрипта предполагает, что&lt;br /&gt;
последний сможет получить доступ к его элементам. Возможно, это&lt;br /&gt;
покажется вам странным, но не все методы переданного объекта&lt;br /&gt;
доступны в контексте скрипта. Причина в том, что сценарий может&lt;br /&gt;
«видеть» только те сущности, описания которых имеются во время&lt;br /&gt;
выполнения программы, а в языке ''C++'' информация о полях и методах объекта доступна лишь на этапе компиляции. У этой проблемы&lt;br /&gt;
существует несколько решений. Самое простое – задействовать сведения о типах времени выполнения (RTTI), предоставляемые ''Qt'': они&lt;br /&gt;
реализованы для классов, производных от '''QObject''', благодаря чему&lt;br /&gt;
вы можете получить информацию о сигналах, слотах и свойствах&lt;br /&gt;
объектов ''Qt'' во время работы программы. Обычные поля и методы&lt;br /&gt;
объектов будут, увы, недоступны. Создавая новый класс, необходимо&lt;br /&gt;
позаботиться о том, чтобы нужные элементы были «видны» скрипту.&lt;br /&gt;
Рассмотрим объявление класса '''Clock''', который реализует главное&lt;br /&gt;
окно программы-часов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 class Clock : public QDialog, public Ui::MainForm&lt;br /&gt;
 {&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
 public:&lt;br /&gt;
            Clock(QWidget *parent = 0);&lt;br /&gt;
            virtual ~Clock();&lt;br /&gt;
            Q_PROPERTY(QString timeFormat READ getTimeFormat&lt;br /&gt;
 WRITE setTimeFormat)&lt;br /&gt;
            Q_PROPERTY(QString dateFormat READ getDateFormat WRITE&lt;br /&gt;
 setDateFormat)&lt;br /&gt;
            Q_PROPERTY(QString currentTime READ getCurrentTime)&lt;br /&gt;
 protected slots:&lt;br /&gt;
            void onTimeout();&lt;br /&gt;
            void execute(const QString &amp;amp; command);&lt;br /&gt;
 private:&lt;br /&gt;
            ...&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь перечислены три свойства: '''timeFormat, dateFormat''' и '''currentTime'''. Первые два устанавливают формат отображения даты&lt;br /&gt;
и времени на наших часах. Свойство '''currentTime''', доступное только&lt;br /&gt;
для чтения, содержит текущее значение времени. Обратите внимание&lt;br /&gt;
на слот '''execute()''' – он выполняет команду Linux, переданную в качестве параметра.&lt;br /&gt;
&lt;br /&gt;
Второй способ сделать метод объекта видимым в скрипте – использовать в его объявлении макрос '''Q_INVOKABLE''':&lt;br /&gt;
&lt;br /&gt;
 Q_INVOKABLE void visibleMethod ();&lt;br /&gt;
&lt;br /&gt;
Теперь, когда мы знаем, как передать объект, рассмотрим простейший сценарий (программа ''Cloc''k читает его из файла '''clock.config'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 MainWindow.timeFormat = “hh:mm:ss”;&lt;br /&gt;
 MainWindow.dateFormat = “MM/dd/yy (dddd)”;&lt;br /&gt;
 MainWindow.windowTitle = “Configurable Clock”;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первые две строки не должны вызывать вопросов. Мы используем&lt;br /&gt;
определенные нами свойства '''timeFormat''' и '''dateFormat''' для задания&lt;br /&gt;
форматов даты и времени с помощью принятых в ''Qt'' символов-спецификаторов. Но взгляните на последнюю строку – мы не определяли свойство '''windowTitle'''! Оно является унаследованным, и мы&lt;br /&gt;
получили дополнительную возможность настройки, о которой даже&lt;br /&gt;
не думали. Как уже отмечалось выше, свобода, которую предоставляют скрипты, несет в себе потенциальный риск. Если добавить в&lt;br /&gt;
сценарий строку&lt;br /&gt;
&lt;br /&gt;
 MainWindow.close();&lt;br /&gt;
&lt;br /&gt;
«конфигурационный файл» завершит работу всей программы. Метод&lt;br /&gt;
'''close()''' класса '''Clock''' является слотом, а значит, будет доступен из&lt;br /&gt;
скрипта как метод объекта '''MainWindow'''.&lt;br /&gt;
&lt;br /&gt;
Но и это еще не все. Посмотрите на следующую конструкцию:&lt;br /&gt;
&lt;br /&gt;
 MainWindow.dateText.text = “Date:”;&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF106_87_1.jpg|Рис. 3|300px]]Рис.2. Сценарий может изменить внешний вид программы до неузнаваемости. Этого ли вы хотели?|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Что есть свойство '''dateText''' объекта '''MainWindow'''? Имя '''dateText''' в&lt;br /&gt;
нашей программе присвоено объекту '''QLabel''', который выводит&lt;br /&gt;
пояснение к строке с текущей датой (под именем здесь понимается не идентификатор переменной-указателя, а значение свойства&lt;br /&gt;
'''objectName()''') В приведенной выше строке мы присваиваем новое&lt;br /&gt;
значение свойству '''text''' объекта '''dateText'''. Таким путем можно полностью перекроить интерфейс программы (рис.2).&lt;br /&gt;
&lt;br /&gt;
Фрагмент скрипта, реализующий такое эффектное превращение,&lt;br /&gt;
выглядит так (еще раз обращу ваше внимание – мы не изменили ни&lt;br /&gt;
строчки в самой программе):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 MainWindow.dateLabel.hide();&lt;br /&gt;
 MainWindow.dateText.hide();&lt;br /&gt;
 MainWindow.setStyleSheet(“QDialog { background: yellow }”);&lt;br /&gt;
 MainWindow.timeLabel.setStyleSheet(“QLabel {border: 2px solid green;}”);&lt;br /&gt;
 MainWindow.timeText.setStyleSheet(“QLabel {border: 2px solid red;}”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью слота '''hide()''' мы убираем все, что связано с отображением даты. Далее, при помощи слота '''setStyleSheet()''' устанавливаются&lt;br /&gt;
цвета и внешний вид элементов окна (при этом используются механизм таблиц стилей – '''style sheets''').&lt;br /&gt;
&lt;br /&gt;
Иными словами, скрипт может получить доступ не только ко всем&lt;br /&gt;
свойствам, сигналам и слотам переданного ему объекта, но и ко всем&lt;br /&gt;
его поименованным дочерним объектам. Иногда это бывает полезно,&lt;br /&gt;
иногда – не очень. Например, если программа открывает диалоговое&lt;br /&gt;
окно, а скрипт имеет доступ к соответствующему объекту, он может&lt;br /&gt;
«щелкнуть» по кнопке (вызвав сигнал '''clicked()''') вместо пользователя.&lt;br /&gt;
Итоговый вывод: для взаимодействия со скриптом лучше создавать&lt;br /&gt;
специальный объект, предоставляющий только те свойства, сигналы&lt;br /&gt;
и слоты, которые необходимы для целей автоматизации.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая помощь|Содержание=Когда речь идет о свойствах в контексте ''Qt'', мы ставим скобки после имени (например,&lt;br /&gt;
'''objectName()'''), что соответствует синтаксису ''Qt''. Когда же мы говорим о свойствах в контексте скрипта, их имена пишутся без конечных&lt;br /&gt;
скобок.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Доступ скрипта к элементам объекта можно ограничить и&lt;br /&gt;
по-другому – посредством третьего аргумента метода '''newQObject()'''.&lt;br /&gt;
Например, вызов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 QScriptValue objectWnd = engine-&amp;gt;newQObject(this,&lt;br /&gt;
 QScriptEngine::QtOwnership, QScriptEngine::ExcludeSuperClassMethods |&lt;br /&gt;
 QScriptEngine::ExcludeSuperClassProperties);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
приведет к тому, что скрипт не сможет обращаться к свойствам и&lt;br /&gt;
методам, определенным в классах-предках передаваемого объекта.&lt;br /&gt;
Тогда&lt;br /&gt;
&lt;br /&gt;
 MainWindow.close();&lt;br /&gt;
&lt;br /&gt;
приведет к сообщению об ошибке&lt;br /&gt;
&lt;br /&gt;
 ReferenceError: close is not defined&lt;br /&gt;
&lt;br /&gt;
Добавление в третий аргумент константы '''QScriptEngine::ExcludeChildObjects''' запрещает доступ к дочерним объектам.&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;
качестве обработчика сигнала объекта ''Qt''. Взгляните на следующий&lt;br /&gt;
фрагмент:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 function onTimer()&lt;br /&gt;
 {&lt;br /&gt;
            if (MainWindow.currentTime == “00:00:00”)&lt;br /&gt;
                        MainWindow.execute(“konsole”);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция '''onTimer()''' должна стать обработчиком сигнала '''timeout()''',&lt;br /&gt;
который периодически генерируется объектом-таймером в нашей&lt;br /&gt;
программе. Она проверяет текущее значение времени (свойство '''currentTime''') и ровно в полночь запускает программу '''konsole''' с помощью слота '''execute()'''. После того, как функция-обработчик будет объявлена, ее следует связать с сигналом таймера:&lt;br /&gt;
&lt;br /&gt;
 MainWindow.timer.timeout.connect(onTimer);&lt;br /&gt;
&lt;br /&gt;
'''timer''' – это имя объекта-таймера в ''Qt''-приложении. Сигнал&lt;br /&gt;
'''timeout()''' объекта '''timer''' представляется в скрипте как свойство-объект, у которого есть методы '''connect()''' и '''disconnect()'''. Первый&lt;br /&gt;
выполняет связывание обработчика и сигнала, второй – разрывает&lt;br /&gt;
эту связь. Необходимо понимать разницу между обращениями&lt;br /&gt;
&lt;br /&gt;
 MainWindow.timer.timeout()&lt;br /&gt;
&lt;br /&gt;
и&lt;br /&gt;
&lt;br /&gt;
 MainWindow.timer.timeout&lt;br /&gt;
&lt;br /&gt;
В первом случае мы вызываем сигнал '''timeout()''' таймера, что приводит к вызову связанных с ним слотов. Во втором – получаем доступ&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;
вызывается (что вполне логично) и после выхода из метода '''evaluate()'''.&lt;br /&gt;
Но здесь возникает еще один интересный вопрос – а сколько времени существует скрипт? Ответ на него вполне логичен – столько же,&lt;br /&gt;
сколько существует его контекст, в том числе, глобальный объект. По&lt;br /&gt;
умолчанию время жизни контекста скрипта совпадает со временем&lt;br /&gt;
существования объекта '''QScriptEngine'''.&lt;br /&gt;
&lt;br /&gt;
===В обратную сторону===&lt;br /&gt;
&lt;br /&gt;
''Qt''-приложение может передавать в контекст скрипта ссылки не только на объекты, но и на функции, не являющиеся методами. Для этого&lt;br /&gt;
необходимо выполнить те же самые действия: упаковать указатель на&lt;br /&gt;
функцию в объект '''QScriptValue''' и назначить ей имя и область видимости в контексте скрипта. Но с точки зрения сценария и приложения,&lt;br /&gt;
одна и та же функция выглядит по-разному. В скрипте у нее нет прототипа, так что она может принять любое число аргументов; в программе же нужно обработать два параметра: указатели на объекты&lt;br /&gt;
'''QScriptContext''' и '''QscriptEngine'''.&lt;br /&gt;
&lt;br /&gt;
В качестве примера напишем функцию '''toUnicode()''', преобразующую текст из кодировки скрипта в UTF-16, которой пользуется ''Qt''. То&lt;br /&gt;
же самое можно сделать, используя язык '''ECMAScript''', но для нас&lt;br /&gt;
важен процесс, а не результат:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 QScriptValue toUnicode(QScriptContext *context, QScriptEngine *engine)&lt;br /&gt;
 {&lt;br /&gt;
           QString s = context-&amp;gt;argument(0).toString();&lt;br /&gt;
           return QScriptValue(engine, QString::fromUtf8(s.toAscii().&lt;br /&gt;
 data()));&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кода сценарий вызовет нашу функцию, все переданные ей аргументы будут сохранены в специальной коллекции объекта '''context''' (их&lt;br /&gt;
общее число есть '''context.argumentCount()'''). Все аргументы, равно как&lt;br /&gt;
и возвращаемое значение, являются, естественно, '''QScriptValue'''. Для&lt;br /&gt;
присвоения функции имени в контексте скрипта нужно проделать&lt;br /&gt;
следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 QScriptValue func = engine-&amp;gt;newFunction(toUnicode);&lt;br /&gt;
 engine-&amp;gt;globalObject().setProperty(“toUnicode”, func);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод '''newFunction()''' класса '''QScriptEngine''' создает объект&lt;br /&gt;
'''QScriptValue''', содержащий указатель на функцию. Вторая строка&lt;br /&gt;
нам уже знакома – это задние свойства глобального объекта скрипта. Теперь мы можем использовать в скрипте функцию '''toUnicode()''',&lt;br /&gt;
например:&lt;br /&gt;
&lt;br /&gt;
 MainWindow.windowTitle = toUnicode(“Часы с настройкой”);&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;
{{Врезка|Содержание=[[Изображение:LXF106_89_1.jpg|Рис. 3|300px]]Рис.3. Наши часы окончательно обнаглели – может быть, во всем виноват вирус?|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Скрипты ''Qt'' могут не только пользоваться объектами, предоставленными им приложением, но и создавать свои собственные. Это&lt;br /&gt;
можно делать на основании хранимых в сценариях описаний типов,&lt;br /&gt;
но мы пойдем более простым путем – переложим ношу на плечи&lt;br /&gt;
''Qt''. В нашем демонстрационном приложении ''Clock'' определен класс&lt;br /&gt;
'''TextInputDialog''', который создает диалоговое окно со строкой для&lt;br /&gt;
ввода текста, пояснением к ней и кнопками OK и Отмена. Его можно&lt;br /&gt;
использовать в настроечных скриптах программы ''clock'' для запроса данных у пользователя (рис.3). Чтобы сценарий мог создать объект класса '''TextInputDialog''' тогда, когда ему это нужно, в приложении&lt;br /&gt;
''clock'' следует объявить функцию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 QScriptValue newTextInputDialog(QScriptContext *context, QScriptEngine *engine)&lt;br /&gt;
 {&lt;br /&gt;
            return engine-&amp;gt;newQObject(new TextInputDialog(), QScriptEngine::ScriptOwnership);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Список параметров стандартный. В теле функции мы создаем '''QScriptValue''', инкапсулирующий объект класса '''TextInputDialog'''.&lt;br /&gt;
Он и возвращается в качестве результата функции. Обратите внимание на второй аргумент метода '''newQObject()'''. Константа&lt;br /&gt;
'''QScriptEngine::ScriptOwnership''' указывает, что создаваемый объект&lt;br /&gt;
должен принадлежать скрипту (еще один важный момент: объект, создаваемый специально для сценария, не должен иметь родительского&lt;br /&gt;
объекта в приложении, то есть '''parent()''' должно равняться '''NULL'''). Мы&lt;br /&gt;
делам функцию '''newTextInputDialog()''' доступной скрипту так же, как и в&lt;br /&gt;
случае '''ToUnicode()'''. Теперь в сценарии можно писать следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 var Dlg = newTextInputDialog();&lt;br /&gt;
 var Text;&lt;br /&gt;
 function onAccept()&lt;br /&gt;
 {&lt;br /&gt;
            Text = Dlg.lineEdit.text;&lt;br /&gt;
            print(Text);&lt;br /&gt;
 }&lt;br /&gt;
 Dlg.accepted.connect(onAccept);&lt;br /&gt;
 Dlg.modal = true;&lt;br /&gt;
 Dlg.show();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь создается объект '''TextInputDialog''', ссылка на который сохраняется&lt;br /&gt;
в переменной '''Dlg''' (поскольку адресное пространство приложения скрипту недоступно, уместно говорить именно о ссылках, а не об указателях).&lt;br /&gt;
Сигнал '''accepted()''' диалогового окна (генерируемый при щелчке на '''OK''')&lt;br /&gt;
связывается с обработчиком '''onAccept'''. В нем мы считываем строку, введенную пользователем (свойство '''text''' объекта '''lineEdit'''), и распечатываем ее в окне консоли с помощью встроенной функции '''print()'''.&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;
Жаль, что его нельзя применить в реальном мире... '''LXF'''&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>