Repository: pyside/PySide Branch: master Commit: bcf6058e9d0e Files: 1426 Total size: 3.5 MB Directory structure: gitextract_hxqowekr/ ├── .gitattributes ├── .gitignore ├── CMakeLists.txt ├── COPYING ├── PySide/ │ ├── CMakeLists.txt │ ├── QtCore/ │ │ ├── CMakeLists.txt │ │ ├── glue/ │ │ │ ├── qbytearray_bufferprotocol.cpp │ │ │ ├── qcoreapplication_init.cpp │ │ │ ├── qeasingcurve_glue.cpp │ │ │ ├── qeasingcurve_glue.h │ │ │ ├── qobject_connect.cpp │ │ │ └── qobject_findchild.cpp │ │ ├── typesystem_core.xml.in │ │ ├── typesystem_core_common.xml │ │ ├── typesystem_core_mac.xml │ │ ├── typesystem_core_maemo.xml │ │ ├── typesystem_core_win.xml │ │ └── typesystem_core_x11.xml │ ├── QtDeclarative/ │ │ ├── CMakeLists.txt │ │ ├── pysideqmlregistertype.cpp │ │ ├── pysideqmlregistertype.h │ │ └── typesystem_declarative.xml │ ├── QtGui/ │ │ ├── CMakeLists.txt │ │ ├── glue/ │ │ │ ├── qapplication_init.cpp │ │ │ ├── qlayout_help_functions.cpp │ │ │ ├── qmenu_glue.cpp │ │ │ ├── qmenubar_glue.cpp │ │ │ ├── qtgui_qapp.cpp │ │ │ └── qwidget_glue.cpp │ │ ├── typesystem_gui.xml.in │ │ ├── typesystem_gui_common.xml │ │ ├── typesystem_gui_mac.xml │ │ ├── typesystem_gui_maemo.xml │ │ ├── typesystem_gui_simulator.xml │ │ ├── typesystem_gui_win.xml │ │ └── typesystem_gui_x11.xml │ ├── QtHelp/ │ │ ├── CMakeLists.txt │ │ └── typesystem_help.xml │ ├── QtMaemo5/ │ │ ├── CMakeLists.txt │ │ └── typesystem_maemo5.xml │ ├── QtMultimedia/ │ │ ├── CMakeLists.txt │ │ └── typesystem_multimedia.xml │ ├── QtNetwork/ │ │ ├── CMakeLists.txt │ │ └── typesystem_network.xml │ ├── QtOpenGL/ │ │ ├── CMakeLists.txt │ │ └── typesystem_opengl.xml │ ├── QtScript/ │ │ ├── CMakeLists.txt │ │ └── typesystem_script.xml │ ├── QtScriptTools/ │ │ ├── CMakeLists.txt │ │ └── typesystem_scripttools.xml │ ├── QtSql/ │ │ ├── CMakeLists.txt │ │ └── typesystem_sql.xml │ ├── QtSvg/ │ │ ├── CMakeLists.txt │ │ └── typesystem_svg.xml │ ├── QtTest/ │ │ ├── CMakeLists.txt │ │ └── typesystem_test.xml │ ├── QtUiTools/ │ │ ├── CMakeLists.txt │ │ ├── glue/ │ │ │ ├── plugins.h │ │ │ └── uitools_loadui.cpp │ │ └── typesystem_uitools.xml │ ├── QtWebKit/ │ │ ├── CMakeLists.txt │ │ ├── typesystem_webkit.xml │ │ └── typesystem_webkit_simulator.xml │ ├── QtXml/ │ │ ├── CMakeLists.txt │ │ └── typesystem_xml.xml │ ├── QtXmlPatterns/ │ │ ├── CMakeLists.txt │ │ └── typesystem_xmlpatterns.xml │ ├── __init__.py.in │ ├── _utils.py.in │ ├── global.h.in │ ├── licensecomment.txt │ ├── phonon/ │ │ ├── CMakeLists.txt │ │ ├── pyside_phonon.h │ │ └── typesystem_phonon.xml │ ├── pysideqtesttouch.h │ ├── pysidewtypes.h │ ├── qpytextobject.cpp │ ├── qpytextobject.h │ └── typesystem_templates.xml ├── cmake/ │ └── Macros/ │ ├── FindQt4Extra.cmake │ ├── PySideModules.cmake │ └── icecc.cmake ├── cmake_uninstall.cmake ├── doc/ │ ├── CMakeLists.txt │ ├── _templates/ │ │ ├── index.html │ │ └── layout.html │ ├── _themes/ │ │ └── pysidedocs/ │ │ ├── domainindex.html │ │ ├── searchbox.html │ │ ├── static/ │ │ │ └── pysidedocs.css │ │ └── theme.conf │ ├── codesnippets/ │ │ ├── doc/ │ │ │ └── src/ │ │ │ └── snippets/ │ │ │ ├── accessibilityfactorysnippet.cpp │ │ │ ├── accessibilitypluginsnippet.cpp │ │ │ ├── accessibilityslidersnippet.cpp │ │ │ ├── alphachannel.cpp │ │ │ ├── audio/ │ │ │ │ └── main.cpp │ │ │ ├── audioeffects.cpp │ │ │ ├── brush/ │ │ │ │ ├── brush.cpp │ │ │ │ └── gradientcreationsnippet.cpp │ │ │ ├── brushstyles/ │ │ │ │ ├── main.cpp │ │ │ │ ├── renderarea.cpp │ │ │ │ ├── renderarea.h │ │ │ │ ├── stylewidget.cpp │ │ │ │ └── stylewidget.h │ │ │ ├── buffer/ │ │ │ │ └── buffer.cpp │ │ │ ├── clipboard/ │ │ │ │ ├── clipwindow.cpp │ │ │ │ ├── clipwindow.h │ │ │ │ └── main.cpp │ │ │ ├── code/ │ │ │ │ ├── doc_src_phonon-api.qdoc │ │ │ │ ├── doc_src_qnamespace.qdoc │ │ │ │ ├── src.gui.text.qtextdocumentwriter.cpp │ │ │ │ ├── src.qdbus.qdbuspendingcall.cpp │ │ │ │ ├── src.qdbus.qdbuspendingreply.cpp │ │ │ │ ├── src.scripttools.qscriptenginedebugger.cpp │ │ │ │ ├── src_corelib_codecs_qtextcodec.cpp │ │ │ │ ├── src_corelib_codecs_qtextcodecplugin.cpp │ │ │ │ ├── src_corelib_concurrent_qfuture.cpp │ │ │ │ ├── src_corelib_concurrent_qfuturesynchronizer.cpp │ │ │ │ ├── src_corelib_concurrent_qfuturewatcher.cpp │ │ │ │ ├── src_corelib_concurrent_qtconcurrentexception.cpp │ │ │ │ ├── src_corelib_concurrent_qtconcurrentfilter.cpp │ │ │ │ ├── src_corelib_concurrent_qtconcurrentmap.cpp │ │ │ │ ├── src_corelib_concurrent_qtconcurrentrun.cpp │ │ │ │ ├── src_corelib_concurrent_qthreadpool.cpp │ │ │ │ ├── src_corelib_global_qglobal.cpp │ │ │ │ ├── src_corelib_io_qabstractfileengine.cpp │ │ │ │ ├── src_corelib_io_qdatastream.cpp │ │ │ │ ├── src_corelib_io_qdir.cpp │ │ │ │ ├── src_corelib_io_qdiriterator.cpp │ │ │ │ ├── src_corelib_io_qfile.cpp │ │ │ │ ├── src_corelib_io_qfileinfo.cpp │ │ │ │ ├── src_corelib_io_qiodevice.cpp │ │ │ │ ├── src_corelib_io_qprocess.cpp │ │ │ │ ├── src_corelib_io_qsettings.cpp │ │ │ │ ├── src_corelib_io_qtemporaryfile.cpp │ │ │ │ ├── src_corelib_io_qtextstream.cpp │ │ │ │ ├── src_corelib_io_qurl.cpp │ │ │ │ ├── src_corelib_kernel_qabstracteventdispatcher.cpp │ │ │ │ ├── src_corelib_kernel_qabstractitemmodel.cpp │ │ │ │ ├── src_corelib_kernel_qcoreapplication.cpp │ │ │ │ ├── src_corelib_kernel_qmetaobject.cpp │ │ │ │ ├── src_corelib_kernel_qmetatype.cpp │ │ │ │ ├── src_corelib_kernel_qmimedata.cpp │ │ │ │ ├── src_corelib_kernel_qobject.cpp │ │ │ │ ├── src_corelib_kernel_qsystemsemaphore.cpp │ │ │ │ ├── src_corelib_kernel_qtimer.cpp │ │ │ │ ├── src_corelib_plugin_qlibrary.cpp │ │ │ │ ├── src_corelib_plugin_quuid.cpp │ │ │ │ ├── src_corelib_statemachine_qstatemachine.cpp │ │ │ │ ├── src_corelib_thread_qatomic.cpp │ │ │ │ ├── src_corelib_thread_qmutex.cpp │ │ │ │ ├── src_corelib_thread_qmutexpool.cpp │ │ │ │ ├── src_corelib_thread_qreadwritelock.cpp │ │ │ │ ├── src_corelib_thread_qsemaphore.cpp │ │ │ │ ├── src_corelib_thread_qthread.cpp │ │ │ │ ├── src_corelib_thread_qwaitcondition_unix.cpp │ │ │ │ ├── src_corelib_tools_qbitarray.cpp │ │ │ │ ├── src_corelib_tools_qbytearray.cpp │ │ │ │ ├── src_corelib_tools_qdatetime.cpp │ │ │ │ ├── src_corelib_tools_qhash.cpp │ │ │ │ ├── src_corelib_tools_qlinkedlist.cpp │ │ │ │ ├── src_corelib_tools_qlistdata.cpp │ │ │ │ ├── src_corelib_tools_qlocale.cpp │ │ │ │ ├── src_corelib_tools_qmap.cpp │ │ │ │ ├── src_corelib_tools_qpoint.cpp │ │ │ │ ├── src_corelib_tools_qqueue.cpp │ │ │ │ ├── src_corelib_tools_qrect.cpp │ │ │ │ ├── src_corelib_tools_qregexp.cpp │ │ │ │ ├── src_corelib_tools_qsize.cpp │ │ │ │ ├── src_corelib_tools_qstring.cpp │ │ │ │ ├── src_corelib_tools_qtimeline.cpp │ │ │ │ ├── src_corelib_tools_qvector.cpp │ │ │ │ ├── src_corelib_xml_qxmlstream.cpp │ │ │ │ ├── src_gui_accessible_qaccessible.cpp │ │ │ │ ├── src_gui_dialogs_qabstractprintdialog.cpp │ │ │ │ ├── src_gui_dialogs_qfiledialog.cpp │ │ │ │ ├── src_gui_dialogs_qfontdialog.cpp │ │ │ │ ├── src_gui_dialogs_qmessagebox.cpp │ │ │ │ ├── src_gui_dialogs_qwizard.cpp │ │ │ │ ├── src_gui_effects_qgraphicseffect.cpp │ │ │ │ ├── src_gui_graphicsview_qgraphicsgridlayout.cpp │ │ │ │ ├── src_gui_graphicsview_qgraphicsitem.cpp │ │ │ │ ├── src_gui_graphicsview_qgraphicslinearlayout.cpp │ │ │ │ ├── src_gui_graphicsview_qgraphicsproxywidget.cpp │ │ │ │ ├── src_gui_graphicsview_qgraphicsscene.cpp │ │ │ │ ├── src_gui_graphicsview_qgraphicssceneevent.cpp │ │ │ │ ├── src_gui_graphicsview_qgraphicsview.cpp │ │ │ │ ├── src_gui_graphicsview_qgraphicswidget.cpp │ │ │ │ ├── src_gui_image_qbitmap.cpp │ │ │ │ ├── src_gui_image_qicon.cpp │ │ │ │ ├── src_gui_image_qimage.cpp │ │ │ │ ├── src_gui_image_qimagereader.cpp │ │ │ │ ├── src_gui_image_qimagewriter.cpp │ │ │ │ ├── src_gui_image_qmovie.cpp │ │ │ │ ├── src_gui_image_qpixmap.cpp │ │ │ │ ├── src_gui_image_qpixmapcache.cpp │ │ │ │ ├── src_gui_image_qpixmapfilter.cpp │ │ │ │ ├── src_gui_itemviews_qabstractitemview.cpp │ │ │ │ ├── src_gui_itemviews_qdatawidgetmapper.cpp │ │ │ │ ├── src_gui_itemviews_qitemeditorfactory.cpp │ │ │ │ ├── src_gui_itemviews_qitemselectionmodel.cpp │ │ │ │ ├── src_gui_itemviews_qstandarditemmodel.cpp │ │ │ │ ├── src_gui_itemviews_qtablewidget.cpp │ │ │ │ ├── src_gui_itemviews_qtreewidget.cpp │ │ │ │ ├── src_gui_kernel_qaction.cpp │ │ │ │ ├── src_gui_kernel_qapplication.cpp │ │ │ │ ├── src_gui_kernel_qapplication_x11.cpp │ │ │ │ ├── src_gui_kernel_qclipboard.cpp │ │ │ │ ├── src_gui_kernel_qevent.cpp │ │ │ │ ├── src_gui_kernel_qformlayout.cpp │ │ │ │ ├── src_gui_kernel_qkeysequence.cpp │ │ │ │ ├── src_gui_kernel_qlayout.cpp │ │ │ │ ├── src_gui_kernel_qlayoutitem.cpp │ │ │ │ ├── src_gui_kernel_qshortcut.cpp │ │ │ │ ├── src_gui_kernel_qshortcutmap.cpp │ │ │ │ ├── src_gui_kernel_qsound.cpp │ │ │ │ ├── src_gui_kernel_qwidget.cpp │ │ │ │ ├── src_gui_painting_qbrush.cpp │ │ │ │ ├── src_gui_painting_qcolor.cpp │ │ │ │ ├── src_gui_painting_qdrawutil.cpp │ │ │ │ ├── src_gui_painting_qmatrix.cpp │ │ │ │ ├── src_gui_painting_qpainter.cpp │ │ │ │ ├── src_gui_painting_qpainterpath.cpp │ │ │ │ ├── src_gui_painting_qpen.cpp │ │ │ │ ├── src_gui_painting_qregion.cpp │ │ │ │ ├── src_gui_painting_qregion_unix.cpp │ │ │ │ ├── src_gui_painting_qtransform.cpp │ │ │ │ ├── src_gui_styles_qstyle.cpp │ │ │ │ ├── src_gui_styles_qstyleoption.cpp │ │ │ │ ├── src_gui_text_qfont.cpp │ │ │ │ ├── src_gui_text_qfontmetrics.cpp │ │ │ │ ├── src_gui_text_qsyntaxhighlighter.cpp │ │ │ │ ├── src_gui_text_qtextcursor.cpp │ │ │ │ ├── src_gui_text_qtextdocument.cpp │ │ │ │ ├── src_gui_text_qtextlayout.cpp │ │ │ │ ├── src_gui_util_qcompleter.cpp │ │ │ │ ├── src_gui_util_qdesktopservices.cpp │ │ │ │ ├── src_gui_util_qundostack.cpp │ │ │ │ ├── src_gui_widgets_qabstractbutton.cpp │ │ │ │ ├── src_gui_widgets_qabstractspinbox.cpp │ │ │ │ ├── src_gui_widgets_qcalendarwidget.cpp │ │ │ │ ├── src_gui_widgets_qcheckbox.cpp │ │ │ │ ├── src_gui_widgets_qdatetimeedit.cpp │ │ │ │ ├── src_gui_widgets_qdockwidget.cpp │ │ │ │ ├── src_gui_widgets_qframe.cpp │ │ │ │ ├── src_gui_widgets_qgroupbox.cpp │ │ │ │ ├── src_gui_widgets_qlabel.cpp │ │ │ │ ├── src_gui_widgets_qlineedit.cpp │ │ │ │ ├── src_gui_widgets_qmainwindow.cpp │ │ │ │ ├── src_gui_widgets_qmenu.cpp │ │ │ │ ├── src_gui_widgets_qmenubar.cpp │ │ │ │ ├── src_gui_widgets_qplaintextedit.cpp │ │ │ │ ├── src_gui_widgets_qpushbutton.cpp │ │ │ │ ├── src_gui_widgets_qradiobutton.cpp │ │ │ │ ├── src_gui_widgets_qrubberband.cpp │ │ │ │ ├── src_gui_widgets_qscrollarea.cpp │ │ │ │ ├── src_gui_widgets_qspinbox.cpp │ │ │ │ ├── src_gui_widgets_qsplashscreen.cpp │ │ │ │ ├── src_gui_widgets_qsplitter.cpp │ │ │ │ ├── src_gui_widgets_qstatusbar.cpp │ │ │ │ ├── src_gui_widgets_qtextbrowser.cpp │ │ │ │ ├── src_gui_widgets_qtextedit.cpp │ │ │ │ ├── src_gui_widgets_qvalidator.cpp │ │ │ │ ├── src_gui_widgets_qworkspace.cpp │ │ │ │ ├── src_network_access_qftp.cpp │ │ │ │ ├── src_network_access_qhttp.cpp │ │ │ │ ├── src_network_access_qnetworkaccessmanager.cpp │ │ │ │ ├── src_network_access_qnetworkdiskcache.cpp │ │ │ │ ├── src_network_access_qnetworkrequest.cpp │ │ │ │ ├── src_network_bearer_qnetworkconfigmanager.cpp │ │ │ │ ├── src_network_kernel_qhostaddress.cpp │ │ │ │ ├── src_network_kernel_qhostinfo.cpp │ │ │ │ ├── src_network_kernel_qnetworkproxy.cpp │ │ │ │ ├── src_network_socket_qabstractsocket.cpp │ │ │ │ ├── src_network_socket_qlocalsocket_unix.cpp │ │ │ │ ├── src_network_socket_qnativesocketengine.cpp │ │ │ │ ├── src_network_socket_qtcpserver.cpp │ │ │ │ ├── src_network_socket_qudpsocket.cpp │ │ │ │ ├── src_network_ssl_qsslcertificate.cpp │ │ │ │ ├── src_network_ssl_qsslconfiguration.cpp │ │ │ │ ├── src_network_ssl_qsslsocket.cpp │ │ │ │ ├── src_opengl_qgl.cpp │ │ │ │ ├── src_opengl_qglcolormap.cpp │ │ │ │ ├── src_opengl_qglpixelbuffer.cpp │ │ │ │ ├── src_opengl_qglshaderprogram.cpp │ │ │ │ ├── src_qtestlib_qtestcase.cpp │ │ │ │ ├── src_script_qscriptable.cpp │ │ │ │ ├── src_script_qscriptclass.cpp │ │ │ │ ├── src_script_qscriptcontext.cpp │ │ │ │ ├── src_script_qscriptengine.cpp │ │ │ │ ├── src_script_qscriptengineagent.cpp │ │ │ │ ├── src_script_qscriptvalue.cpp │ │ │ │ ├── src_script_qscriptvalueiterator.cpp │ │ │ │ ├── src_sql_kernel_qsqldatabase.cpp │ │ │ │ ├── src_sql_kernel_qsqldriver.cpp │ │ │ │ ├── src_sql_kernel_qsqlerror.cpp │ │ │ │ ├── src_sql_kernel_qsqlindex.cpp │ │ │ │ ├── src_sql_kernel_qsqlquery.cpp │ │ │ │ ├── src_sql_kernel_qsqlresult.cpp │ │ │ │ ├── src_sql_models_qsqlquerymodel.cpp │ │ │ │ ├── src_svg_qgraphicssvgitem.cpp │ │ │ │ ├── src_xml_dom_qdom.cpp │ │ │ │ ├── src_xml_sax_qxml.cpp │ │ │ │ ├── src_xmlpatterns_api_qabstracturiresolver.cpp │ │ │ │ ├── src_xmlpatterns_api_qabstractxmlforwarditerator.cpp │ │ │ │ ├── src_xmlpatterns_api_qabstractxmlnodemodel.cpp │ │ │ │ ├── src_xmlpatterns_api_qabstractxmlreceiver.cpp │ │ │ │ ├── src_xmlpatterns_api_qsimplexmlnodemodel.cpp │ │ │ │ ├── src_xmlpatterns_api_qxmlformatter.cpp │ │ │ │ ├── src_xmlpatterns_api_qxmlname.cpp │ │ │ │ ├── src_xmlpatterns_api_qxmlquery.cpp │ │ │ │ ├── src_xmlpatterns_api_qxmlresultitems.cpp │ │ │ │ ├── src_xmlpatterns_api_qxmlserializer.cpp │ │ │ │ ├── tools_assistant_compat_lib_qassistantclient.cpp │ │ │ │ ├── tools_designer_src_lib_extension_default_extensionfactory.cpp │ │ │ │ ├── tools_designer_src_lib_extension_extension.cpp │ │ │ │ ├── tools_designer_src_lib_extension_qextensionmanager.cpp │ │ │ │ ├── tools_designer_src_lib_sdk_abstractformeditor.cpp │ │ │ │ ├── tools_designer_src_lib_sdk_abstractformwindow.cpp │ │ │ │ ├── tools_designer_src_lib_sdk_abstractformwindowcursor.cpp │ │ │ │ ├── tools_designer_src_lib_sdk_abstractformwindowmanager.cpp │ │ │ │ ├── tools_designer_src_lib_sdk_abstractobjectinspector.cpp │ │ │ │ ├── tools_designer_src_lib_sdk_abstractpropertyeditor.cpp │ │ │ │ ├── tools_designer_src_lib_sdk_abstractwidgetbox.cpp │ │ │ │ ├── tools_designer_src_lib_uilib_abstractformbuilder.cpp │ │ │ │ ├── tools_designer_src_lib_uilib_formbuilder.cpp │ │ │ │ ├── tools_patternist_qapplicationargumentparser.cpp │ │ │ │ ├── tools_shared_qtgradienteditor_qtgradientdialog.cpp │ │ │ │ ├── tools_shared_qtpropertybrowser_qtpropertybrowser.cpp │ │ │ │ ├── tools_shared_qtpropertybrowser_qtvariantproperty.cpp │ │ │ │ └── tools_shared_qttoolbardialog_qttoolbardialog.cpp │ │ │ ├── console/ │ │ │ │ └── dbus_pingpong.txt │ │ │ ├── coordsys/ │ │ │ │ └── coordsys.cpp │ │ │ ├── customstyle/ │ │ │ │ ├── customstyle.cpp │ │ │ │ ├── customstyle.h │ │ │ │ └── main.cpp │ │ │ ├── customviewstyle.cpp │ │ │ ├── designer/ │ │ │ │ ├── autoconnection/ │ │ │ │ │ ├── imagedialog.cpp │ │ │ │ │ ├── imagedialog.h │ │ │ │ │ ├── imagedialog.ui │ │ │ │ │ └── main.cpp │ │ │ │ ├── imagedialog/ │ │ │ │ │ ├── imagedialog.ui │ │ │ │ │ └── main.cpp │ │ │ │ ├── multipleinheritance/ │ │ │ │ │ ├── imagedialog.cpp │ │ │ │ │ ├── imagedialog.h │ │ │ │ │ ├── imagedialog.ui │ │ │ │ │ └── main.cpp │ │ │ │ ├── noautoconnection/ │ │ │ │ │ ├── imagedialog.cpp │ │ │ │ │ ├── imagedialog.h │ │ │ │ │ ├── imagedialog.ui │ │ │ │ │ └── main.cpp │ │ │ │ └── singleinheritance/ │ │ │ │ ├── imagedialog.cpp │ │ │ │ ├── imagedialog.h │ │ │ │ ├── imagedialog.ui │ │ │ │ └── main.cpp │ │ │ ├── dialogs/ │ │ │ │ └── dialogs.cpp │ │ │ ├── dockwidgets/ │ │ │ │ ├── Resources/ │ │ │ │ │ ├── modules.html │ │ │ │ │ ├── qtcore.html │ │ │ │ │ ├── qtgui.html │ │ │ │ │ ├── qtnetwork.html │ │ │ │ │ ├── qtopengl.html │ │ │ │ │ ├── qtsql.html │ │ │ │ │ ├── qtxml.html │ │ │ │ │ └── titles.txt │ │ │ │ ├── dockwidgets.qrc │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── draganddrop/ │ │ │ │ ├── dragwidget.cpp │ │ │ │ ├── dragwidget.h │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── dragging/ │ │ │ │ ├── images.qrc │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── dropactions/ │ │ │ │ ├── main.cpp │ │ │ │ ├── window.cpp │ │ │ │ └── window.h │ │ │ ├── droparea.cpp │ │ │ ├── dropevents/ │ │ │ │ ├── main.cpp │ │ │ │ ├── window.cpp │ │ │ │ └── window.h │ │ │ ├── droprectangle/ │ │ │ │ ├── main.cpp │ │ │ │ ├── window.cpp │ │ │ │ └── window.h │ │ │ ├── eventfilters/ │ │ │ │ ├── filterobject.cpp │ │ │ │ ├── filterobject.h │ │ │ │ └── main.cpp │ │ │ ├── events/ │ │ │ │ └── events.cpp │ │ │ ├── explicitlysharedemployee/ │ │ │ │ ├── employee.cpp │ │ │ │ ├── employee.h │ │ │ │ └── main.cpp │ │ │ ├── file/ │ │ │ │ └── file.cpp │ │ │ ├── filedialogurls.cpp │ │ │ ├── fileinfo/ │ │ │ │ └── main.cpp │ │ │ ├── graphicssceneadditemsnippet.cpp │ │ │ ├── i18n-non-qt-class/ │ │ │ │ ├── main.cpp │ │ │ │ ├── myclass.cpp │ │ │ │ ├── myclass.h │ │ │ │ ├── myclass.ts │ │ │ │ ├── resources.qrc │ │ │ │ └── translations/ │ │ │ │ ├── i18n-non-qt-class_en.ts │ │ │ │ └── i18n-non-qt-class_fr.ts │ │ │ ├── image/ │ │ │ │ ├── image.cpp │ │ │ │ └── supportedformat.cpp │ │ │ ├── inherited-slot/ │ │ │ │ ├── button.cpp │ │ │ │ ├── button.h │ │ │ │ └── main.cpp │ │ │ ├── itemselection/ │ │ │ │ ├── main.cpp │ │ │ │ └── model.h │ │ │ ├── javastyle.cpp │ │ │ ├── layouts/ │ │ │ │ └── layouts.cpp │ │ │ ├── mainwindowsnippet.cpp │ │ │ ├── matrix/ │ │ │ │ └── matrix.cpp │ │ │ ├── mdiareasnippets.cpp │ │ │ ├── medianodesnippet.cpp │ │ │ ├── moc/ │ │ │ │ ├── main.cpp │ │ │ │ ├── myclass1.h │ │ │ │ ├── myclass2.h │ │ │ │ └── myclass3.h │ │ │ ├── modelview-subclasses/ │ │ │ │ ├── main.cpp │ │ │ │ ├── model.cpp │ │ │ │ ├── model.h │ │ │ │ ├── view.cpp │ │ │ │ ├── view.h │ │ │ │ ├── window.cpp │ │ │ │ └── window.h │ │ │ ├── myscrollarea.cpp │ │ │ ├── network/ │ │ │ │ └── tcpwait.cpp │ │ │ ├── ntfsp.cpp │ │ │ ├── painterpath/ │ │ │ │ └── painterpath.cpp │ │ │ ├── patternist/ │ │ │ │ ├── anyHTMLElement.xq │ │ │ │ ├── anyXLinkAttribute.xq │ │ │ │ ├── bracesIncluded.xq │ │ │ │ ├── bracesIncludedResult.xml │ │ │ │ ├── bracesOmitted.xq │ │ │ │ ├── bracesOmittedResult.xml │ │ │ │ ├── computedTreeFragment.xq │ │ │ │ ├── copyAttribute.xq │ │ │ │ ├── copyID.xq │ │ │ │ ├── directTreeFragment.xq │ │ │ │ ├── doc.txt │ │ │ │ ├── docPlainHTML.xq │ │ │ │ ├── docPlainHTML2.xq │ │ │ │ ├── embedDataInXHTML.xq │ │ │ │ ├── embedDataInXHTML2.xq │ │ │ │ ├── emptyParagraphs.xq │ │ │ │ ├── escapeCurlyBraces.xq │ │ │ │ ├── escapeStringLiterals.xml │ │ │ │ ├── escapeStringLiterals.xq │ │ │ │ ├── expressionInsideAttribute.xq │ │ │ │ ├── filterOnPath.xq │ │ │ │ ├── filterOnStep.xq │ │ │ │ ├── firstParagraph.xq │ │ │ │ ├── fnStringOnAttribute.xq │ │ │ │ ├── forClause.xq │ │ │ │ ├── forClause2.xq │ │ │ │ ├── forClauseOnFeed.xq │ │ │ │ ├── indented.xml │ │ │ │ ├── introAcneRemover.xq │ │ │ │ ├── introExample2.xq │ │ │ │ ├── introFileHierarchy.xml │ │ │ │ ├── introNavigateFS.xq │ │ │ │ ├── introductionExample.xq │ │ │ │ ├── invalidLetOrderBy.xq │ │ │ │ ├── items.xq │ │ │ │ ├── letOrderBy.xq │ │ │ │ ├── literalsAndOperators.xq │ │ │ │ ├── mobeyDick.xml │ │ │ │ ├── nextLastParagraph.xq │ │ │ │ ├── nodeConstructorsAreExpressions.xq │ │ │ │ ├── nodeConstructorsInPaths.xq │ │ │ │ ├── nodeTestChildElement.xq │ │ │ │ ├── notIndented.xml │ │ │ │ ├── oneElementConstructor.xq │ │ │ │ ├── paragraphsExceptTheFiveFirst.xq │ │ │ │ ├── paragraphsWithTables.xq │ │ │ │ ├── pathAB.xq │ │ │ │ ├── pathsAllParagraphs.xq │ │ │ │ ├── simpleHTML.xq │ │ │ │ ├── simpleXHTML.xq │ │ │ │ ├── svgDocumentElement.xml │ │ │ │ ├── tablesInParagraphs.xq │ │ │ │ ├── twoSVGElements.xq │ │ │ │ ├── xmlStylesheet.xq │ │ │ │ ├── xsBooleanTrue.xq │ │ │ │ └── xsvgDocumentElement.xml │ │ │ ├── persistentindexes/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ ├── mainwindow.h │ │ │ │ └── model.h │ │ │ ├── phonon/ │ │ │ │ └── samplebackend/ │ │ │ │ └── main.cpp │ │ │ ├── phonon.cpp │ │ │ ├── phononeffectparameter.cpp │ │ │ ├── phononobjectdescription.cpp │ │ │ ├── picture/ │ │ │ │ └── picture.cpp │ │ │ ├── plaintextlayout/ │ │ │ │ ├── main.cpp │ │ │ │ ├── window.cpp │ │ │ │ └── window.h │ │ │ ├── pointer/ │ │ │ │ └── pointer.cpp │ │ │ ├── polygon/ │ │ │ │ └── polygon.cpp │ │ │ ├── porting4-dropevents/ │ │ │ │ ├── main.cpp │ │ │ │ ├── window.cpp │ │ │ │ └── window.h │ │ │ ├── printing-qprinter/ │ │ │ │ ├── errors.cpp │ │ │ │ ├── main.cpp │ │ │ │ ├── object.cpp │ │ │ │ └── object.h │ │ │ ├── process/ │ │ │ │ └── process.cpp │ │ │ ├── qabstractsliderisnippet.cpp │ │ │ ├── qcalendarwidget/ │ │ │ │ └── main.cpp │ │ │ ├── qcolumnview/ │ │ │ │ └── main.cpp │ │ │ ├── qdebug/ │ │ │ │ └── qdebugsnippet.cpp │ │ │ ├── qdir-filepaths/ │ │ │ │ └── main.cpp │ │ │ ├── qdir-listfiles/ │ │ │ │ └── main.cpp │ │ │ ├── qdir-namefilters/ │ │ │ │ └── main.cpp │ │ │ ├── qelapsedtimer/ │ │ │ │ └── main.cpp │ │ │ ├── qfontdatabase/ │ │ │ │ └── main.cpp │ │ │ ├── qgl-namespace/ │ │ │ │ └── main.cpp │ │ │ ├── qlabel/ │ │ │ │ └── main.cpp │ │ │ ├── qlineargradient/ │ │ │ │ ├── main.cpp │ │ │ │ ├── paintwidget.cpp │ │ │ │ └── paintwidget.h │ │ │ ├── qlistview-dnd/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ ├── mainwindow.h │ │ │ │ ├── model.cpp │ │ │ │ └── model.h │ │ │ ├── qlistview-using/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ ├── mainwindow.h │ │ │ │ └── model.h │ │ │ ├── qlistwidget-dnd/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── qlistwidget-using/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── qmacnativewidget/ │ │ │ │ └── main.mm │ │ │ ├── qmake/ │ │ │ │ ├── delegate.h │ │ │ │ ├── main.cpp │ │ │ │ ├── model.cpp │ │ │ │ ├── model.h │ │ │ │ ├── paintwidget_unix.cpp │ │ │ │ └── view.h │ │ │ ├── qmetaobject-invokable/ │ │ │ │ ├── main.cpp │ │ │ │ ├── window.cpp │ │ │ │ └── window.h │ │ │ ├── qprocess/ │ │ │ │ └── qprocess-simpleexecution.cpp │ │ │ ├── qprocess-environment/ │ │ │ │ └── main.cpp │ │ │ ├── qsignalmapper/ │ │ │ │ ├── buttonwidget.cpp │ │ │ │ ├── buttonwidget.h │ │ │ │ ├── main.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── qsortfilterproxymodel/ │ │ │ │ └── main.cpp │ │ │ ├── qsortfilterproxymodel-details/ │ │ │ │ └── main.cpp │ │ │ ├── qsplashscreen/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ ├── mainwindow.h │ │ │ │ └── qsplashscreen.qrc │ │ │ ├── qsql-namespace/ │ │ │ │ └── main.cpp │ │ │ ├── qstack/ │ │ │ │ └── main.cpp │ │ │ ├── qstackedlayout/ │ │ │ │ └── main.cpp │ │ │ ├── qstackedwidget/ │ │ │ │ └── main.cpp │ │ │ ├── qstandarditemmodel/ │ │ │ │ └── main.cpp │ │ │ ├── qstatustipevent/ │ │ │ │ └── main.cpp │ │ │ ├── qstringlistmodel/ │ │ │ │ └── main.cpp │ │ │ ├── qstyleoption/ │ │ │ │ └── main.cpp │ │ │ ├── qstyleplugin/ │ │ │ │ └── main.cpp │ │ │ ├── qsvgwidget/ │ │ │ │ ├── main.cpp │ │ │ │ └── qsvgwidget.qrc │ │ │ ├── qt-namespace/ │ │ │ │ └── main.cpp │ │ │ ├── qtablewidget-dnd/ │ │ │ │ ├── images.qrc │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── qtablewidget-resizing/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── qtablewidget-using/ │ │ │ │ ├── images.qrc │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── qtcast/ │ │ │ │ ├── qtcast.cpp │ │ │ │ └── qtcast.h │ │ │ ├── qtest-namespace/ │ │ │ │ └── main.cpp │ │ │ ├── qtreeview-dnd/ │ │ │ │ ├── dragdropmodel.h │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ ├── mainwindow.h │ │ │ │ ├── treeitem.cpp │ │ │ │ ├── treeitem.h │ │ │ │ ├── treemodel.cpp │ │ │ │ └── treemodel.h │ │ │ ├── qtreewidget-using/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── qtreewidgetitemiterator-using/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── qtscript/ │ │ │ │ ├── evaluation/ │ │ │ │ │ └── main.cpp │ │ │ │ ├── registeringobjects/ │ │ │ │ │ ├── main.cpp │ │ │ │ │ ├── myobject.cpp │ │ │ │ │ └── myobject.h │ │ │ │ ├── registeringvalues/ │ │ │ │ │ └── main.cpp │ │ │ │ └── scriptedslot/ │ │ │ │ ├── main.cpp │ │ │ │ ├── object.js │ │ │ │ └── scriptedslot.qrc │ │ │ ├── quiloader/ │ │ │ │ ├── main.cpp │ │ │ │ ├── myform.ui │ │ │ │ ├── mywidget.cpp │ │ │ │ ├── mywidget.h │ │ │ │ └── mywidget.qrc │ │ │ ├── qx11embedcontainer/ │ │ │ │ └── main.cpp │ │ │ ├── qx11embedwidget/ │ │ │ │ ├── embedwidget.cpp │ │ │ │ ├── embedwidget.h │ │ │ │ └── main.cpp │ │ │ ├── qxmlquery/ │ │ │ │ └── bindingExample.cpp │ │ │ ├── qxmlschema/ │ │ │ │ └── main.cpp │ │ │ ├── qxmlschemavalidator/ │ │ │ │ └── main.cpp │ │ │ ├── qxmlstreamwriter/ │ │ │ │ └── main.cpp │ │ │ ├── reading-selections/ │ │ │ │ ├── main.cpp │ │ │ │ ├── model.h │ │ │ │ ├── window.cpp │ │ │ │ └── window.h │ │ │ ├── scribe-overview/ │ │ │ │ └── main.cpp │ │ │ ├── scriptdebugger.cpp │ │ │ ├── seekslider.cpp │ │ │ ├── separations/ │ │ │ │ ├── finalwidget.cpp │ │ │ │ ├── finalwidget.h │ │ │ │ ├── main.cpp │ │ │ │ ├── screenwidget.cpp │ │ │ │ ├── screenwidget.h │ │ │ │ ├── viewer.cpp │ │ │ │ └── viewer.h │ │ │ ├── settings/ │ │ │ │ └── settings.cpp │ │ │ ├── shareddirmodel/ │ │ │ │ └── main.cpp │ │ │ ├── sharedemployee/ │ │ │ │ ├── employee.cpp │ │ │ │ ├── employee.h │ │ │ │ └── main.cpp │ │ │ ├── sharedtablemodel/ │ │ │ │ ├── main.cpp │ │ │ │ └── model.h │ │ │ ├── signalmapper/ │ │ │ │ ├── accountsfile.txt │ │ │ │ ├── filereader.cpp │ │ │ │ ├── filereader.h │ │ │ │ ├── main.cpp │ │ │ │ ├── reportfile.txt │ │ │ │ └── taxfile.txt │ │ │ ├── signalsandslots/ │ │ │ │ ├── lcdnumber.cpp │ │ │ │ ├── lcdnumber.h │ │ │ │ ├── signalsandslots.cpp │ │ │ │ └── signalsandslots.h │ │ │ ├── simplemodel-use/ │ │ │ │ └── main.cpp │ │ │ ├── splitter/ │ │ │ │ └── splitter.cpp │ │ │ ├── splitterhandle/ │ │ │ │ ├── main.cpp │ │ │ │ ├── splitter.cpp │ │ │ │ └── splitter.h │ │ │ ├── sqldatabase/ │ │ │ │ └── sqldatabase.cpp │ │ │ ├── streaming/ │ │ │ │ └── main.cpp │ │ │ ├── stringlistmodel/ │ │ │ │ ├── main.cpp │ │ │ │ ├── model.cpp │ │ │ │ └── model.h │ │ │ ├── styles/ │ │ │ │ └── styles.cpp │ │ │ ├── stylesheet/ │ │ │ │ └── common-mistakes.cpp │ │ │ ├── textblock-formats/ │ │ │ │ └── main.cpp │ │ │ ├── textblock-fragments/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ ├── mainwindow.h │ │ │ │ ├── xmlwriter.cpp │ │ │ │ └── xmlwriter.h │ │ │ ├── textdocument-blocks/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ ├── mainwindow.h │ │ │ │ ├── xmlwriter.cpp │ │ │ │ └── xmlwriter.h │ │ │ ├── textdocument-charformats/ │ │ │ │ └── main.cpp │ │ │ ├── textdocument-css/ │ │ │ │ └── main.cpp │ │ │ ├── textdocument-cursors/ │ │ │ │ └── main.cpp │ │ │ ├── textdocument-find/ │ │ │ │ └── main.cpp │ │ │ ├── textdocument-frames/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ ├── mainwindow.h │ │ │ │ ├── xmlwriter.cpp │ │ │ │ └── xmlwriter.h │ │ │ ├── textdocument-imagedrop/ │ │ │ │ ├── main.cpp │ │ │ │ ├── textedit.cpp │ │ │ │ └── textedit.h │ │ │ ├── textdocument-imageformat/ │ │ │ │ ├── images.qrc │ │ │ │ └── main.cpp │ │ │ ├── textdocument-images/ │ │ │ │ ├── images.qrc │ │ │ │ └── main.cpp │ │ │ ├── textdocument-listitems/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── textdocument-lists/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── textdocument-printing/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── textdocument-selections/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ └── mainwindow.h │ │ │ ├── textdocument-tables/ │ │ │ │ ├── main.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ ├── mainwindow.h │ │ │ │ ├── xmlwriter.cpp │ │ │ │ └── xmlwriter.h │ │ │ ├── textdocument-texttable/ │ │ │ │ └── main.cpp │ │ │ ├── textdocumentendsnippet.cpp │ │ │ ├── threads/ │ │ │ │ ├── threads.cpp │ │ │ │ └── threads.h │ │ │ ├── timeline/ │ │ │ │ └── main.cpp │ │ │ ├── timers/ │ │ │ │ └── timers.cpp │ │ │ ├── transform/ │ │ │ │ └── main.cpp │ │ │ ├── uitools/ │ │ │ │ └── calculatorform/ │ │ │ │ ├── calculatorform.ui │ │ │ │ └── main.cpp │ │ │ ├── updating-selections/ │ │ │ │ ├── main.cpp │ │ │ │ ├── model.h │ │ │ │ ├── window.cpp │ │ │ │ └── window.h │ │ │ ├── videomedia.cpp │ │ │ ├── volumeslider.cpp │ │ │ ├── webkit/ │ │ │ │ └── webpage/ │ │ │ │ └── main.cpp │ │ │ ├── whatsthis/ │ │ │ │ └── whatsthis.cpp │ │ │ ├── widget-mask/ │ │ │ │ ├── main.cpp │ │ │ │ └── mask.qrc │ │ │ ├── widgetdelegate.cpp │ │ │ ├── widgets-tutorial/ │ │ │ │ ├── childwidget/ │ │ │ │ │ └── main.cpp │ │ │ │ ├── nestedlayouts/ │ │ │ │ │ └── main.cpp │ │ │ │ ├── toplevel/ │ │ │ │ │ └── main.cpp │ │ │ │ └── windowlayout/ │ │ │ │ └── main.cpp │ │ │ └── xml/ │ │ │ ├── rsslisting/ │ │ │ │ ├── handler.cpp │ │ │ │ ├── handler.h │ │ │ │ ├── main.cpp │ │ │ │ ├── rsslisting.cpp │ │ │ │ └── rsslisting.h │ │ │ └── simpleparse/ │ │ │ ├── handler.cpp │ │ │ ├── handler.h │ │ │ └── main.cpp │ │ ├── examples/ │ │ │ ├── dbus/ │ │ │ │ ├── example-client.py │ │ │ │ └── example-server.py │ │ │ ├── declarative/ │ │ │ │ └── cppextensions/ │ │ │ │ ├── imageprovider/ │ │ │ │ │ ├── imageprovider-example.qml │ │ │ │ │ └── imageprovider.cpp │ │ │ │ └── plugins/ │ │ │ │ ├── plugin.cpp │ │ │ │ └── plugins.qml │ │ │ ├── dialogs/ │ │ │ │ ├── classwizard/ │ │ │ │ │ ├── classwizard.cpp │ │ │ │ │ ├── classwizard.qrc │ │ │ │ │ └── main.cpp │ │ │ │ ├── extension/ │ │ │ │ │ └── finddialog.cpp │ │ │ │ ├── licensewizard/ │ │ │ │ │ ├── licensewizard.cpp │ │ │ │ │ ├── licensewizard.h │ │ │ │ │ ├── licensewizard.qrc │ │ │ │ │ └── main.cpp │ │ │ │ ├── standarddialogs/ │ │ │ │ │ └── dialog.cpp │ │ │ │ ├── tabdialog/ │ │ │ │ │ └── tabdialog.cpp │ │ │ │ └── trivialwizard/ │ │ │ │ └── trivialwizard.cpp │ │ │ ├── graphicsview/ │ │ │ │ └── simpleanchorlayout/ │ │ │ │ └── main.cpp │ │ │ ├── itemviews/ │ │ │ │ ├── customsortfiltermodel/ │ │ │ │ │ └── mysortfilterproxymodel.cpp │ │ │ │ ├── pixelator/ │ │ │ │ │ └── pixeldelegate.cpp │ │ │ │ └── simpledommodel/ │ │ │ │ └── dommodel.cpp │ │ │ ├── linguist/ │ │ │ │ └── hellotr/ │ │ │ │ └── main.cpp │ │ │ ├── mainwindows/ │ │ │ │ ├── application/ │ │ │ │ │ └── mainwindow.cpp │ │ │ │ ├── dockwidgets/ │ │ │ │ │ └── mainwindow.cpp │ │ │ │ ├── mainwindow.cpp │ │ │ │ ├── mdi/ │ │ │ │ │ └── mainwindow.cpp │ │ │ │ ├── menus/ │ │ │ │ │ └── mainwindow.cpp │ │ │ │ └── sdi/ │ │ │ │ └── mainwindow.cpp │ │ │ ├── painting/ │ │ │ │ └── svggenerator/ │ │ │ │ └── window.cpp │ │ │ ├── richtext/ │ │ │ │ └── textobject/ │ │ │ │ └── svgtextobject.h │ │ │ ├── sql/ │ │ │ │ ├── querymodel/ │ │ │ │ │ └── editablesqlmodel.cpp │ │ │ │ └── relationaltablemodel/ │ │ │ │ └── relationaltablemodel.cpp │ │ │ ├── uitools/ │ │ │ │ └── textfinder/ │ │ │ │ └── textfinder.cpp │ │ │ ├── widgets/ │ │ │ │ ├── analogclock/ │ │ │ │ │ └── analogclock.cpp │ │ │ │ ├── groupbox/ │ │ │ │ │ └── window.cpp │ │ │ │ ├── icons/ │ │ │ │ │ └── iconsizespinbox.cpp │ │ │ │ └── spinboxes/ │ │ │ │ └── window.cpp │ │ │ └── xml/ │ │ │ └── streambookmarks/ │ │ │ ├── xbelreader.cpp │ │ │ ├── xbelreader.h │ │ │ └── xbelwriter.cpp │ │ ├── snippets/ │ │ │ ├── customstyle/ │ │ │ │ └── main.cpp │ │ │ ├── phonon/ │ │ │ │ └── samplebackend/ │ │ │ │ └── main.cpp │ │ │ ├── phonon.cpp │ │ │ └── textdocument-resources/ │ │ │ └── main.cpp │ │ └── webkitsnippets/ │ │ ├── qtwebkit_qwebinspector_snippet.cpp │ │ ├── qtwebkit_qwebview_snippet.cpp │ │ ├── simple/ │ │ │ └── main.cpp │ │ ├── webelement/ │ │ │ └── main.cpp │ │ └── webpage/ │ │ └── main.cpp │ ├── conf.py.in │ ├── contents.rst │ ├── extras/ │ │ ├── PySide.QtCore.ClassInfo.rst │ │ ├── PySide.QtCore.Signal.rst │ │ ├── PySide.QtCore.Slot.rst │ │ ├── PySide.QtCore.rst │ │ ├── PySide.QtDeclarative.ListProperty.rst │ │ ├── PySide.QtDeclarative.rst │ │ ├── PySide.QtGui.rst │ │ ├── PySide.QtHelp.rst │ │ ├── PySide.QtMultimedia.rst │ │ ├── PySide.QtNetwork.rst │ │ ├── PySide.QtOpenGL.rst │ │ ├── PySide.QtScript.rst │ │ ├── PySide.QtScriptTools.rst │ │ ├── PySide.QtSql.rst │ │ ├── PySide.QtSvg.rst │ │ ├── PySide.QtTest.rst │ │ ├── PySide.QtUiTools.rst │ │ ├── PySide.QtWebKit.rst │ │ ├── PySide.QtXml.rst │ │ ├── PySide.QtXmlPatterns.rst │ │ └── PySide.phonon.rst │ ├── inheritance_diagram.py │ ├── modules.rst │ ├── pyhtml2devhelp.py │ ├── pyside.qdocconf.in │ ├── pysideapi2.rst │ ├── pysideinclude.py │ ├── pysideversion.rst │ ├── tutorials/ │ │ ├── index.rst │ │ ├── qmladvancedtutorial/ │ │ │ ├── index.rst │ │ │ ├── samegame/ │ │ │ │ ├── samegame1/ │ │ │ │ │ ├── Block.qml │ │ │ │ │ ├── Button.qml │ │ │ │ │ ├── samegame.qml │ │ │ │ │ └── samegame1.qmlproject │ │ │ │ ├── samegame2/ │ │ │ │ │ ├── Block.qml │ │ │ │ │ ├── Button.qml │ │ │ │ │ ├── samegame.js │ │ │ │ │ ├── samegame.qml │ │ │ │ │ └── samegame2.qmlproject │ │ │ │ ├── samegame3/ │ │ │ │ │ ├── Block.qml │ │ │ │ │ ├── Button.qml │ │ │ │ │ ├── Dialog.qml │ │ │ │ │ ├── samegame.js │ │ │ │ │ ├── samegame.qml │ │ │ │ │ └── samegame3.qmlproject │ │ │ │ └── samegame4/ │ │ │ │ ├── content/ │ │ │ │ │ ├── BoomBlock.qml │ │ │ │ │ ├── Button.qml │ │ │ │ │ ├── Dialog.qml │ │ │ │ │ └── samegame.js │ │ │ │ ├── highscores/ │ │ │ │ │ ├── README │ │ │ │ │ ├── score_data.xml │ │ │ │ │ ├── score_style.xsl │ │ │ │ │ └── scores.php │ │ │ │ ├── samegame.qml │ │ │ │ └── samegame4.qmlproject │ │ │ ├── samegame.tar.bz2 │ │ │ ├── samegame1.rst │ │ │ ├── samegame2.rst │ │ │ ├── samegame3.rst │ │ │ └── samegame4.rst │ │ └── qmltutorial/ │ │ ├── helloworld/ │ │ │ ├── Cell.qml │ │ │ ├── tutorial1.qml │ │ │ ├── tutorial2.qml │ │ │ └── tutorial3.qml │ │ ├── helloworld.tar.bz2 │ │ ├── index.rst │ │ ├── step1.rst │ │ ├── step2.rst │ │ └── step3.rst │ └── typesystem_doc.xml.in ├── libpyside/ │ ├── CMakeLists.txt │ ├── PySideConfig-spec.cmake.in │ ├── PySideConfig.cmake.in │ ├── PySideConfigVersion.cmake.in │ ├── destroylistener.cpp │ ├── destroylistener.h │ ├── dynamicqmetaobject.cpp │ ├── dynamicqmetaobject.h │ ├── dynamicqmetaobject_p.h │ ├── globalreceiver.cpp │ ├── globalreceiver.h │ ├── globalreceiverv2.cpp │ ├── globalreceiverv2.h │ ├── pyside.cpp │ ├── pyside.h │ ├── pyside.pc.in │ ├── pysideclassinfo.cpp │ ├── pysideclassinfo.h │ ├── pysideclassinfo_p.h │ ├── pysideconversions.h │ ├── pysidemacros.h │ ├── pysidemetafunction.cpp │ ├── pysidemetafunction.h │ ├── pysidemetafunction_p.h │ ├── pysideproperty.cpp │ ├── pysideproperty.h │ ├── pysideproperty_p.h │ ├── pysideqflags.cpp │ ├── pysideqflags.h │ ├── pysidesignal.cpp │ ├── pysidesignal.h │ ├── pysidesignal_p.h │ ├── pysideslot.cpp │ ├── pysideslot_p.h │ ├── pysideweakref.cpp │ ├── pysideweakref.h │ ├── signalmanager.cpp │ └── signalmanager.h ├── plugins/ │ ├── CMakeLists.txt │ ├── customwidget.cpp │ ├── customwidget.h │ ├── customwidgets.cpp │ └── customwidgets.h └── tests/ ├── CMakeLists.txt ├── QtCore/ │ ├── CMakeLists.txt │ ├── blocking_signals_test.py │ ├── bug_1019.py │ ├── bug_1031.py │ ├── bug_1063.py │ ├── bug_1069.py │ ├── bug_278_test.py │ ├── bug_332.py │ ├── bug_408.py │ ├── bug_428.py │ ├── bug_462.py │ ├── bug_505.py │ ├── bug_515.py │ ├── bug_606.py │ ├── bug_656.py │ ├── bug_686.py │ ├── bug_699.py │ ├── bug_706.py │ ├── bug_723.py │ ├── bug_724.py │ ├── bug_820.py │ ├── bug_826.py │ ├── bug_829.py │ ├── bug_835.py │ ├── bug_920.py │ ├── bug_927.py │ ├── bug_931.py │ ├── bug_938.py │ ├── bug_953.py │ ├── bug_987.py │ ├── bug_994.py │ ├── bug_PYSIDE-164.py │ ├── bug_PYSIDE-42.py │ ├── child_event_test.py │ ├── classinfo_test.py │ ├── deepcopy_test.py │ ├── deletelater_test.py │ ├── destroysignal_test.py │ ├── duck_punching_test.py │ ├── hash_test.py │ ├── inherits_test.py │ ├── max_signals.py │ ├── missing_symbols_test.py │ ├── mockclass_test.py │ ├── python_conversion.py │ ├── qabs_test.py │ ├── qabstractfileengine_test.py │ ├── qabstractitemmodel_test.py │ ├── qabstracttransition_test.py │ ├── qanimationgroup_test.py │ ├── qbitarray_test.py │ ├── qbytearray_buffer_protocol_test.py │ ├── qbytearray_concatenation_operator_test.py │ ├── qbytearray_operator_iadd_test.py │ ├── qbytearray_operator_test.py │ ├── qbytearray_test.py │ ├── qcoreapplication_instance_test.py │ ├── qdatastream_test.py │ ├── qdate_test.py │ ├── qdatetime_test.py │ ├── qeasingcurve_test.py │ ├── qenum_test.py │ ├── qevent_test.py │ ├── qfile_test.py │ ├── qfileinfo_test.py │ ├── qflags_test.py │ ├── qhandle_test.py │ ├── qinstallmsghandler_test.py │ ├── qlinef_test.py │ ├── qlocale_test.py │ ├── qmetaobject_test.py │ ├── qmodelindex_internalpointer_test.py │ ├── qobject_children_segfault_test.py │ ├── qobject_connect_notify_test.py │ ├── qobject_destructor.py │ ├── qobject_event_filter_test.py │ ├── qobject_inherits_test.py │ ├── qobject_objectproperty_test.py │ ├── qobject_parent_test.py │ ├── qobject_property_test.py │ ├── qobject_protected_methods_test.py │ ├── qobject_test.py │ ├── qobject_timer_event_test.py │ ├── qobject_tr_as_instance_test.py │ ├── qpoint_test.py │ ├── qprocess_test.py │ ├── qproperty_decorator.py │ ├── qrect_test.py │ ├── qregexp_test.py │ ├── qresource_test.py │ ├── qsize_test.py │ ├── qslot_object_test.py │ ├── qsrand_test.py │ ├── qstate_test.py │ ├── qstatemachine_test.py │ ├── qstring_test.py │ ├── qsysinfo_test.py │ ├── qtext_codec_test.py │ ├── qtextstream_test.py │ ├── qthread_prod_cons_test.py │ ├── qthread_signal_test.py │ ├── qthread_test.py │ ├── qtimer_singleshot_test.py │ ├── qtimer_timeout_test.py │ ├── qtnamespace_test.py │ ├── quoteEnUS.txt │ ├── qurl_test.py │ ├── repr_test.py │ ├── resources.qrc │ ├── resources_mc.py │ ├── setprop_on_ctor_test.py │ ├── staticMetaObject_test.py │ ├── static_method_test.py │ ├── static_protected_methods_test.py │ ├── thread_signals_test.py │ ├── tr_noop_test.py │ ├── translation_test.py │ ├── translations/ │ │ ├── trans_latin.qm │ │ ├── trans_latin.ts │ │ ├── trans_russian.qm │ │ └── trans_russian.ts │ ├── unaryoperator_test.py │ ├── unicode_test.py │ └── versioninfo_test.py ├── QtDeclarative/ │ ├── CMakeLists.txt │ ├── bug_1029.py │ ├── bug_1029.qml │ ├── bug_451.py │ ├── bug_451.qml │ ├── bug_456.py │ ├── bug_456.qml │ ├── bug_557.py │ ├── bug_726.py │ ├── bug_726.qml │ ├── bug_814.py │ ├── bug_814.qml │ ├── bug_825.py │ ├── bug_825.qml │ ├── bug_847.py │ ├── bug_847.qml │ ├── bug_915.py │ ├── bug_926.py │ ├── bug_926.qml │ ├── bug_951.py │ ├── bug_951.qml │ ├── bug_995.py │ ├── bug_995.qml │ ├── bug_997.py │ ├── bug_997.qml │ ├── connect_python_qml.py │ ├── connect_python_qml.qml │ ├── hw.qml │ ├── qdeclarativenetwork_test.py │ ├── qdeclarativeview_test.py │ ├── registertype.py │ ├── registertype.qml │ ├── view.qml │ └── viewmodel.qml ├── QtGui/ │ ├── CMakeLists.txt │ ├── action_clear.py │ ├── add_action_test.py │ ├── api2_test.py │ ├── bug_1002.py │ ├── bug_1006.py │ ├── bug_1048.py │ ├── bug_1077.py │ ├── bug_1091.py │ ├── bug_172.py │ ├── bug_243.py │ ├── bug_300_test.py │ ├── bug_307.py │ ├── bug_324.py │ ├── bug_338.py │ ├── bug_363.py │ ├── bug_367.py │ ├── bug_389.py │ ├── bug_400.py │ ├── bug_416.py │ ├── bug_429.py │ ├── bug_430.py │ ├── bug_433.py │ ├── bug_467.py │ ├── bug_480.py │ ├── bug_493.py │ ├── bug_500.py │ ├── bug_512.py │ ├── bug_525.py │ ├── bug_546.py │ ├── bug_547.py │ ├── bug_549.py │ ├── bug_569.py │ ├── bug_575.py │ ├── bug_576.py │ ├── bug_585.py │ ├── bug_589.py │ ├── bug_606.py │ ├── bug_617.py │ ├── bug_632.py │ ├── bug_635.py │ ├── bug_640.py │ ├── bug_652.py │ ├── bug_653.py │ ├── bug_660.py │ ├── bug_662.py │ ├── bug_667.py │ ├── bug_668.py │ ├── bug_674.py │ ├── bug_675.py │ ├── bug_688.py │ ├── bug_693.py │ ├── bug_696.py │ ├── bug_711.py │ ├── bug_714.py │ ├── bug_716.py │ ├── bug_722.py │ ├── bug_728.py │ ├── bug_736.py │ ├── bug_740.py │ ├── bug_743.py │ ├── bug_750.py │ ├── bug_778.py │ ├── bug_785.py │ ├── bug_793.py │ ├── bug_811.py │ ├── bug_834.py │ ├── bug_836.py │ ├── bug_844.py │ ├── bug_854.py │ ├── bug_860.py │ ├── bug_862.py │ ├── bug_871.py │ ├── bug_879.py │ ├── bug_882.py │ ├── bug_919.py │ ├── bug_921.py │ ├── bug_941.py │ ├── bug_964.py │ ├── bug_967.py │ ├── bug_972.py │ ├── bug_979.py │ ├── bug_988.py │ ├── bug_991.py │ ├── bug_998.py │ ├── bug_PYSIDE-41.py │ ├── customproxywidget_test.py │ ├── deepcopy_test.py │ ├── event_filter_test.py │ ├── float_to_int_implicit_conversion_test.py │ ├── grandparent_method_test.py │ ├── hashabletype_test.py │ ├── import_test.py │ ├── keep_reference_test.py │ ├── missing_symbols_test.py │ ├── paint_event_test.py │ ├── parent_method_test.py │ ├── pyside_reload_test.py │ ├── python_properties_test.py │ ├── qabstracttextdocumentlayout_test.py │ ├── qaction_test.py │ ├── qapp_test.py │ ├── qapplication_exit_segfault_test.py │ ├── qapplication_singleton_test.py │ ├── qbrush_test.py │ ├── qcolor_reduce_test.py │ ├── qcolor_test.py │ ├── qcursor_test.py │ ├── qdatastream_gui_operators_test.py │ ├── qdynamic_signal.py │ ├── qfontdialog_test.py │ ├── qfontmetrics_test.py │ ├── qformlayout_test.py │ ├── qgraphicsitem_isblocked_test.py │ ├── qgraphicsitem_test.py │ ├── qgraphicsproxywidget_test.py │ ├── qgraphicsscene_test.py │ ├── qicon_test.py │ ├── qimage_test.py │ ├── qinputcontext_test.py │ ├── qinputdialog_get_test.py │ ├── qitemselection_test.py │ ├── qkeysequence_test.py │ ├── qlayout_ref_test.py │ ├── qlayout_test.py │ ├── qlcdnumber_test.py │ ├── qlistwidget_test.py │ ├── qlistwidgetitem_test.py │ ├── qmainwindow_test.py │ ├── qmatrix_test.py │ ├── qmenu_test.py │ ├── qmenuadd_test.py │ ├── qobject_mi_test.py │ ├── qpainter_test.py │ ├── qpen_test.py │ ├── qpicture_test.py │ ├── qpixmap_constructor.py │ ├── qpixmap_test.py │ ├── qpixmapcache_test.py │ ├── qpolygonf_test.py │ ├── qpushbutton_test.py │ ├── qradialgradient_test.py │ ├── qregion_test.py │ ├── qshortcut_test.py │ ├── qsplitter_test.py │ ├── qstandarditemmodel_test.py │ ├── qstring_qkeysequence_test.py │ ├── qstyle_test.py │ ├── qtableview_test.py │ ├── qtabwidget_test.py │ ├── qtextdocument_undoredo_test.py │ ├── qtextedit_signal_test.py │ ├── qtextedit_test.py │ ├── qtextline_test.py │ ├── qtoolbar_test.py │ ├── qtoolbox_test.py │ ├── qtransform_test.py │ ├── qvalidator_test.py │ ├── qvariant_test.py │ ├── qwidget_setlayout_test.py │ ├── qwidget_test.py │ ├── reference_count_test.py │ ├── repr_test.py │ ├── returnquadruplesofnumbers_test.py │ ├── standardpixmap_test.py │ ├── test_module_template.py │ ├── timed_app_test.py │ ├── virtual_protected_inheritance_test.py │ ├── virtual_pure_override_test.py │ ├── wrong_return_test.py │ └── x11_symbols_test.py ├── QtHelp/ │ ├── CMakeLists.txt │ └── help_test.py ├── QtMaemo5/ │ ├── CMakeLists.txt │ ├── pickselector_test.py │ └── qmaemo5import_test.py ├── QtMultimedia/ │ ├── CMakeLists.txt │ └── audio_test.py ├── QtNetwork/ │ ├── CMakeLists.txt │ ├── accessManager_test.py │ ├── basic_auth_test.py │ ├── bug_1084.py │ ├── bug_446.py │ ├── http_test.py │ ├── qipv6address_test.py │ ├── tcpserver_test.py │ └── udpsocket_test.py ├── QtOpenGL/ │ ├── CMakeLists.txt │ ├── qglbuffer_test.py │ └── qglwidget_test.py ├── QtScript/ │ ├── CMakeLists.txt │ ├── base_test.py │ ├── bug_1022.py │ ├── engine_test.py │ ├── property_test.py │ └── qscriptvalue_test.py ├── QtScriptTools/ │ ├── CMakeLists.txt │ └── debugger_test.py ├── QtSql/ │ ├── CMakeLists.txt │ ├── bug_1013.py │ ├── qsqldatabaseandqueries_test.py │ └── qvarianttype_test.py ├── QtSvg/ │ ├── CMakeLists.txt │ ├── qsvggenerator_test.py │ ├── qsvgrenderer_test.py │ └── qsvgwidget_test.py ├── QtTest/ │ ├── CMakeLists.txt │ ├── click_test.py │ ├── eventfilter_test.py │ └── touchevent_test.py ├── QtUiTools/ │ ├── CMakeLists.txt │ ├── action.ui │ ├── bug_1060.py │ ├── bug_1060.ui │ ├── bug_360.py │ ├── bug_376.py │ ├── bug_392.py │ ├── bug_426.py │ ├── bug_426.ui │ ├── bug_552.py │ ├── bug_552.ui │ ├── bug_797.py │ ├── bug_909.py │ ├── bug_909.ui │ ├── bug_913.py │ ├── bug_913.ui │ ├── bug_958.py │ ├── bug_958.ui │ ├── bug_965.py │ ├── bug_965.ui │ ├── minimal.ui │ ├── pycustomwidget.ui │ ├── pycustomwidget2.ui │ ├── test.ui │ ├── ui_test.py │ └── uiloader_test.py ├── QtWebKit/ │ ├── CMakeLists.txt │ ├── bug_448.py │ ├── bug_694.py │ ├── bug_803.py │ ├── bug_899.py │ ├── bug_959.py │ ├── fox.html │ ├── qml_plugin_test.py │ ├── qmlplugin/ │ │ ├── dummy.pys │ │ └── index.html │ ├── qvariantlist_property_test.py │ ├── shouldInterruptjavascript_test.py │ ├── webframe_test.py │ ├── webpage_test.py │ └── webview_test.py ├── QtXml/ │ ├── CMakeLists.txt │ ├── qdomdocument_test.py │ └── qxmlsimplereader_test.py ├── QtXmlPatterns/ │ ├── CMakeLists.txt │ └── import_test.py ├── mac/ │ ├── CMakeLists.txt │ └── qmacstyle_test.py ├── manually/ │ ├── README.txt │ └── bug_841.py ├── phonon/ │ ├── CMakeLists.txt │ ├── basic_playing_test.py │ ├── bug_328.py │ ├── bug_786.py │ ├── capabilities_test.py │ └── qobjectdescription_test.py ├── pysidetest/ │ ├── CMakeLists.txt │ ├── application_test.py │ ├── bug_1016.py │ ├── decoratedslot_test.py │ ├── delegatecreateseditor_test.py │ ├── enum_test.py │ ├── hiddenobject.cpp │ ├── hiddenobject.h │ ├── homonymoussignalandmethod_test.py │ ├── list_signal_test.py │ ├── modelview_test.py │ ├── pysidetest_global.h │ ├── qvariant_test.py │ ├── signalandnamespace_test.py │ ├── signalemissionfrompython_test.py │ ├── signalwithdefaultvalue_test.py │ ├── symbols.filter │ ├── testobject.cpp │ ├── testobject.h │ ├── testview.cpp │ ├── testview.h │ ├── typedef_signal_test.py │ ├── typesystem_pysidetest.xml │ ├── utils_test.py │ └── version_test.py ├── run_test.sh ├── signals/ │ ├── CMakeLists.txt │ ├── args_dont_match_test.py │ ├── bug_311.py │ ├── bug_312.py │ ├── bug_319.py │ ├── decorators_test.py │ ├── disconnect_test.py │ ├── invalid_callback_test.py │ ├── lambda_gui_test.py │ ├── lambda_test.py │ ├── leaking_signal_test.py │ ├── multiple_connections_gui_test.py │ ├── multiple_connections_test.py │ ├── pysignal_test.py │ ├── qobject_destroyed_test.py │ ├── qobject_receivers_test.py │ ├── qobject_sender_test.py │ ├── ref01_test.py │ ├── ref02_test.py │ ├── ref03_test.py │ ├── ref04_test.py │ ├── ref05_test.py │ ├── ref06_test.py │ ├── segfault_proxyparent_test.py │ ├── self_connect_test.py │ ├── short_circuit_test.py │ ├── signal2signal_connect_test.py │ ├── signal_autoconnect_test.py │ ├── signal_connectiontype_support_test.py │ ├── signal_emission_gui_test.py │ ├── signal_emission_test.py │ ├── signal_func_test.py │ ├── signal_manager_refcount_test.py │ ├── signal_number_limit_test.py │ ├── signal_object_test.py │ ├── signal_signature_test.py │ ├── signal_with_primitive_type_test.py │ ├── slot_reference_count_test.py │ └── static_metaobject_test.py ├── tools/ │ └── list-class-hierarchy.py └── util/ ├── color.py ├── helper/ │ ├── __init__.py │ └── docmodifier.py ├── httpd.py ├── module_wrapper/ │ └── PySide/ │ ├── QtAssistant.py │ ├── QtCore.py │ ├── QtDesigner.py │ ├── QtGui.py │ ├── QtHelp.py │ ├── QtNetwork.py │ ├── QtScript.py │ ├── QtSql.py │ ├── QtSvg.py │ ├── QtTest.py │ ├── QtWebKit.py │ ├── QtXml.py │ ├── QtXmlPatterns.py │ ├── __init__.py │ └── phonon.py ├── processtimer.py ├── py2xfunctions.py ├── py3kcompat.py ├── py3xfunctions.py ├── pyqt_diff.py ├── pyqtcheck.py ├── rename_imports.sh ├── test_processtimer.py ├── use_pyqt4.sh ├── use_pyside.sh └── valgrind-python.supp ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ .gitignore export-ignore .gitattributes export-ignore ================================================ FILE: .gitignore ================================================ build *.kdev4 .kdev4 *~ *.log *.pyc ================================================ FILE: CMakeLists.txt ================================================ include(cmake/Macros/icecc.cmake) # this must be the first line! project(pysidebindings) cmake_minimum_required(VERSION 2.6) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Macros/ ${CMAKE_MODULE_PATH}) find_package(Shiboken 1.2.0 REQUIRED) find_package(Qt4 4.5.0 REQUIRED) find_file(GL_H "gl.h" PATH_SUFFIXES "GL") include(FindQt4Extra) set(XVFB_EXEC "") option(USE_XVFB "Uses xvfb-run with the unit tests to avoid QtGui tests popping windows on the screen." FALSE) if(USE_XVFB) find_program(XVFB_RUN NAMES xvfb-run) if (NOT ${XVFB_RUN} MATCHES "XVFB_RUN-NOTFOUND") set(XVFB_EXEC ${XVFB_RUN} -a) message(STATUS "Using xvfb-run to perform QtGui tests.") endif() endif() option(BUILD_TESTS "Build tests." TRUE) option(ENABLE_VERSION_SUFFIX "Used to use current version in suffix to generated files. This is used to allow multiples versions installed simultaneous." FALSE) set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)" ) set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is /lib${LIB_SUFFIX})" FORCE) if(CMAKE_HOST_APPLE) set(ALTERNATIVE_QT_INCLUDE_DIR "" CACHE PATH "The Alternative value to QT_INCLUDE_DIR. Necessary to fix bug on cmake 2.8 MACOS users") endif() if(MSVC) set(CMAKE_CXX_FLAGS "/Zc:wchar_t- /GR /EHsc /DNOCOLOR /DWIN32 /D_WINDOWS /D_SCL_SECURE_NO_WARNINGS") else() if(CMAKE_HOST_UNIX AND NOT CYGWIN) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fvisibility=hidden -Wno-strict-aliasing") endif() set(CMAKE_CXX_FLAGS_DEBUG "-g") option(ENABLE_GCC_OPTIMIZATION "Enable specific GCC flags to optimization library size and performance. Only available on Release Mode" 0) if(ENABLE_GCC_OPTIMIZATION) set(CMAKE_BUILD_TYPE Release) set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -Os -Wl,-O1") if(NOT CMAKE_HOST_APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--hash-style=gnu") endif() endif() if(CMAKE_HOST_APPLE) if (NOT QT_INCLUDE_DIR) set(QT_INCLUDE_DIR "/Library/Frameworks") endif() if(ALTERNATIVE_QT_INCLUDE_DIR) set(QT_INCLUDE_DIR ${ALTERNATIVE_QT_INCLUDE_DIR}) endif() string(REPLACE " " ":" QT_INCLUDE_DIR ${QT_INCLUDE_DIR}) endif() endif() if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE ${SHIBOKEN_BUILD_TYPE}) endif() set(BINDING_NAME PySide) set(BINDING_API_MAJOR_VERSION "1") set(BINDING_API_MINOR_VERSION "2") set(BINDING_API_MICRO_VERSION "4") set(BINDING_API_RELEASE_LEVEL "final") # alpha, beta, rc, or final set(BINDING_API_SERIAL 0) # leave as 0 when release level is final set(BINDING_API_VERSION "${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION}.${BINDING_API_MICRO_VERSION}" CACHE STRING "PySide version" FORCE) if (BINDING_API_RELEASE_LEVEL STREQUAL "final") set(BINDING_API_VERSION_FULL "${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION}.${BINDING_API_MICRO_VERSION}" CACHE STRING "PySide version [full]" FORCE) else() set(BINDING_API_VERSION_FULL "${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION}.${BINDING_API_MICRO_VERSION}~${BINDING_API_RELEASE_LEVEL}${BINDING_API_SERIAL}" CACHE STRING "PySide version [full]" FORCE) endif() set(PYSIDE_QT_VERSION "${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}" CACHE STRING "Qt version used to compile PySide" FORCE) if(ENABLE_VERSION_SUFFIX) set(pyside_SUFFIX "-${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION}") endif() include(${QT_USE_FILE}) if (${QTVERSION} VERSION_LESS 4.5.0) message(FATAL_ERROR "You need Qt4.5, found ${QTVERSION}.") endif() # Configure OS support set(ENABLE_X11 "0") set(ENABLE_MAC "0") set(ENABLE_WIN "0") set(ENABLE_SIMULATOR "0") if(Q_WS_X11) set(ENABLE_X11 "1") if(Q_WS_MAEMO_5) set(AUTO_OS "maemo") else() set(AUTO_OS "x11") endif() elseif(Q_WS_MAC) set(ENABLE_MAC "1") set(AUTO_OS "mac") elseif(Q_WS_WIN) set(ENABLE_WIN "1") set(AUTO_OS "win") elseif(Q_WS_SIMULATOR) set(ENABLE_SIMULATOR "1") set(AUTO_OS "simulator") else() message(FATAL_ERROR "OS not supported") endif() message(STATUS "Detected OS: ${AUTO_OS}") if (WIN32) set(PATH_SEP "\;") else() set(PATH_SEP ":") endif() # Define supported Qt Version set(SUPPORTED_QT_VERSION "${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}") set(BINDING_VERSION ${BINDING_API_VERSION}.${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}) # uninstall target configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") set(ARCHIVE_NAME pyside-qt${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}+${BINDING_API_VERSION_FULL}) add_custom_target(dist COMMAND mkdir -p "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}" && git log > "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}/ChangeLog" && git archive --prefix=${ARCHIVE_NAME}/ HEAD --format=tar --output="${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar" && tar -C "${CMAKE_BINARY_DIR}" --owner=root --group=root -r "${ARCHIVE_NAME}/ChangeLog" -f "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar" && bzip2 -f9 "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar" && echo "Source package created at ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2.\n" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) if (NOT SITE_PACKAGE) execute_process( COMMAND ${SHIBOKEN_PYTHON_INTERPRETER} -c "from distutils import sysconfig; \\ print(sysconfig.get_python_lib(1,0,prefix='${CMAKE_INSTALL_PREFIX}'))" OUTPUT_VARIABLE SITE_PACKAGE OUTPUT_STRIP_TRAILING_WHITESPACE) if (NOT SITE_PACKAGE) message(FATAL_ERROR "Could not detect Python module installation directory.") elseif (APPLE) message(STATUS "!!! The generated bindings will be installed on ${SITE_PACKAGE}, is it right!?") endif() endif() set(GENERATOR_EXTRA_FLAGS --generator-set=shiboken --enable-parent-ctor-heuristic --enable-pyside-extensions --enable-return-value-heuristic --use-isnull-as-nb_nonzero) if(WIN32 OR DEFINED AVOID_PROTECTED_HACK) message(STATUS "PySide will be generated avoiding the protected hack!") set(GENERATOR_EXTRA_FLAGS ${GENERATOR_EXTRA_FLAGS} --avoid-protected-hack) add_definitions(-DAVOID_PROTECTED_HACK) else() message(STATUS "PySide will be generated using the protected hack!") endif() add_subdirectory(libpyside) if(QT_QTUITOOLS_FOUND AND QT_QTDESIGNER_FOUND) add_subdirectory(plugins) endif() # project directories add_subdirectory(PySide) if (BUILD_TESTS) enable_testing() add_subdirectory(tests) endif () find_program(DOT_EXEC dot) if (QT_SRC_DIR AND DOT_EXEC) add_subdirectory(doc) else () message(STATUS "QT_SRC_DIR variable not set or graphviz not found, apidoc generation targets disabled.") endif() ================================================ FILE: COPYING ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice ================================================ FILE: PySide/CMakeLists.txt ================================================ project(pyside) include(PySideModules) # Configure include based on platform configure_file("${CMAKE_CURRENT_SOURCE_DIR}/global.h.in" "${CMAKE_CURRENT_BINARY_DIR}/pyside_global.h" @ONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/__init__.py.in" "${CMAKE_CURRENT_BINARY_DIR}/__init__.py" @ONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/_utils.py.in" "${CMAKE_CURRENT_BINARY_DIR}/_utils.py" @ONLY) HAS_QT_MODULE(QT_QTCORE_FOUND QtCore) HAS_QT_MODULE(QT_QTGUI_FOUND QtGui) HAS_QT_MODULE(QT_QTNETWORK_FOUND QtNetwork) HAS_QT_MODULE(QT_QTWEBKIT_FOUND QtWebKit) HAS_QT_MODULE(QT_QTSVG_FOUND QtSvg) HAS_QT_MODULE(QT_QTXML_FOUND QtXml) HAS_QT_MODULE(QT_QTTEST_FOUND QtTest) HAS_QT_MODULE(QT_QTOPENGL_FOUND QtOpenGL) HAS_QT_MODULE(QT_QTSQL_FOUND QtSql) if(QT_QTDESIGNER_FOUND) HAS_QT_MODULE(QT_QTUITOOLS_FOUND QtUiTools) endif() HAS_QT_MODULE(QT_QTHELP_FOUND QtHelp) HAS_QT_MODULE(QT_QTXMLPATTERNS_FOUND QtXmlPatterns) HAS_QT_MODULE(QT_QTMAEMO5_FOUND QtMaemo5) HAS_QT_MODULE(QT_QTSCRIPT_FOUND QtScript) HAS_QT_MODULE(QT_QTSCRIPTTOOLS_FOUND QtScriptTools) HAS_QT_MODULE(QT_QTMULTIMEDIA_FOUND QtMultimedia) HAS_QT_MODULE(QT_PHONON_FOUND phonon) HAS_QT_MODULE(QT_QTDECLARATIVE_FOUND QtDeclarative) # install install(FILES "${CMAKE_CURRENT_BINARY_DIR}/__init__.py" DESTINATION "${SITE_PACKAGE}/${BINDING_NAME}${pyside_SUFFIX}") install(FILES ${CMAKE_CURRENT_BINARY_DIR}/_utils.py DESTINATION "${SITE_PACKAGE}/${BINDING_NAME}${pyside_SUFFIX}") install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/typesystem_templates.xml DESTINATION share/PySide${pyside_SUFFIX}/typesystems) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pyside_global.h DESTINATION include/${BINDING_NAME}${pyside_SUFFIX}) ================================================ FILE: PySide/QtCore/CMakeLists.txt ================================================ project(QtCore) set(QtCore_gluecode "${CMAKE_CURRENT_SOURCE_DIR}/glue/qeasingcurve_glue.cpp") if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 6) set (QtCore_46_SRC ) else() set(QtCore_46_SRC ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qeasingcurve_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qabstractanimation_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qabstractstate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qabstracttransition_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qanimationgroup_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qeventtransition_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qfinalstate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qhistorystate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qmargins_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qparallelanimationgroup_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qpauseanimation_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qprocessenvironment_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qpropertyanimation_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qsequentialanimationgroup_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qsignaltransition_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qstate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qstatemachine_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qstatemachine_signalevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qstatemachine_wrappedevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qvariantanimation_wrapper.cpp ) endif() if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 7) set (QtCore_47_SRC ) else() set(QtCore_47_SRC ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/qelapsedtimer_wrapper.cpp ) endif() if(ENABLE_WIN) set(SPECIFIC_OS_FILES ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/msg_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/point_wrapper.cpp ) else() set(SPECIFIC_OS_FILES "") endif() set(QtCore_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qabstracteventdispatcher_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qabstractfileengine_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qabstractfileenginehandler_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qabstractfileengineiterator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qabstractitemmodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qabstractlistmodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qabstracttablemodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qbasictimer_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qbitarray_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qbuffer_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qbytearray_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qbytearraymatcher_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qchildevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qcoreapplication_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qcryptographichash_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qdatastream_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qdate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qdatetime_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qdir_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qdiriterator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qdynamicpropertychangeevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qeventloop_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qfactoryinterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qfile_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qfileinfo_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qfilesystemwatcher_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qfsfileengine_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qgenericargument_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qgenericreturnargument_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qiodevice_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qlibraryinfo_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qline_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qlinef_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qlocale_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qmetaclassinfo_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qmetaenum_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qmetaproperty_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qmetamethod_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qmetaobject_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qmimedata_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qmodelindex_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qmutex_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qmutexlocker_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qobject_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qpersistentmodelindex_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qpluginloader_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qpoint_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qpointf_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qprocess_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qreadlocker_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qreadwritelock_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qrect_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qrectf_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qregexp_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qresource_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qrunnable_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qsemaphore_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qsettings_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qsignalmapper_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qsize_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qsizef_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qsocketnotifier_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qsysinfo_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qsystemlocale_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qsystemsemaphore_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qt_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtconcurrent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtcore_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtemporaryfile_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtextboundaryfinder_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtextcodec_converterstate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtextcodec_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtextdecoder_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtextencoder_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtextstream_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtextstreammanipulator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qthread_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qthreadpool_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtime_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtimeline_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtimer_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtimerevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtranslator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qurl_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/quuid_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qwaitcondition_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qwritelocker_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamattribute_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamattributes_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamentitydeclaration_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamentityresolver_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamnamespacedeclaration_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamnotationdeclaration_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamreader_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamwriter_wrapper.cpp ${QtCore_46_SRC} ${QtCore_47_SRC} ${SPECIFIC_OS_FILES} ) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/typesystem_core.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/typesystem_core.xml" @ONLY) set(QtCore_typesystem_path "${QtCore_SOURCE_DIR}") set(QtCore_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtCore/ ${QT_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR}) set(QtCore_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTCORE_LIBRARY}) create_pyside_module(QtCore QtCore_include_dirs QtCore_libraries "" QtCore_typesystem_path QtCore_SRC QtCore_gluecode ${CMAKE_CURRENT_BINARY_DIR}/typesystem_core.xml) ================================================ FILE: PySide/QtCore/glue/qbytearray_bufferprotocol.cpp ================================================ #if PY_VERSION_HEX < 0x03000000 // QByteArray buffer protocol functions // see: http://www.python.org/dev/peps/pep-3118/ extern "C" { static Py_ssize_t SbkQByteArray_segcountproc(PyObject* self, Py_ssize_t* lenp) { if (lenp) *lenp = self->ob_type->tp_as_sequence->sq_length(self); return 1; } static Py_ssize_t SbkQByteArray_readbufferproc(PyObject* self, Py_ssize_t segment, void** ptrptr) { if (segment || !Shiboken::Object::isValid(self)) return -1; QByteArray* cppSelf = %CONVERTTOCPP[QByteArray*](self); *ptrptr = reinterpret_cast(cppSelf->data()); return cppSelf->size(); } PyBufferProcs SbkQByteArrayBufferProc = { /*bf_getreadbuffer*/ &SbkQByteArray_readbufferproc, /*bf_getwritebuffer*/ (writebufferproc) &SbkQByteArray_readbufferproc, /*bf_getsegcount*/ &SbkQByteArray_segcountproc, /*bf_getcharbuffer*/ (charbufferproc) &SbkQByteArray_readbufferproc }; } #endif ================================================ FILE: PySide/QtCore/glue/qcoreapplication_init.cpp ================================================ // Global variables used to store argc and argv values static int QCoreApplicationArgCount; static char** QCoreApplicationArgValues; void QCoreApplication_constructor(PyObject* self, PyObject* args, QCoreApplicationWrapper** cptr) { if (QCoreApplication::instance()) { PyErr_SetString(PyExc_RuntimeError, "A QCoreApplication instance already exists."); return; } int numArgs = PyTuple_GET_SIZE(args); if (numArgs != 1 || !Shiboken::sequenceToArgcArgv(PyTuple_GET_ITEM(args, 0), &QCoreApplicationArgCount, &QCoreApplicationArgValues, "PySideApp")) { PyErr_BadArgument(); return; } *cptr = new QCoreApplicationWrapper(QCoreApplicationArgCount, QCoreApplicationArgValues); Shiboken::Object::releaseOwnership(reinterpret_cast(self)); PySide::registerCleanupFunction(&PySide::destroyQCoreApplication); Py_INCREF(self); } ================================================ FILE: PySide/QtCore/glue/qeasingcurve_glue.cpp ================================================ #include #include #include #include #include "glue/qeasingcurve_glue.h" #define __ECF_ATT_NAME__ "__ecf__" #define MAX_CUSTOM_FUNCTIONS 10 static void deleteData(void* data); struct CustomFunctionsData { static CustomFunctionsData m_list[MAX_CUSTOM_FUNCTIONS]; PySideEasingCurveFunctor* m_obj; QEasingCurve::EasingFunction m_func; }; CustomFunctionsData CustomFunctionsData::m_list[MAX_CUSTOM_FUNCTIONS]; template struct CustomFunctions { static void init() { CustomFunctionsData data; data.m_obj = 0; data.m_func = &CustomFunctions::callback; CustomFunctionsData::m_list[N] = data; CustomFunctions::init(); } static qreal callback(qreal v) { return (*CustomFunctionsData::m_list[N].m_obj)(v); } }; template<> struct CustomFunctions<0> { static void init() { CustomFunctionsData data; data.m_obj = 0; data.m_func = &CustomFunctions<0>::callback; CustomFunctionsData::m_list[0] = data; } static qreal callback(qreal v) { return (*CustomFunctionsData::m_list[0].m_obj)(v); } }; void deleteData(void* data) { delete (PySideEasingCurveFunctor*)(data); } void PySideEasingCurveFunctor::init() { CustomFunctions::init(); } QEasingCurve::EasingFunction PySideEasingCurveFunctor::createCustomFuntion(PyObject* parent, PyObject* pyFunc) { for(int i=0; i < MAX_CUSTOM_FUNCTIONS; i++) { CustomFunctionsData& data = CustomFunctionsData::m_list[i]; if (data.m_obj == 0) { data.m_obj = new PySideEasingCurveFunctor(i, parent, pyFunc); return data.m_func; } } //PyErr_Format(PyExc_RuntimeError, "PySide only supports %d custom functions simultaneously.", MAX_CUSTOM_FUNCTIONS); return 0; } PySideEasingCurveFunctor::~PySideEasingCurveFunctor() { CustomFunctionsData::m_list[m_index].m_obj = 0; PyObject_SetAttrString(m_parent, __ECF_ATT_NAME__, Py_None); } qreal PySideEasingCurveFunctor::operator()(qreal progress) { Shiboken::GilState state; PyObject* args = Py_BuildValue("(f)", progress); PyObject* result = PyObject_CallObject(m_func, args); qreal cppResult = 0.0; if (result) { Shiboken::Conversions::pythonToCppCopy(Shiboken::Conversions::PrimitiveTypeConverter(), result, &cppResult); Py_DECREF(result); } Py_DECREF(args); return cppResult; } PyObject* PySideEasingCurveFunctor::callable() { Py_INCREF(m_func); return m_func; } PyObject* PySideEasingCurveFunctor::callable(PyObject* parent) { return PyObject_GetAttrString(parent, __ECF_ATT_NAME__); } PySideEasingCurveFunctor::PySideEasingCurveFunctor(int index, PyObject* parent, PyObject* pyFunc) : m_parent(parent), m_func(pyFunc), m_index(index) { PyObject_SetAttrString(m_parent, __ECF_ATT_NAME__, m_func); PySide::WeakRef::create(m_parent, deleteData, this); } ================================================ FILE: PySide/QtCore/glue/qeasingcurve_glue.h ================================================ #ifndef __QEASINGCURVE_GLUE__ #define __QEASINGCURVE_GLUE__ #include #include class PySideEasingCurveFunctor { public: static void init(); static QEasingCurve::EasingFunction createCustomFuntion(PyObject* parent, PyObject* pyFunc); qreal operator()(qreal progress); PyObject* callable(); //Return New reference static PyObject* callable(PyObject* parent); //Return New reference ~PySideEasingCurveFunctor(); private: PyObject* m_parent; PyObject* m_func; int m_index; PySideEasingCurveFunctor(int index, PyObject* parent, PyObject *pyFunc); }; #endif ================================================ FILE: PySide/QtCore/glue/qobject_connect.cpp ================================================ static bool isDecorator(PyObject* method, PyObject* self) { Shiboken::AutoDecRef methodName(PyObject_GetAttrString(method, "__name__")); if (!PyObject_HasAttr(self, methodName)) return true; Shiboken::AutoDecRef otherMethod(PyObject_GetAttr(self, methodName)); return reinterpret_cast(otherMethod.object())->im_func != \ reinterpret_cast(method)->im_func; } static bool getReceiver(QObject *source, const char* signal, PyObject* callback, QObject** receiver, PyObject** self, QByteArray* callbackSig) { bool forceGlobalReceiver = false; if (PyMethod_Check(callback)) { *self = PyMethod_GET_SELF(callback); if (%CHECKTYPE[QObject*](*self)) *receiver = %CONVERTTOCPP[QObject*](*self); forceGlobalReceiver = isDecorator(callback, *self); } else if (PyCFunction_Check(callback)) { *self = PyCFunction_GET_SELF(callback); if (*self && %CHECKTYPE[QObject*](*self)) *receiver = %CONVERTTOCPP[QObject*](*self); } else if (PyCallable_Check(callback)) { // Ok, just a callable object *receiver = 0; *self = 0; } bool usingGlobalReceiver = !*receiver || forceGlobalReceiver; // Check if this callback is a overwrite of a non-virtual Qt slot. if (!usingGlobalReceiver && receiver && self) { *callbackSig = PySide::Signal::getCallbackSignature(signal, *receiver, callback, usingGlobalReceiver).toAscii(); const QMetaObject* metaObject = (*receiver)->metaObject(); int slotIndex = metaObject->indexOfSlot(callbackSig->constData()); if (slotIndex != -1 && slotIndex < metaObject->methodOffset() && PyMethod_Check(callback)) usingGlobalReceiver = true; } if (usingGlobalReceiver) { PySide::SignalManager& signalManager = PySide::SignalManager::instance(); *receiver = signalManager.globalReceiver(source, callback); *callbackSig = PySide::Signal::getCallbackSignature(signal, *receiver, callback, usingGlobalReceiver).toAscii(); } return usingGlobalReceiver; } static bool qobjectConnect(QObject* source, const char* signal, QObject* receiver, const char* slot, Qt::ConnectionType type) { if (!signal || !slot) return false; if (!PySide::Signal::checkQtSignal(signal)) return false; signal++; if (!PySide::SignalManager::registerMetaMethod(source, signal, QMetaMethod::Signal)) return false; bool isSignal = PySide::Signal::isQtSignal(slot); slot++; PySide::SignalManager::registerMetaMethod(receiver, slot, isSignal ? QMetaMethod::Signal : QMetaMethod::Slot); bool connected; Py_BEGIN_ALLOW_THREADS connected = QObject::connect(source, signal - 1, receiver, slot - 1, type); Py_END_ALLOW_THREADS return connected; } static bool qobjectConnectCallback(QObject* source, const char* signal, PyObject* callback, Qt::ConnectionType type) { if (!signal || !PySide::Signal::checkQtSignal(signal)) return false; signal++; int signalIndex = PySide::SignalManager::registerMetaMethodGetIndex(source, signal, QMetaMethod::Signal); if (signalIndex == -1) return false; PySide::SignalManager& signalManager = PySide::SignalManager::instance(); // Extract receiver from callback QObject* receiver = 0; PyObject* self = 0; QByteArray callbackSig; bool usingGlobalReceiver = getReceiver(source, signal, callback, &receiver, &self, &callbackSig); if (receiver == 0 && self == 0) return false; const QMetaObject* metaObject = receiver->metaObject(); const char* slot = callbackSig.constData(); int slotIndex = metaObject->indexOfSlot(slot); if (slotIndex == -1) { if (!usingGlobalReceiver && self && !Shiboken::Object::hasCppWrapper((SbkObject*)self)) { qWarning() << "You can't add dynamic slots on an object originated from C++."; if (usingGlobalReceiver) signalManager.releaseGlobalReceiver(source, receiver); return false; } if (usingGlobalReceiver) slotIndex = signalManager.globalReceiverSlotIndex(receiver, slot); else slotIndex = PySide::SignalManager::registerMetaMethodGetIndex(receiver, slot, QMetaMethod::Slot); if (slotIndex == -1) { if (usingGlobalReceiver) signalManager.releaseGlobalReceiver(source, receiver); return false; } } bool connected; Py_BEGIN_ALLOW_THREADS connected = QMetaObject::connect(source, signalIndex, receiver, slotIndex, type); Py_END_ALLOW_THREADS if (connected) { if (usingGlobalReceiver) signalManager.notifyGlobalReceiver(receiver); #ifndef AVOID_PROTECTED_HACK source->connectNotify(signal - 1); #else // Need to cast to QObjectWrapper* and call the public version of // connectNotify when avoiding the protected hack. reinterpret_cast(source)->connectNotify(signal - 1); #endif return true; } if (usingGlobalReceiver) signalManager.releaseGlobalReceiver(source, receiver); return false; } static bool qobjectDisconnectCallback(QObject* source, const char* signal, PyObject* callback) { if (!PySide::Signal::checkQtSignal(signal)) return false; PySide::SignalManager& signalManager = PySide::SignalManager::instance(); // Extract receiver from callback QObject* receiver = 0; PyObject* self = 0; QByteArray callbackSig; bool usingGlobalReceiver = getReceiver(NULL, signal, callback, &receiver, &self, &callbackSig); if (receiver == 0 && self == 0) return false; const QMetaObject* metaObject = receiver->metaObject(); int signalIndex = source->metaObject()->indexOfSignal(++signal); int slotIndex = -1; slotIndex = metaObject->indexOfSlot(callbackSig); bool disconnected; Py_BEGIN_ALLOW_THREADS disconnected = QMetaObject::disconnectOne(source, signalIndex, receiver, slotIndex); Py_END_ALLOW_THREADS if (disconnected) { if (usingGlobalReceiver) signalManager.releaseGlobalReceiver(source, receiver); #ifndef AVOID_PROTECTED_HACK source->disconnectNotify(callbackSig); #else // Need to cast to QObjectWrapper* and call the public version of // connectNotify when avoiding the protected hack. reinterpret_cast(source)->disconnectNotify(callbackSig); #endif return true; } return false; } ================================================ FILE: PySide/QtCore/glue/qobject_findchild.cpp ================================================ static QObject* _findChildHelper(const QObject* parent, const QString& name, PyTypeObject* desiredType) { foreach(QObject* child, parent->children()) { Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QObject*](child)); if (PyType_IsSubtype(pyChild->ob_type, desiredType) && (name.isNull() || name == child->objectName())) { return child; } } QObject* obj; foreach(QObject* child, parent->children()) { obj = _findChildHelper(child, name, desiredType); if (obj) return obj; } return 0; } static inline bool _findChildrenComparator(const QObject*& child, const QRegExp& name) { return name.indexIn(child->objectName()) != -1; } static inline bool _findChildrenComparator(const QObject*& child, const QString& name) { return name.isNull() || name == child->objectName(); } template static void _findChildrenHelper(const QObject* parent, const T& name, PyTypeObject* desiredType, PyObject* result) { foreach(const QObject* child, parent->children()) { Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QObject*](child)); if (PyType_IsSubtype(pyChild->ob_type, desiredType) && _findChildrenComparator(child, name)) PyList_Append(result, pyChild); _findChildrenHelper(child, name, desiredType, result); } } ================================================ FILE: PySide/QtCore/typesystem_core.xml.in ================================================ ================================================ FILE: PySide/QtCore/typesystem_core_common.xml ================================================ // qFatal doesn't have a stream version, so we do a // qWarning call followed by a qFatal() call using a // literal. qWarning() << %1; qFatal("[A qFatal() call was made from Python code]"); return PyBool_FromLong((bool)%in); %out = %OUTTYPE(%in == Py_True); bool py2kStrCheck(PyObject* obj) { #ifdef IS_PY3K return false; #else return PyString_Check(obj); #endif } const int N = %in.length(); wchar_t* str = new wchar_t[N]; %in.toWCharArray(str); PyObject* %out = PyUnicode_FromWideChar(str, N); delete[] str; return %out; Py_UNICODE* unicode = PyUnicode_AS_UNICODE(%in); #if defined(Py_UNICODE_WIDE) // cast as Py_UNICODE can be a different type %out = QString::fromUcs4((const uint*)unicode); #else %out = QString::fromUtf16((const ushort*)unicode, PyUnicode_GET_SIZE(%in)); #endif #ifndef IS_PY3K const char* str = %CONVERTTOCPP[const char*](%in); %out = %OUTTYPE(str); #endif %out = %OUTTYPE(); const int N = %in.toString().length(); wchar_t* str = new wchar_t[N]; %in.toString().toWCharArray(str); PyObject* %out = PyUnicode_FromWideChar(str, N); delete[] str; return %out; %out = %OUTTYPE(); wchar_t c = (wchar_t)%in.unicode(); return PyUnicode_FromWideChar(&c, 1); char c = %CONVERTTOCPP[char](%in); %out = %OUTTYPE(c); int i = %CONVERTTOCPP[int](%in); %out = %OUTTYPE(i); %out = %OUTTYPE(); if (!%in.isValid()) Py_RETURN_NONE; if (qstrcmp(%in.typeName(), "QVariantList") == 0) { QList<QVariant> var = %in.value<QVariantList>(); return %CONVERTTOPYTHON[QList<QVariant>](var); } if (qstrcmp(%in.typeName(), "QStringList") == 0) { QStringList var = %in.value<QStringList>(); return %CONVERTTOPYTHON[QList<QString>](var); } if (qstrcmp(%in.typeName(), "QVariantMap") == 0) { QMap<QString, QVariant> var = %in.value<QVariantMap>(); return %CONVERTTOPYTHON[QMap<QString, QVariant>](var); } Shiboken::Conversions::SpecificConverter converter(cppInRef.typeName()); if (converter) { void* ptr = cppInRef.data(); return converter.toPython(ptr); } PyErr_Format(PyExc_RuntimeError, "Can't find converter for '%s'.", %in.typeName()); return 0; %out = %OUTTYPE(%in == Py_True); %out = %OUTTYPE(); QString in = %CONVERTTOCPP[QString](%in); %out = %OUTTYPE(in); QByteArray in = %CONVERTTOCPP[QByteArray](%in); %out = %OUTTYPE(in); double in = %CONVERTTOCPP[double](%in); %out = %OUTTYPE(in); int in = %CONVERTTOCPP[int](%in); %out = %OUTTYPE(in); qlonglong in = %CONVERTTOCPP[qlonglong](%in); %out = %OUTTYPE(in); int in = %CONVERTTOCPP[int](%in); %out = %OUTTYPE(in); // a class supported by QVariant? int typeCode; const char* typeName = QVariant_resolveMetaType(%in->ob_type, &typeCode); if (!typeCode || !typeName) return; QVariant var(typeCode, (void*)0); Shiboken::Conversions::SpecificConverter converter(typeName); converter.toCpp(pyIn, var.data()); %out = var; QVariant ret = QVariant_convertToVariantMap(%in); %out = ret.isValid() ? ret : QVariant::fromValue<PySide::PyObjectWrapper>(%in); %out = QVariant_convertToVariantList(%in); // Is a shiboken type not known by Qt %out = QVariant::fromValue<PySide::PyObjectWrapper>(%in); static const char* QVariant_resolveMetaType(PyTypeObject* type, int* typeId) { if (PyObject_TypeCheck(type, &SbkObjectType_Type)) { SbkObjectType* sbkType = (SbkObjectType*)type; const char* typeName = Shiboken::ObjectType::getOriginalName(sbkType); if (!typeName) return 0; bool valueType = '*' != typeName[qstrlen(typeName) - 1]; // Do not convert user type of value if (valueType &∓ Shiboken::ObjectType::isUserType(type)) return 0; int obTypeId = QMetaType::type(typeName); if (obTypeId) { *typeId = obTypeId; return typeName; } // Do not resolve types to value type if (valueType) return 0; // find in base types if (type->tp_base) { return QVariant_resolveMetaType(type->tp_base, typeId); } else if (type->tp_bases) { for(int i = 0; i < PyTuple_GET_SIZE(type->tp_bases); ++i) { const char* derivedName = QVariant_resolveMetaType((PyTypeObject*)PyTuple_GET_ITEM(type->tp_bases, i), typeId); if (derivedName) return derivedName; } } } *typeId = 0; return 0; } static QVariant QVariant_convertToValueList(PyObject* list) { if (PySequence_Size(list) < 1) return QVariant(); Shiboken::AutoDecRef element(PySequence_GetItem(list, 0)); int typeId; const char* typeName = QVariant_resolveMetaType(element.cast<PyTypeObject*>(), &typeId); if (typeName) { QByteArray listTypeName("QList<"); listTypeName += typeName; listTypeName += '>'; typeId = QMetaType::type(listTypeName); if (typeId > 0) { Shiboken::Conversions::SpecificConverter converter(listTypeName); if (converter) { QVariant var(typeId, (void*)0); converter.toCpp(list, &var); return var; } qWarning() << "Type converter for :" << listTypeName << "not registered."; } } return QVariant(); } static bool QVariant_isStringList(PyObject *list) { bool allString = true; Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList")); Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object()); for(int i = 0; i < size; ++i) { PyObject* item = PySequence_Fast_GET_ITEM(fast.object(), i); if (!%CHECKTYPE[QString](item)) { allString = false; break; } } return allString; } static QVariant QVariant_convertToVariantMap(PyObject* map) { Py_ssize_t pos = 0; Shiboken::AutoDecRef keys(PyDict_Keys(map)); if (!QVariant_isStringList(keys)) return QVariant(); PyObject* key; PyObject* value; QMap<QString,QVariant> ret; while (PyDict_Next(map, &pos, &key, &value)) { QString cppKey = %CONVERTTOCPP[QString](key); QVariant cppValue = %CONVERTTOCPP[QVariant](value); ret.insert(cppKey, cppValue); } return QVariant(ret); } static QVariant QVariant_convertToVariantList(PyObject* list) { if (QVariant_isStringList(list)) { QList<QString > lst = %CONVERTTOCPP[QList<QString>](list); return QVariant(QStringList(lst)); } QVariant valueList = QVariant_convertToValueList(list); if (valueList.isValid()) return valueList; QList<QVariant> lst; Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList")); Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object()); for (int i = 0; i < size; ++i) { PyObject* pyItem = PySequence_Fast_GET_ITEM(fast.object(), i); QVariant item = %CONVERTTOCPP[QVariant](pyItem); lst.append(item); } return QVariant(lst); } const char* typeName = QVariant::typeToName(%in); PyObject* %out; PyTypeObject* pyType = 0; if (typeName) pyType = Shiboken::Conversions::getPythonTypeObject(typeName); %out = pyType ? ((PyObject*)pyType) : Py_None; Py_INCREF(%out); return %out; %out = QVariant::Invalid; const char* typeName; if (Shiboken::String::checkType((PyTypeObject*)%in)) typeName = "QString"; else if (%in == (PyObject*)&PyFloat_Type) typeName = "double"; // float is a UserType in QVariant. else if (%in == (PyObject*)&PyLong_Type) typeName = "int"; // long is a UserType in QVariant. else if (%in->ob_type == &SbkObjectType_Type) typeName = Shiboken::ObjectType::getOriginalName((SbkObjectType*)%in); else typeName = ((PyTypeObject*)%in)->tp_name; %out = QVariant::nameToType(typeName); %out = QVariant::nameToType(Shiboken::String::toCString(%in)); %out = QVariant::nameToType("QVariantMap"); const char* typeName; if (QVariantType_isStringList(%in)) typeName = "QStringList"; else typeName = "QVariantList"; %out = QVariant::nameToType(typeName); Shiboken::Conversions::registerConverterName(SbkPySide_QtCoreTypeConverters[SBK_QTCORE_QMAP_QSTRING_QVARIANT_IDX], "QVariantMap"); static bool QVariantType_isStringList(PyObject* list) { bool allString = true; Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList")); Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object()); for(int i=0; i < size; i++) { PyObject* item = PySequence_Fast_GET_ITEM(fast.object(), i); if (!%CHECKTYPE[QString](item)) { allString = false; break; } } return allString; } static bool QVariantType_checkAllStringKeys(PyObject* dict) { Shiboken::AutoDecRef keys(PyDict_Keys(dict)); return QVariantType_isStringList(keys); } PyObject* %out = PyTuple_New(2); PyTuple_SET_ITEM(%out, 0, %CONVERTTOPYTHON[%INTYPE_0](%in.first)); PyTuple_SET_ITEM(%out, 1, %CONVERTTOPYTHON[%INTYPE_1](%in.second)); return %out; %out.first = %CONVERTTOCPP[%OUTTYPE_0](PySequence_Fast_GET_ITEM(%in, 0)); %out.second = %CONVERTTOCPP[%OUTTYPE_1](PySequence_Fast_GET_ITEM(%in, 1)); double _abs = qAbs(%1); %PYARG_0 = %CONVERTTOPYTHON[double](_abs); namespace PySide { static QStack<PyObject*> globalPostRoutineFunctions; void globalPostRoutineCallback() { foreach(PyObject* callback, globalPostRoutineFunctions) { Shiboken::AutoDecRef result(PyObject_CallObject(callback, NULL)); Py_DECREF(callback); } globalPostRoutineFunctions.clear(); } void addPostRoutine(PyObject* callback) { if (PyCallable_Check(callback)) { globalPostRoutineFunctions << callback; Py_INCREF(callback); } else { PyErr_SetString(PyExc_TypeError, "qAddPostRoutine: The argument must be a callable object."); } } } // namespace PySide::addPostRoutine(%1); qAddPostRoutine(PySide::globalPostRoutineCallback); QList<QByteArray> version = QByteArray(qVersion()).split('.'); PyObject* pyQtVersion = PyTuple_New(3); for (int i = 0; i < 3; ++i) PyTuple_SET_ITEM(pyQtVersion, i, PyInt_FromLong(version[i].toInt())); PyModule_AddObject(module, "__version_info__", pyQtVersion); PyModule_AddStringConstant(module, "__version__", qVersion()); { // Avoid name clash Shiboken::AutoDecRef regFunc((PyObject*)NULL); Shiboken::AutoDecRef atexit(Shiboken::Module::import("atexit")); if (atexit.isNull()) { qWarning() << "Module atexit not found for registering __moduleShutdown"; PyErr_Clear(); }else{ regFunc = PyObject_GetAttrString(atexit, "register"); if (regFunc.isNull()) { qWarning() << "Function atexit.register not found for registering __moduleShutdown"; PyErr_Clear(); } } if (!atexit.isNull() && !regFunc.isNull()){ PyObject* shutDownFunc = PyObject_GetAttrString(module, "__moduleShutdown"); Shiboken::AutoDecRef args(PyTuple_New(1)); PyTuple_SET_ITEM(args, 0, shutDownFunc); Shiboken::AutoDecRef retval(PyObject_Call(regFunc, args, 0)); Q_ASSERT(!retval.isNull()); } } PySide::runCleanupFunctions(); Shiboken::Conversions::registerConverterName(SbkPySide_QtCoreTypeConverters[SBK_QSTRING_IDX], "unicode"); Shiboken::Conversions::registerConverterName(SbkPySide_QtCoreTypeConverters[SBK_QSTRING_IDX], "str"); Shiboken::Conversions::registerConverterName(SbkPySide_QtCoreTypeConverters[SBK_QTCORE_QLIST_QVARIANT_IDX], "QVariantList"); PySide::init(module); Py_AtExit(QtCoreModuleExit); #include <pyside.h> // Define a global variable to handle qInstallMsgHandler callback static PyObject* qtmsghandler = 0; static void msgHandlerCallback(QtMsgType type, const char* msg) { Shiboken::GilState state; Shiboken::AutoDecRef arglist(PyTuple_New(2)); PyTuple_SET_ITEM(arglist, 0, %CONVERTTOPYTHON[QtMsgType](type)); PyTuple_SET_ITEM(arglist, 1, %CONVERTTOPYTHON[const char*](msg)); Shiboken::AutoDecRef ret(PyObject_CallObject(qtmsghandler, arglist)); } static void QtCoreModuleExit() { PySide::SignalManager::instance().clear(); } if (%PYARG_1 == Py_None) { qInstallMsgHandler(0); %PYARG_0 = qtmsghandler ? qtmsghandler : Py_None; qtmsghandler = 0; } else if (!PyCallable_Check(%PYARG_1)) { PyErr_SetString(PyExc_TypeError, "parameter must be callable"); } else { %PYARG_0 = qtmsghandler ? qtmsghandler : Py_None; Py_INCREF(%PYARG_1); qtmsghandler = %PYARG_1; qInstallMsgHandler(msgHandlerCallback); } if (%PYARG_0 == Py_None) Py_INCREF(%PYARG_0); namespace PySide { template<> inline uint hash(const QLine& v) { return qHash(qMakePair(qMakePair(v.x1(), v.y1()), qMakePair(v.x2(), v.y2()))); } }; QPointF p; %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &p); %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QPointF](p)); Returns a read only buffer object pointing to the segment of data that this resource represents. If the resource is compressed the data returns is compressed and qUncompress() must be used to access the data. If the resource is a directory None is returned. const void* d = %CPPSELF.%FUNCTION_NAME(); if (d) { %PYARG_0 = Shiboken::Buffer::newObject(d, %CPPSELF.size()); } else { Py_INCREF(Py_None); %PYARG_0 = Py_None; } %out = %OUTTYPE(); int day = PyDateTime_GET_DAY(%in); int month = PyDateTime_GET_MONTH(%in); int year = PyDateTime_GET_YEAR(%in); %out = %OUTTYPE(year, month, day); if (!PyDateTimeAPI) PySideDateTime_IMPORT; %PYARG_0 = PyDate_FromDate(%CPPSELF.year(), %CPPSELF.month(), %CPPSELF.day()); int year, month, day; %BEGIN_ALLOW_THREADS %CPPSELF.%FUNCTION_NAME(&year, &month, &day); %END_ALLOW_THREADS %PYARG_0 = PyTuple_New(3); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[int](year)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[int](month)); PyTuple_SET_ITEM(%PYARG_0, 2, %CONVERTTOPYTHON[int](day)); int yearNumber; %BEGIN_ALLOW_THREADS int week = %CPPSELF.%FUNCTION_NAME(&yearNumber); %END_ALLOW_THREADS %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[int](week)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[int](yearNumber)); %out = %OUTTYPE(); int day = PyDateTime_GET_DAY(%in); int month = PyDateTime_GET_MONTH(%in); int year = PyDateTime_GET_YEAR(%in); int hour = PyDateTime_DATE_GET_HOUR(%in); int min = PyDateTime_DATE_GET_MINUTE(%in); int sec = PyDateTime_DATE_GET_SECOND(%in); int usec = PyDateTime_DATE_GET_MICROSECOND(%in); %out = %OUTTYPE(QDate(year, month, day), QTime(hour, min, sec, usec/1000)); QDate date(%1, %2, %3); QTime time(%4, %5, %6, %7); %0 = new %TYPE(date, time, Qt::TimeSpec(%8)); QDate date(%1, %2, %3); QTime time(%4, %5, %6); %0 = new %TYPE(date, time); QDate date = %CPPSELF.date(); QTime time = %CPPSELF.time(); if (!PyDateTimeAPI) PySideDateTime_IMPORT; %PYARG_0 = PyDateTime_FromDateAndTime(date.year(), date.month(), date.day(), time.hour(), time.minute(), time.second(), time.msec()*1000); namespace PySide { template<> inline uint hash(const QPoint& v) { return qHash(qMakePair(v.x(), v.y())); } }; namespace PySide { template<> inline uint hash(const QRect& v) { return qHash(qMakePair(qMakePair(v.x(), v.y()), qMakePair(v.width(), v.height()))); } }; namespace PySide { template<> inline uint hash(const QSize& v) { return qHash(qMakePair(v.width(), v.height())); } }; %out = %OUTTYPE(); int hour = PyDateTime_TIME_GET_HOUR(%in); int min = PyDateTime_TIME_GET_MINUTE(%in); int sec = PyDateTime_TIME_GET_SECOND(%in); int usec = PyDateTime_TIME_GET_MICROSECOND(%in); %out = %OUTTYPE(hour, min, sec, usec/1000); if (!PyDateTimeAPI) PySideDateTime_IMPORT; %PYARG_0 = PyTime_FromTime(%CPPSELF.hour(), %CPPSELF.minute(), %CPPSELF.second(), %CPPSELF.msec()*1000); return %CPPSELF.size(); if (_i < 0 || _i >= %CPPSELF.size()) { PyErr_SetString(PyExc_IndexError, "index out of bounds"); return 0; } bool ret = %CPPSELF.at(_i); return %CONVERTTOPYTHON[bool](ret); PyObject* args = Py_BuildValue("(iiO)", _i, 1, _value); PyObject* result = Sbk_QBitArrayFunc_setBit(self, args); Py_DECREF(args); Py_XDECREF(result); return !result ? -1 : 0; %CPPSELF.unlock(); %CPPSELF.unlock(); %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(%1, %2, %PYARG_3); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); Creates a model index for the given row and column with the internal pointer ptr. When using a QSortFilterProxyModel, its indexes have their own internal pointer. It is not advisable to access this internal pointer outside of the model. Use the data() function instead. This function provides a consistent interface that model subclasses must use to create model indexes. .. warning:: Because of some Qt/Python itegration rules, the ptr argument do not get the reference incremented during the QModelIndex life time. So it is necessary to keep the object used on ptr argument alive during the whole process. Do not destroy the object if you are not sure about that. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); // %FUNCTION_NAME() - disable generation of function call. %RETURN_TYPE %0 = qobjectConnect(%1, %2, %CPPSELF, %3, %4); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); // %FUNCTION_NAME() - disable generation of function call. %RETURN_TYPE %0 = qobjectConnect(%1, %2, %3, %4, %5); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); // %FUNCTION_NAME() - disable generation of function call. %RETURN_TYPE %0 = qobjectConnectCallback(%1, %2, %PYARG_3, %4); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); // %FUNCTION_NAME() - disable generation of function call. %RETURN_TYPE %0 = qobjectConnectCallback(%CPPSELF, %1, %PYARG_2, %3); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); // %FUNCTION_NAME() - disable generation of function call. %RETURN_TYPE %0 = qobjectConnect(%CPPSELF, %1, %2, %3, %4); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); %RETURN_TYPE %0 = PySide::SignalManager::instance().emitSignal(%CPPSELF, %1, %PYARG_2); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); // %FUNCTION_NAME() - disable generation of function call. %RETURN_TYPE %0 = qobjectDisconnectCallback(%CPPSELF, %1, %2); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); // %FUNCTION_NAME() - disable generation of function call. %RETURN_TYPE %0 = qobjectDisconnectCallback(%1, %2, %3); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); QObject* child = _findChildHelper(%CPPSELF, %2, (PyTypeObject*)%PYARG_1); %PYARG_0 = %CONVERTTOPYTHON[QObject*](child); %PYARG_0 = PyList_New(0); _findChildrenHelper(%CPPSELF, %2, (PyTypeObject*)%PYARG_1, %PYARG_0); %PYARG_0 = PyList_New(0); _findChildrenHelper(%CPPSELF, %2, (PyTypeObject*)%PYARG_1, %PYARG_0); QString result; if (QCoreApplication::instance()) { PyObject *klass = PyObject_GetAttrString(%PYSELF, "__class__"); PyObject *cname = PyObject_GetAttrString(klass, "__name__"); result = QString(QCoreApplication::instance()->translate(Shiboken::String::toCString(cname), %1, %2, QCoreApplication::CodecForTr, %3)); Py_DECREF(klass); Py_DECREF(cname); } else { result = QString(QString::fromLatin1(%1)); } %PYARG_0 = %CONVERTTOPYTHON[QString](result); // Avoid return +1 because SignalManager connect to "destroyed()" signal to control object timelife int ret = %CPPSELF.%FUNCTION_NAME(%1); if (ret > 0 && ((strcmp(%1, SIGNAL(destroyed())) == 0) || (strcmp(%1, SIGNAL(destroyed(QObject*))) == 0))) ret -= PySide::SignalManager::instance().countConnectionsWith(%CPPSELF); %PYARG_0 = %CONVERTTOPYTHON[int](ret); <para>URLs can be represented in two forms: encoded or unencoded. The unencoded representation is suitable for showing to users, but the encoded representation is typically what you would send to a web server. For example, the unencoded URL "http://bühler.example.com" would be sent to the server as "http://xn--bhler-kva.example.com/List%20of%20applicants.xml".</para> Replaces every occurrence of the regular expression in *sourceString* with *after*. Returns a new Python string with the modified contents. For example: :: s = "Banana" re = QRegExp("a[mn]") s = re.replace(s, "ox") # s == "Boxoxa" For regular expressions containing capturing parentheses, occurrences of \1, \2, ..., in *after* are replaced with rx.cap(1), cap(2), ... :: t = "A <i>bon mot</i>." re = QRegExp("<i>([^<]*)</i>") t = re.replace(t, "\\emph{\\1}") # t == "A \\emph{bon mot}." %1.replace(*%CPPSELF, %2); %PYARG_0 = %CONVERTTOPYTHON[QString](%1); %out = %OUTTYPE(); %out = %OUTTYPE(Shiboken::String::toCString(%in), Shiboken::String::len(%in)); #ifdef IS_PY3K %out = %OUTTYPE(PyBytes_AS_STRING(%in), PyBytes_GET_SIZE(%in)); #endif Shiboken::AutoDecRef str(PyUnicode_AsASCIIString(%PYARG_1)); if (!str.isNull()) { QByteArray b(PyBytes_AS_STRING(str.object()), PyBytes_GET_SIZE (str.object())); b.prepend(*%CPPSELF); %PYARG_0 = %CONVERTTOPYTHON[QByteArray](b); } Shiboken::AutoDecRef str(PyUnicode_AsASCIIString(%PYARG_1)); if (!str.isNull()) { QByteArray b(PyBytes_AS_STRING(str.object()), PyBytes_GET_SIZE(str.object())); b.append(*%CPPSELF); %PYARG_0 = %CONVERTTOPYTHON[QByteArray](b); } QByteArray ba = QByteArray(PyBytes_AS_STRING(%PYARG_1), PyBytes_GET_SIZE(%PYARG_1)) + *%CPPSELF; %PYARG_0 = %CONVERTTOPYTHON[QByteArray](ba); QByteArray b(((PyObject*)%PYSELF)->ob_type->tp_name); PyObject* aux = Shiboken::String::fromStringAndSize(%CPPSELF.constData(), %CPPSELF.size()); if (PyUnicode_CheckExact(aux)) { PyObject* tmp = PyUnicode_AsASCIIString(aux); Py_DECREF(aux); aux = tmp; } b += "('"; b += QByteArray(PyBytes_AS_STRING(aux), PyBytes_GET_SIZE(aux)); b += "')"; %PYARG_0 = Shiboken::String::fromStringAndSize(b.constData(), b.size()); if (PyBytes_Check(%PYARG_1)) { %0 = new QByteArray(PyBytes_AsString(%PYARG_1), PyBytes_GET_SIZE(%PYARG_1)); } else if (PyUnicode_CheckExact(%PYARG_1)) { Shiboken::AutoDecRef data(PyUnicode_AsASCIIString(%PYARG_1)); %0 = new QByteArray(PyBytes_AsString(data.object()), PyBytes_GET_SIZE(data.object())); } else if (Shiboken::String::check(%PYARG_1)) { %0 = new QByteArray(Shiboken::String::toCString(%PYARG_1), Shiboken::String::len(%PYARG_1)); } #if PY_VERSION_HEX < 0x03000000 Shiboken::SbkType<QByteArray>()->tp_as_buffer = &SbkQByteArrayBufferProc; Shiboken::SbkType<QByteArray>()->tp_flags |= Py_TPFLAGS_HAVE_GETCHARBUFFER; #endif %PYARG_0 = PyBytes_FromStringAndSize(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.size()); %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(PyBytes_AsString(%PYARG_1), PyBytes_GET_SIZE(%PYARG_1)); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); %PYARG_0 = Shiboken::String::fromStringAndSize(%CPPSELF.constData(), %CPPSELF.size()); return %CPPSELF.count(); if (_i < 0 || _i >= %CPPSELF.size()) { PyErr_SetString(PyExc_IndexError, "index out of bounds"); return 0; } else { char res[2]; res[0] = %CPPSELF.at(_i); res[1] = 0; return PyBytes_FromStringAndSize(res, 1); } %CPPSELF.remove(_i, 1); PyObject* args = Py_BuildValue("(nO)", _i, _value); PyObject* result = Sbk_QByteArrayFunc_insert(self, args); Py_DECREF(args); Py_XDECREF(result); return !result ? -1 : 0; Py_ssize_t max = %CPPSELF.count(); _i1 = qBound(Py_ssize_t(0), _i1, max); _i2 = qBound(Py_ssize_t(0), _i2, max); QByteArray ba; if (_i1 < _i2) ba = %CPPSELF.mid(_i1, _i2 - _i1); return %CONVERTTOPYTHON[QByteArray](ba); uchar* ptr = (uchar*) Shiboken::Buffer::getPointer(%PYARG_1); %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(ptr); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2, Shiboken::Buffer::ReadWrite); QByteArray ba; ba.resize(%2); %CPPSELF.%FUNCTION_NAME(ba.data(), ba.size()); %PYARG_0 = %CONVERTTOPYTHON[QByteArray](ba); %RETURN_TYPE %out; if (PyBytes_Check(%PYARG_0)) { %out = PyBytes_GET_SIZE((PyObject*)%PYARG_0); memcpy(%1, PyBytes_AS_STRING((PyObject*)%PYARG_0), %out); } else if (Shiboken::String::check(%PYARG_0)) { %out = Shiboken::String::len((PyObject*)%PYARG_0); memcpy(%1, Shiboken::String::toCString((PyObject*)%PYARG_0), %out); } QByteArray ba; ba.resize(%2); %CPPSELF.%FUNCTION_NAME(ba.data(), ba.size()); %PYARG_0 = %CONVERTTOPYTHON[QByteArray](ba); %RETURN_TYPE %out; if (!PyBytes_Check(%PYARG_0)) { %out = -1; } else { %out = PyBytes_GET_SIZE((PyObject*)%PYARG_0); memcpy(%1, PyBytes_AS_STRING((PyObject*)%PYARG_0), %out); } %CPPSELF.%FUNCTION_NAME(Shiboken::String::toCString(%PYARG_1), Shiboken::String::len(%PYARG_1)); %CPPSELF.unlock(); Shiboken::AutoDecRef fileNo(PyObject_GetAttrString(%PYARG_1, "fileno")); if (!fileNo.isNull()) { Shiboken::AutoDecRef fileNoValue(PyObject_CallObject(fileNo, 0)); if (%CHECKTYPE[int](fileNoValue)) { int cppFileNoValue = %CONVERTTOCPP[int](fileNoValue); %0 = new %TYPE(cppFileNoValue, %2, %3); } } Py_ssize_t size; uchar* ptr = (uchar*) Shiboken::Buffer::getPointer(%PYARG_1, &size); %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(const_cast<const uchar*>(ptr), size); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); // %FUNCTION_NAME() - disable generation of c++ function call (void) %2; // remove warning about unused variable Shiboken::AutoDecRef emptyTuple(PyTuple_New(0)); PyObject* pyTimer = Shiboken::SbkType<QTimer>()->tp_new(Shiboken::SbkType<QTimer>(), emptyTuple, 0); Shiboken::SbkType<QTimer>()->tp_init(pyTimer, emptyTuple, 0); QTimer* timer = %CONVERTTOCPP[QTimer*](pyTimer); Shiboken::AutoDecRef result( PyObject_CallMethod(pyTimer, const_cast<char*>("connect"), const_cast<char*>("OsOs"), pyTimer, SIGNAL(timeout()), %PYARG_2, %3) ); Shiboken::Object::releaseOwnership((SbkObject*)pyTimer); Py_XDECREF(pyTimer); timer->setSingleShot(true); timer->connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater())); timer->start(%1); // %FUNCTION_NAME() - disable generation of c++ function call Shiboken::AutoDecRef emptyTuple(PyTuple_New(0)); PyObject *pyTimer = Shiboken::SbkType<QTimer>()->tp_new(Shiboken::SbkType<QTimer>(), emptyTuple, 0); Shiboken::SbkType<QTimer>()->tp_init(pyTimer, emptyTuple, 0); QTimer* timer = %CONVERTTOCPP[QTimer*](pyTimer); timer->setSingleShot(true); if (PyObject_TypeCheck(%2, &PySideSignalInstanceType)) { PySideSignalInstance* signalInstance = reinterpret_cast<PySideSignalInstance*>(%2); Shiboken::AutoDecRef signalSignature(Shiboken::String::fromFormat("2%s", PySide::Signal::getSignature(signalInstance))); Shiboken::AutoDecRef result( PyObject_CallMethod(pyTimer, const_cast<char*>("connect"), const_cast<char*>("OsOO"), pyTimer, SIGNAL(timeout()), PySide::Signal::getObject(signalInstance), signalSignature.object()) ); } else { Shiboken::AutoDecRef result( PyObject_CallMethod(pyTimer, const_cast<char*>("connect"), const_cast<char*>("OsO"), pyTimer, SIGNAL(timeout()), %PYARG_2) ); } timer->connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater()), Qt::DirectConnection); Shiboken::Object::releaseOwnership((SbkObject*)pyTimer); Py_XDECREF(pyTimer); timer->start(%1); uchar* ptr = (uchar*)Shiboken::Buffer::getPointer(%PYARG_1); %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(ptr); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2, Shiboken::Buffer::ReadWrite); QByteArray ba; ba.resize(%2); %CPPSELF.%FUNCTION_NAME(ba.data(), ba.size()); %PYARG_0 = PyBytes_FromStringAndSize(ba.constData(), ba.size()); %RETURN_TYPE %out; if (!Shiboken::String::check(%PYARG_0)) { %out = -1; } else { %out = PyBytes_GET_SIZE((PyObject*)%PYARG_0); memcpy(%1, PyBytes_AS_STRING((PyObject*)%PYARG_0), %out); } QByteArray ba; ba.resize(%2); %CPPSELF.%FUNCTION_NAME(ba.data(), ba.size()); %PYARG_0 = PyBytes_FromStringAndSize(ba.constData(), ba.size()); %RETURN_TYPE %out; if (!Shiboken::String::check(%PYARG_0)) { %out = -1; } else { %out = PyBytes_GET_SIZE((PyObject*)%PYARG_0); memcpy(%1, PyBytes_AS_STRING((PyObject*)%PYARG_0), %out); } qint64 pid; %RETURN_TYPE retval = %TYPE::%FUNCTION_NAME(%1, %2, %3, &pid); %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[qint64](pid)); long result; #ifdef WIN32 _PROCESS_INFORMATION* procInfo = %CPPSELF.%FUNCTION_NAME(); result = procInfo ? procInfo->dwProcessId : 0; #else result = %CPPSELF.%FUNCTION_NAME(); #endif %PYARG_0 = %CONVERTTOPYTHON[long](result); .. class:: QCoreApplication(args) Constructs a Qt kernel application. Kernel applications are applications without a graphical user interface. These type of applications are used at the console or as server processes. The *args* argument is processed by the application, and made available in a more convenient form by the :meth:`~QCoreApplication.arguments()` method. QCoreApplication_constructor(%PYSELF, args, &%0); QCoreApplication* app = QCoreApplication::instance(); PyObject* pyApp = Py_None; if (app) { pyApp = reinterpret_cast<PyObject*>(Shiboken::BindingManager::instance().retrieveWrapper(app)); if (!pyApp) pyApp = %CONVERTTOPYTHON[QCoreApplication*](app); // this will keep app live after python exit (extra ref) } %PYARG_0 = pyApp; Py_XINCREF(%PYARG_0); long *%out = new long; %out = 0; %RETURN_TYPE %out = false; if (PySequence_Check(%PYARG_0) && (PySequence_Size(%PYARG_0) == 2)) { Shiboken::AutoDecRef pyResult(PySequence_GetItem(%PYARG_0, 0)); %out = %CONVERTTOCPP[bool](pyResult); } %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[long](*result_out)); delete result_out; .. warning:: QSettings.value can return different types (QVariant types) depending on the platform it's running on, so the safest way to use it is always casting the result to the desired type, e.g.: int(settings.value("myKey")) QByteArray data; data.resize(%2); int result = %CPPSELF.%FUNCTION_NAME(data.data(), data.size()); if (result == -1) { Py_INCREF(Py_None); %PYARG_0 = Py_None; } else { %PYARG_0 = PyBytes_FromStringAndSize(data.data(), result); } int r = %CPPSELF.%FUNCTION_NAME(%1, Shiboken::String::len(%PYARG_1)); %PYARG_0 = %CONVERTTOPYTHON[int](r); QString& res = *%0; %PYARG_0 = %CONVERTTOPYTHON[QString](res); Shiboken::Object::releaseOwnership(%PYARG_0); for(int counter = 0; counter < %CPPSELF.animationCount(); ++counter ) { QAbstractAnimation* animation = %CPPSELF.animationAt(counter); PyObject* obj = %CONVERTTOPYTHON[QAbstractAnimation*](animation); Shiboken::Object::setParent(NULL, obj); Py_DECREF(obj); } %CPPSELF.clear(); PySideEasingCurveFunctor::init(); QEasingCurve::EasingFunction func = PySideEasingCurveFunctor::createCustomFuntion(%PYSELF, %PYARG_1); if (func) %CPPSELF.%FUNCTION_NAME(func); //%FUNCTION_NAME() %PYARG_0 = PySideEasingCurveFunctor::callable(%PYSELF); <code>machine = QStateMachine() s1 = new QState() s11 = new QState(s1) s12 = new QState(s1) s1h = QHistoryState(s1) s1h.setDefaultState(s11) machine.addState(s1) s2 = QState() machine.addState(s2) button = QPushButton() # Clicking the button will cause the state machine to enter the child state # that s1 was in the last time s1 was exited, or the history state's default # state if s1 has never been entered. s1.addTransition(button.clicked, s1h)</code> if (PyObject_TypeCheck(%1, &PySideSignalInstanceType)) { PyObject* dataSource = PySide::Signal::getObject((PySideSignalInstance*) %PYARG_1); Shiboken::AutoDecRef obType(PyObject_Type(dataSource)); QObject* sender = %CONVERTTOCPP[QObject*](dataSource); if (sender) { const char* dataSignature = PySide::Signal::getSignature((PySideSignalInstance*) %PYARG_1); QByteArray signature(dataSignature); // Append SIGNAL flag (2) %0 = new QSignalTransitionWrapper(sender, "2" + signature, %2); } } QString signalName(%2); if (PySide::SignalManager::registerMetaMethod(%1, signalName.mid(1).toAscii().data(), QMetaMethod::Signal)) { QSignalTransition* %0 = %CPPSELF->addTransition(%1, %2, %3); %PYARG_0 = %CONVERTTOPYTHON[QSignalTransition*](%0); } else { Py_INCREF(Py_None); %PYARG_0 = Py_None; } // Obviously the label used by the following goto is a very awkward solution, // since it refers to a name very tied to the generator implementation. // Check bug #362 for more information on this // http://bugs.openbossa.org/show_bug.cgi?id=362 if (!PyObject_TypeCheck(%1, &PySideSignalInstanceType)) goto Sbk_%TYPEFunc_%FUNCTION_NAME_TypeError; PySideSignalInstance* signalInstance = reinterpret_cast<PySideSignalInstance*>(%1); QObject* sender = %CONVERTTOCPP[QObject*](PySide::Signal::getObject(signalInstance)); QSignalTransition* %0 = %CPPSELF->%FUNCTION_NAME(sender, PySide::Signal::getSignature(signalInstance), %2); %PYARG_0 = %CONVERTTOPYTHON[QSignalTransition*](%0); %PYARG_0 = PySet_New(0); foreach(QAbstractState* abs_state, %CPPSELF.configuration()) { Shiboken::AutoDecRef obj(%CONVERTTOPYTHON[QAbstractState*](abs_state)); Shiboken::Object::setParent(self, obj); PySet_Add(%PYARG_0, obj); } %PYARG_0 = PyList_New(0); foreach(QAbstractAnimation* abs_anim, %CPPSELF.defaultAnimations()) { Shiboken::AutoDecRef obj(%CONVERTTOPYTHON[QAbstractAnimation*](abs_anim)); Shiboken::Object::setParent(self, obj); PyList_Append(%PYARG_0, obj); } %PYARG_0 = Shiboken::String::fromFormat("2%s", QMetaObject::normalizedSignature(%1).constData()); %PYARG_0 = Shiboken::String::fromFormat("1%s", QMetaObject::normalizedSignature(%1).constData()); extern bool qRegisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *); extern bool qUnregisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *); %RETURN_TYPE %0 = %FUNCTION_NAME(%1, (uchar*)PyBytes_AS_STRING(%PYARG_2), (uchar*)PyBytes_AS_STRING(%PYARG_3), (uchar*)PyBytes_AS_STRING(%PYARG_4)); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); %RETURN_TYPE %0 = %FUNCTION_NAME(%1, (uchar*)PyBytes_AS_STRING(%PYARG_2), (uchar*)PyBytes_AS_STRING(%PYARG_3), (uchar*)PyBytes_AS_STRING(%PYARG_4)); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); ================================================ FILE: PySide/QtCore/typesystem_core_mac.xml ================================================ ================================================ FILE: PySide/QtCore/typesystem_core_maemo.xml ================================================ ================================================ FILE: PySide/QtCore/typesystem_core_win.xml ================================================ #ifdef IS_PY3K return PyCapsule_New(%in, 0, 0); #else return PyCObject_FromVoidPtr(%in, 0); #endif %out = 0; #ifdef IS_PY3K %out = (%OUTTYPE)PyCapsule_GetPointer(%in, 0); #else %out = (%OUTTYPE)PyCObject_AsVoidPtr(%in); #endif ================================================ FILE: PySide/QtCore/typesystem_core_x11.xml ================================================ ================================================ FILE: PySide/QtDeclarative/CMakeLists.txt ================================================ project(QtDeclarative) set(QtDeclarative_registerType "${CMAKE_CURRENT_SOURCE_DIR}/pysideqmlregistertype.cpp") set(QtDeclarative_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativecomponent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativecontext_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativeengine_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativeerror_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativeexpression_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativeextensioninterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativeextensionplugin_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativeimageprovider_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativeitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativelistreference_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativenetworkaccessmanagerfactory_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativeparserstatus_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativepropertymap_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativepropertyvaluesource_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativeproperty_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativescriptstring_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qdeclarativeview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative/qtdeclarative_module_wrapper.cpp ) set(QtDeclarative_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtNetwork_SOURCE_DIR}${PATH_SEP}${QtDeclarative_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(QtDeclarative_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTNETWORK_INCLUDE_DIR} ${QT_QTDECLARATIVE_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${QtGui_BINARY_DIR}/PySide/QtGui/ ${QtCore_BINARY_DIR}/PySide/QtCore/ ${QtNetwork_BINARY_DIR}/PySide/QtNetwork/ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtDeclarative) set(QtDeclarative_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTNETWORK_LIBRARY} ${QT_QTSCRIPT_LIBRARY} ${QT_QTSVG_LIBRARY} ${QT_QTSQL_LIBRARY} ${QT_QTXMLPATTERNS_LIBRARY} ${QT_QTOPENGL_LIBRARY} ${QT_QTDECLARATIVE_LIBRARY}) set(QtDeclarative_deps QtGui QtNetwork) create_pyside_module(QtDeclarative QtDeclarative_include_dirs QtDeclarative_libraries QtDeclarative_deps QtDeclarative_typesystem_path QtDeclarative_SRC QtDeclarative_registerType) ================================================ FILE: PySide/QtDeclarative/pysideqmlregistertype.cpp ================================================ /* * This file is part of the Shiboken Python Bindings Generator project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "pysideqmlregistertype.h" // Qt #include #include #include // shiboken #include #include #include // pyside #include #include #include // auto generated headers #include "qdeclarativeitem_wrapper.h" #include "pyside_qtcore_python.h" #include "pyside_qtdeclarative_python.h" #ifndef PYSIDE_MAX_QML_TYPES // Maximum number of different types the user cna export to QML using qmlRegisterType. #define PYSIDE_MAX_QML_TYPES 50 #endif // Forward declarations static void propListMetaCall(PySideProperty* pp, PyObject* self, QMetaObject::Call call, void** args); // All registered python types static PyObject* pyTypes[PYSIDE_MAX_QML_TYPES]; static void (*createFuncs[PYSIDE_MAX_QML_TYPES])(void*); // Mutex used to avoid race condition on PySide::nextQObjectMemoryAddr static QMutex nextQmlElementMutex; template struct ElementFactoryBase { static void createInto(void* memory) { QMutexLocker locker(&nextQmlElementMutex); PySide::setNextQObjectMemoryAddr(memory); Shiboken::GilState state; PyObject* obj = PyObject_CallObject(pyTypes[N], 0); if (!obj || PyErr_Occurred()) PyErr_Print(); PySide::setNextQObjectMemoryAddr(0); } }; template struct ElementFactory : ElementFactoryBase { static void init() { createFuncs[N] = &ElementFactoryBase::createInto; ElementFactory::init(); } }; template<> struct ElementFactory<0> : ElementFactoryBase<0> { static void init() { createFuncs[0] = &ElementFactoryBase<0>::createInto; } }; int PySide::qmlRegisterType(PyObject* pyObj, const char* uri, int versionMajor, int versionMinor, const char* qmlName) { using namespace Shiboken; static PyTypeObject* qobjectType = Shiboken::Conversions::getPythonTypeObject("QObject*"); static PyTypeObject* qdeclarativeType = Shiboken::Conversions::getPythonTypeObject("QDeclarativeItem*"); assert(qobjectType); static int nextType = 0; if (nextType >= PYSIDE_MAX_QML_TYPES) { PyErr_Format(PyExc_TypeError, "QML doesn't really like language bindings, so you can only export %d types to QML.", PYSIDE_MAX_QML_TYPES); return -1; } if (!PySequence_Contains(((PyTypeObject*)pyObj)->tp_mro, (PyObject*)qobjectType)) { PyErr_Format(PyExc_TypeError, "A type inherited from %s expected, got %s.", qobjectType->tp_name, ((PyTypeObject*)pyObj)->tp_name); return -1; } bool isDeclarativeType = PySequence_Contains(((PyTypeObject*)pyObj)->tp_mro, (PyObject*)qdeclarativeType); QMetaObject* metaObject = reinterpret_cast(ObjectType::getTypeUserData(reinterpret_cast(pyObj))); Q_ASSERT(metaObject); // Inc ref the type object, don't worry about dec ref them because there's no way to unregister a QML type Py_INCREF(pyObj); // All ready... now the ugly code begins... :-) pyTypes[nextType] = pyObj; // Init proxy object static meta object QDeclarativePrivate::RegisterType type; type.version = 0; if (isDeclarativeType) { type.typeId = qMetaTypeId(); type.listId = qMetaTypeId >(); type.attachedPropertiesFunction = QDeclarativePrivate::attachedPropertiesFunc(); type.attachedPropertiesMetaObject = QDeclarativePrivate::attachedPropertiesMetaObject(); type.parserStatusCast = QDeclarativePrivate::StaticCastSelector::cast(); type.valueSourceCast = QDeclarativePrivate::StaticCastSelector::cast(); type.valueInterceptorCast = QDeclarativePrivate::StaticCastSelector::cast(); } else { type.typeId = qMetaTypeId(); type.listId = qMetaTypeId >(); type.attachedPropertiesFunction = QDeclarativePrivate::attachedPropertiesFunc(); type.attachedPropertiesMetaObject = QDeclarativePrivate::attachedPropertiesMetaObject(); type.parserStatusCast = QDeclarativePrivate::StaticCastSelector::cast(); type.valueSourceCast = QDeclarativePrivate::StaticCastSelector::cast(); type.valueInterceptorCast = QDeclarativePrivate::StaticCastSelector::cast(); } type.objectSize = PySide::getSizeOfQObject(reinterpret_cast(pyObj)); type.create = createFuncs[nextType]; type.uri = uri; type.versionMajor = versionMajor; type.versionMinor = versionMinor; type.elementName = qmlName; type.metaObject = metaObject; type.extensionObjectCreate = 0; type.extensionMetaObject = 0; type.customParser = 0; int qmlTypeId = QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type); ++nextType; return qmlTypeId; } extern "C" { // This is the user data we store in the property. struct DeclarativeListProperty { PyTypeObject* type; PyObject* append; PyObject* at; PyObject* clear; PyObject* count; }; static int propListTpInit(PyObject* self, PyObject* args, PyObject* kwds) { static const char *kwlist[] = {"type", "append", "at", "clear", "count", 0}; PySideProperty* pySelf = reinterpret_cast(self); DeclarativeListProperty* data = new DeclarativeListProperty; memset(data, 0, sizeof(DeclarativeListProperty)); if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|OOO:QtDeclarative.ListProperty", (char**) kwlist, &data->type, &data->append, &data->at, &data->clear, &data->count)) { return 0; } PySide::Property::setMetaCallHandler(pySelf, &propListMetaCall); PySide::Property::setTypeName(pySelf, "QDeclarativeListProperty"); PySide::Property::setUserData(pySelf, data); return 1; } void propListTpFree(void* self) { PySideProperty* pySelf = reinterpret_cast(self); delete reinterpret_cast(PySide::Property::userData(pySelf)); // calls base type constructor Py_TYPE(pySelf)->tp_base->tp_free(self); } PyTypeObject PropertyListType = { PyVarObject_HEAD_INIT(0, 0) "ListProperty", /*tp_name*/ sizeof(PySideProperty), /*tp_basicsize*/ 0, /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc */ 0, /*tp_traverse */ 0, /*tp_clear */ 0, /*tp_richcompare */ 0, /*tp_weaklistoffset */ 0, /*tp_iter */ 0, /*tp_iternext */ 0, /*tp_methods */ 0, /*tp_members */ 0, /*tp_getset */ &PySidePropertyType, /*tp_base */ 0, /*tp_dict */ 0, /*tp_descr_get */ 0, /*tp_descr_set */ 0, /*tp_dictoffset */ propListTpInit, /*tp_init */ 0, /*tp_alloc */ 0, /*tp_new */ propListTpFree, /*tp_free */ 0, /*tp_is_gc */ 0, /*tp_bases */ 0, /*tp_mro */ 0, /*tp_cache */ 0, /*tp_subclasses */ 0, /*tp_weaklist */ 0, /*tp_del */ }; } // extern "C" // Implementation of QDeclarativeListProperty::AppendFunction callback void propListAppender(QDeclarativeListProperty* propList, QDeclarativeItem* item) { Shiboken::GilState state; Shiboken::AutoDecRef args(PyTuple_New(2)); PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType*)SbkPySide_QtCoreTypes[SBK_QOBJECT_IDX], propList->object)); PyTuple_SET_ITEM(args, 1, Shiboken::Conversions::pointerToPython((SbkObjectType*)SbkPySide_QtDeclarativeTypes[SBK_QDECLARATIVEITEM_IDX], item)); DeclarativeListProperty* data = reinterpret_cast(propList->data); Shiboken::AutoDecRef retVal(PyObject_CallObject(data->append, args)); if (PyErr_Occurred()) PyErr_Print(); } // Implementation of QDeclarativeListProperty::CountFunction callback int propListCount(QDeclarativeListProperty* propList) { Shiboken::GilState state; Shiboken::AutoDecRef args(PyTuple_New(1)); PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType*)SbkPySide_QtCoreTypes[SBK_QOBJECT_IDX], propList->object)); DeclarativeListProperty* data = reinterpret_cast(propList->data); Shiboken::AutoDecRef retVal(PyObject_CallObject(data->count, args)); // Check return type int cppResult = 0; PythonToCppFunc pythonToCpp; if (PyErr_Occurred()) PyErr_Print(); else if ((pythonToCpp = Shiboken::Conversions::isPythonToCppConvertible(Shiboken::Conversions::PrimitiveTypeConverter(), retVal))) pythonToCpp(retVal, &cppResult); return cppResult; } // Implementation of QDeclarativeListProperty::AtFunction callback QDeclarativeItem* propListAt(QDeclarativeListProperty* propList, int index) { Shiboken::GilState state; Shiboken::AutoDecRef args(PyTuple_New(2)); PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType*)SbkPySide_QtCoreTypes[SBK_QOBJECT_IDX], propList->object)); PyTuple_SET_ITEM(args, 1, Shiboken::Conversions::copyToPython(Shiboken::Conversions::PrimitiveTypeConverter(), &index)); DeclarativeListProperty* data = reinterpret_cast(propList->data); Shiboken::AutoDecRef retVal(PyObject_CallObject(data->at, args)); QDeclarativeItem* result = 0; if (PyErr_Occurred()) PyErr_Print(); else if (PyType_IsSubtype(Py_TYPE(retVal), data->type)) Shiboken::Conversions::pythonToCppPointer((SbkObjectType*)SbkPySide_QtCoreTypes[SBK_QDECLARATIVEITEM_IDX], retVal, &result); return result; } // Implementation of QDeclarativeListProperty::ClearFunction callback void propListClear(QDeclarativeListProperty* propList) { Shiboken::GilState state; Shiboken::AutoDecRef args(PyTuple_New(1)); PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType*)SbkPySide_QtCoreTypes[SBK_QOBJECT_IDX], propList->object)); DeclarativeListProperty* data = reinterpret_cast(propList->data); Shiboken::AutoDecRef retVal(PyObject_CallObject(data->clear, args)); if (PyErr_Occurred()) PyErr_Print(); } // qt_metacall specialization for ListProperties static void propListMetaCall(PySideProperty* pp, PyObject* self, QMetaObject::Call call, void** args) { if (call != QMetaObject::ReadProperty) return; DeclarativeListProperty* data = reinterpret_cast(PySide::Property::userData(pp)); QObject* qobj; Shiboken::Conversions::pythonToCppPointer((SbkObjectType*)SbkPySide_QtCoreTypes[SBK_QOBJECT_IDX], self, &qobj); QDeclarativeListProperty declProp(qobj, data, &propListAppender); if (data->count) declProp.count = &propListCount; if (data->at) declProp.at = &propListAt; if (data->clear) declProp.clear = &propListClear; // Copy the data to the memory location requested by the meta call void* v = args[0]; *reinterpret_cast*>(v) = declProp; } void PySide::initQmlSupport(PyObject* module) { ElementFactory::init(); // Export DeclarativeListProperty type if (PyType_Ready(&PropertyListType) < 0) return; Py_INCREF((PyObject*)&PropertyListType); PyModule_AddObject(module, PropertyListType.tp_name, (PyObject*)&PropertyListType); } ================================================ FILE: PySide/QtDeclarative/pysideqmlregistertype.h ================================================ /* * This file is part of the Shiboken Python Bindings Generator project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDEQMLREGISTERTYPE_H #define PYSIDEQMLREGISTERTYPE_H #include struct SbkObjectType; namespace PySide { extern void* nextQmlElementMemoryAddr; /** * Init the QML support doign things like registering QtDeclarative.ListProperty and create the necessary stuff for * qmlRegisterType. * * \param module QtDeclarative python module */ void initQmlSupport(PyObject* module); /** * PySide implementation of qmlRegisterType function. * * \param pyObj Python type to be registered. * \param uri QML element uri. * \param versionMajor QML component major version. * \param versionMinor QML component minor version. * \param qmlName QML element name * \return the metatype id of the registered type. */ int qmlRegisterType(PyObject* pyObj, const char* uri, int versionMajor, int versionMinor, const char* qmlName); } #endif ================================================ FILE: PySide/QtDeclarative/typesystem_declarative.xml ================================================ This function registers the Python type in the QML system with the name qmlName, in the library imported from uri having the version number composed from versionMajor and versionMinor. Returns the QML type id. For example, this registers a Python class MySliderItem as a QML type named Slider for version 1.0 of a module called "com.mycompany.qmlcomponents": :: qmlRegisterType(MySliderItem, "com.mycompany.qmlcomponents", 1, 0, "Slider") Once this is registered, the type can be used in QML by importing the specified module name and version number: :: import com.mycompany.qmlcomponents 1.0 Slider { ... } Note that it's perfectly reasonable for a library to register types to older versions than the actual version of the library. Indeed, it is normal for the new library to allow QML written to previous versions to continue to work, even if more advanced versions of some of its types are available. int %0 = PySide::qmlRegisterType(%ARGUMENT_NAMES); %PYARG_0 = %CONVERTTOPYTHON[int](%0); PySide::initQmlSupport(module); QByteArray key("%FUNCTION_NAME_"); key.append(%1.toLocal8Bit()); Shiboken::Object::keepReference(reinterpret_cast<SbkObject*>(%PYSELF), key.constData(), %PYARG_2); QString errorString; %BEGIN_ALLOW_THREADS %RETURN_TYPE ok_ = %CPPSELF.%FUNCTION_NAME(%1, %2, &errorString); %END_ALLOW_THREADS %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](ok_)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QString](errorString)); <code># create our data ownerData = QDeclarativePropertyMap() ownerData.insert("name", "John Smith") ownerData.insert("phone", "555-5555") # expose it to the UI layer view = QDeclarativeView() ctxt = view.rootContext() ctxt.setContextProperty("owner", ownerData) view.setSource(QUrl.fromLocalFile("main.qml")) view.show()</code> ================================================ FILE: PySide/QtGui/CMakeLists.txt ================================================ project(QtGui) if(ENABLE_X11) set(SPECIFIC_OS_FILES ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qx11info_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qx11embedcontainer_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qx11embedwidget_wrapper.cpp ) if(Q_WS_MAEMO_5) set(SPECIFIC_OS_FILES ${SPECIFIC_OS_FILES} ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstractkineticscroller_wrapper.cpp ) endif() endif() if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 6) set(QtGui_46_SRC "") else() set(QtGui_46_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmatrix2x2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmatrix2x3_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmatrix2x4_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmatrix3x2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmatrix3x3_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmatrix3x4_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmatrix4x2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmatrix4x3_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmatrix4x4_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgesture_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgestureevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgesturerecognizer_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsanchor_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsanchorlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsblureffect_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicscolorizeeffect_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsdropshadoweffect_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicseffect_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsobject_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsopacityeffect_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsrotation_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsscale_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicstransform_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qkeyeventtransition_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmouseeventtransition_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpangesture_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpinchgesture_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qquaternion_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qswipegesture_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtapandholdgesture_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtapgesture_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtilerules_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtouchevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtouchevent_touchpoint_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qvector2d_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qvector3d_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qvector4d_wrapper.cpp ) endif () if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 7) set(QtGui_47_SRC "") else() set(QtGui_47_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpainter_pixmapfragment_wrapper.cpp ) endif() set(QtGui_OPTIONAL_SRC ) set(QtGui_DROPPED_ENTRIES ) check_qt_class(QtGui QAbstractPageSetupDialog QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QAbstractPrintDialog QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QGtkStyle QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QPageSetupDialog QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QPrintDialog QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QPrintEngine QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QPrintPreviewDialog QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QPrintPreviewWidget QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QPrinter QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QPrinterInfo QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QSessionManager QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QSizeGrip QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QSystemTrayIcon QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) check_qt_class(QtGui QMacStyle QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) qt4_wrap_cpp(QPYTEXTOBJECT_MOC "${pyside_SOURCE_DIR}/qpytextobject.h") set(QtGui_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstractbutton_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstractgraphicsshapeitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstractitemdelegate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstractitemview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstractproxymodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstractscrollarea_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstractslider_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstractspinbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstracttextdocumentlayout_paintcontext_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstracttextdocumentlayout_selection_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qabstracttextdocumentlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qaccessibleevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qactionevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qactiongroup_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qaction_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qapplication_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qbitmap_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qboxlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qbrush_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qbuttongroup_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcalendarwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcdestyle_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcheckbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcleanlooksstyle_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qclipboard_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qclipboardevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcloseevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcolordialog_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcolor_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcolumnview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcombobox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcommandlinkbutton_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcommonstyle_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcompleter_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qconicalgradient_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcontextmenuevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qcursor_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdatawidgetmapper_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdateedit_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdatetimeedit_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdesktopservices_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdesktopwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdialogbuttonbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdialog_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdial_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdirmodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdockwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdoublespinbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdoublevalidator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdragenterevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdragleaveevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdragmoveevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdrag_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qdropevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qerrormessage_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfiledialog_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfileiconprovider_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfileopenevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfilesystemmodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfocusevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfocusframe_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfontcombobox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfontdatabase_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfontdialog_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfontinfo_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfontmetricsf_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfontmetrics_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qfont_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qformlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qframe_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgradient_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsellipseitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsgridlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsitemanimation_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsitemgroup_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicslayoutitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicslayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicslinearlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicslineitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicspathitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicspixmapitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicspolygonitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsproxywidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsrectitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsscenecontextmenuevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsscenedragdropevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicssceneevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsscenehelpevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsscenehoverevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsscenemouseevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsscenemoveevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicssceneresizeevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsscenewheelevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsscene_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicssimpletextitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicstextitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicsview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgraphicswidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgridlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qgroupbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qhboxlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qheaderview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qhelpevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qhideevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qhoverevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qicondragevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qiconenginev2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qiconengine_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qicon_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qimageiohandler_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qimagereader_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qimage_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qimagewriter_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qinputcontextfactory_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qinputcontext_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qinputdialog_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qinputevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qinputmethodevent_attribute_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qinputmethodevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qintvalidator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qitemdelegate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qitemeditorcreatorbase_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qitemeditorfactory_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qitemselectionmodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qitemselectionrange_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qitemselection_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qkeyevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qkeysequence_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qlabel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qlayoutitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qlcdnumber_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qlineargradient_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qlineedit_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qlistview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qlistwidgetitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qlistwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmainwindow_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmatrix_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmdiarea_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmdisubwindow_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmenubar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmenu_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmessagebox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmotifstyle_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmouseevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmoveevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qmovie_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpaintdevice_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpaintenginestate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpaintengine_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpainterpath_element_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpainterpathstroker_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpainterpath_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpainter_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpaintevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpalette_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpen_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpictureio_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpicture_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpixmapcache_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpixmapcache_key_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpixmap_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qplaintextdocumentlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qplaintextedit_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qplastiquestyle_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpolygonf_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpolygon_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qprogressbar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qprogressdialog_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qproxymodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpytextobject_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpushbutton_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qradialgradient_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qradiobutton_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qregexpvalidator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qregion_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qresizeevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qrubberband_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qscrollarea_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qscrollbar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qshortcutevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qshortcut_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qshowevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qsizepolicy_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qslider_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qsortfilterproxymodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qsound_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qspaceritem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qspinbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qsplashscreen_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qsplitterhandle_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qsplitter_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstackedlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstackedwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstandarditemmodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstandarditem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstatusbar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstatustipevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstringlistmodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleditemdelegate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstylefactory_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstylehintreturnmask_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstylehintreturnvariant_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstylehintreturn_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionbutton_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptioncombobox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptioncomplex_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiondockwidgetv2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiondockwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionfocusrect_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionframev2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionframev3_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionframe_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiongraphicsitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiongroupbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionheader_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionmenuitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionprogressbarv2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionprogressbar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionrubberband_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionsizegrip_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionslider_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionspinbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontabbarbase_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontabbarbasev2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontabv2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontabv3_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontabwidgetframe_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontab_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontitlebar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontoolbar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontoolboxv2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontoolbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptiontoolbutton_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionviewitemv2_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionviewitemv3_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionviewitemv4_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoptionviewitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyleoption_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstylepainter_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qstyle_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qsyntaxhighlighter_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtabbar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtabletevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtableview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtablewidgetitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtablewidgetselectionrange_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtablewidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtabwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextblockformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextblockgroup_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextblock_iterator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextblockuserdata_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextblock_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextbrowser_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextcharformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextcursor_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextdocumentfragment_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextdocument_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextedit_extraselection_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextedit_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextfragment_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextframeformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextframe_iterator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextframe_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextimageformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextinlineobject_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextlayout_formatrange_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextlength_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextline_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextlistformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextlist_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextobjectinterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextobject_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextoption_tab_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtextoption_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtexttablecellformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtexttablecell_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtexttableformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtexttable_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtgui_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtimeedit_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtoolbar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtoolbarchangeevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtoolbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtoolbutton_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtooltip_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtransform_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtreeview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtreewidgetitemiterator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtreewidgetitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qtreewidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qundocommand_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qundogroup_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qundostack_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qundoview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qvalidator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qvboxlayout_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qwhatsthisclickedevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qwhatsthis_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qwheelevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qwidgetaction_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qwidgetitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qwindowsstyle_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qwindowstatechangeevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qwizardpage_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qwizard_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qworkspace_wrapper.cpp ${SPECIFIC_OS_FILES} ${QtGui_46_SRC} ${QtGui_47_SRC} ${QtGui_OPTIONAL_SRC} ) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/typesystem_gui.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/typesystem_gui.xml" @ONLY) set(QtGui_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}") set(QtGui_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/ ${pyside_SOURCE_DIR} ${QT_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore/) set(QtGui_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTGUI_LIBRARY}) set(QtGui_deps "QtCore") create_pyside_module(QtGui QtGui_include_dirs QtGui_libraries QtGui_deps QtGui_typesystem_path QtGui_SRC QPYTEXTOBJECT_MOC ${CMAKE_CURRENT_BINARY_DIR}/typesystem_gui.xml) install(FILES ${pyside_SOURCE_DIR}/qpytextobject.h DESTINATION include/PySide/QtGui/) ================================================ FILE: PySide/QtGui/glue/qapplication_init.cpp ================================================ // Borrowed reference to QtGui module extern PyObject* moduleQtGui; static int QApplicationArgCount; static char** QApplicationArgValues; static const char QAPP_MACRO[] = "qApp"; bool QApplicationConstructorStart(PyObject* argv) { if (QApplication::instance()) { PyErr_SetString(PyExc_RuntimeError, "A QApplication instance already exists."); return false; } return Shiboken::sequenceToArgcArgv(argv, &QApplicationArgCount, &QApplicationArgValues, "PySideApp"); } void QApplicationConstructorEnd(PyObject* self) { // Verify if qApp is in main module PyObject* globalsDict = PyEval_GetGlobals(); if (globalsDict) { PyObject* qAppObj = PyDict_GetItemString(globalsDict, QAPP_MACRO); if (qAppObj) PyDict_SetItemString(globalsDict, QAPP_MACRO, self); } PyObject_SetAttrString(moduleQtGui, QAPP_MACRO, self); PySide::registerCleanupFunction(&PySide::destroyQCoreApplication); Py_INCREF(self); } static void QApplicationConstructor(PyObject* self, PyObject* argv, QApplicationWrapper** cptr) { if (QApplicationConstructorStart(argv)) { *cptr = new QApplicationWrapper(QApplicationArgCount, QApplicationArgValues); Shiboken::Object::releaseOwnership(reinterpret_cast(self)); QApplicationConstructorEnd(self); } } template static void QApplicationConstructor(PyObject* self, PyObject* argv, T extraArg, QApplicationWrapper** cptr) { if (QApplicationConstructorStart(argv)) { *cptr = new QApplicationWrapper(QApplicationArgCount, QApplicationArgValues, extraArg); Shiboken::Object::releaseOwnership(reinterpret_cast(self)); QApplicationConstructorEnd(self); } } ================================================ FILE: PySide/QtGui/glue/qlayout_help_functions.cpp ================================================ void addLayoutOwnership(QLayout* layout, QLayoutItem* item); void removeLayoutOwnership(QLayout* layout, QWidget* widget); inline QByteArray retrieveObjectName(PyObject* obj) { Shiboken::AutoDecRef objName(PyObject_Str(obj)); return Shiboken::String::toCString(objName); } inline void addLayoutOwnership(QLayout* layout, QWidget* widget) { //transfer ownership to parent widget QWidget *lw = layout->parentWidget(); QWidget *pw = widget->parentWidget(); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QWidget*](widget)); //Transfer parent to layout widget if (pw && lw && pw != lw) Shiboken::Object::setParent(0, pyChild); if (!lw && !pw) { //keep the reference while the layout is orphan Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget*](layout)); Shiboken::Object::keepReference(reinterpret_cast(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild, true); } else { if (!lw) lw = pw; Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget*](lw)); Shiboken::Object::setParent(pyParent, pyChild); } } inline void addLayoutOwnership(QLayout* layout, QLayout* other) { //transfer all children widgets from other to layout parent widget QWidget* parent = layout->parentWidget(); if (!parent) { //keep the reference while the layout is orphan Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QLayout*](layout)); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QLayout*](other)); Shiboken::Object::keepReference(reinterpret_cast(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild, true); return; } for (int i=0, i_max=other->count(); i < i_max; i++) { QLayoutItem* item = other->itemAt(i); if (PyErr_Occurred() || !item) return; addLayoutOwnership(layout, item); } Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QLayout*](layout)); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QLayout*](other)); Shiboken::Object::setParent(pyParent, pyChild); } inline void addLayoutOwnership(QLayout* layout, QLayoutItem* item) { if (!item) return; QWidget* w = item->widget(); if (w) addLayoutOwnership(layout, w); else { QLayout* l = item->layout(); if (l) addLayoutOwnership(layout, l); } Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QLayout*](layout)); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QLayoutItem*](item)); Shiboken::Object::setParent(pyParent, pyChild); } static void removeWidgetFromLayout(QLayout* layout, QWidget* widget) { QWidget* parent = widget->parentWidget(); if (!parent) { //remove reference on layout Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget*](layout)); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QWidget*](widget)); Shiboken::Object::removeReference(reinterpret_cast(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild); } else { //give the ownership to parent Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget*](parent)); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QWidget*](widget)); Shiboken::Object::setParent(pyParent, pyChild); } } inline void removeLayoutOwnership(QLayout* layout, QLayoutItem* item) { QWidget* w = item->widget(); if (w) removeWidgetFromLayout(layout, w); else { QLayout* l = item->layout(); if (l) removeLayoutOwnership(layout, l); } Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QLayoutItem*](item)); Shiboken::Object::invalidate(pyChild); Shiboken::Object::setParent(0, pyChild); } inline void removeLayoutOwnership(QLayout* layout, QWidget* widget) { if (!widget) return; for (int i=0, i_max=layout->count(); i < i_max; i++) { QLayoutItem* item = layout->itemAt(i); if (PyErr_Occurred() || !item) return; if (item->widget() == widget) removeLayoutOwnership(layout, item); } } ================================================ FILE: PySide/QtGui/glue/qmenu_glue.cpp ================================================ inline PyObject* addActionWithPyObject(QMenu* self, const QIcon& icon, const QString& text, PyObject* callback, const QKeySequence& shortcut) { QAction* act = new QAction(text, self); if (!icon.isNull()) act->setIcon(icon); if (!shortcut.isEmpty()) act->setShortcut(shortcut); self->addAction(act); PyObject* pyAct = %CONVERTTOPYTHON[QAction*](act); Shiboken::AutoDecRef result(PyObject_CallMethod(pyAct, "connect", "OsO", pyAct, SIGNAL(triggered()), callback)); if (result.isNull()) { Py_DECREF(pyAct); return 0; } return pyAct; } ================================================ FILE: PySide/QtGui/glue/qmenubar_glue.cpp ================================================ inline PyObject* addActionWithPyObject(QMenuBar* self, const QString& text, PyObject* callback) { QAction* act = new QAction(text, self); self->addAction(act); PyObject* pyAct = %CONVERTTOPYTHON[QAction*](act); PyObject* result = PyObject_CallMethod(pyAct, "connect", "OsO", pyAct, SIGNAL(triggered(bool)), callback); if (result == 0 || result == Py_False) { if (result) Py_DECREF(result); Py_DECREF(pyAct); return 0; } return pyAct; } ================================================ FILE: PySide/QtGui/glue/qtgui_qapp.cpp ================================================ // Init qApp macro to None. if (qApp) { PyObject* pyApp = %CONVERTTOPYTHON[QApplication*](qApp); Py_INCREF(pyApp); PyModule_AddObject(module, "qApp", pyApp); } else { Py_INCREF(Py_None); PyModule_AddObject(module, "qApp", Py_None); } moduleQtGui = module; ================================================ FILE: PySide/QtGui/glue/qwidget_glue.cpp ================================================ static QString retrieveObjectName(PyObject *obj) { Shiboken::AutoDecRef objName(PyObject_Str(obj)); return QString(Shiboken::String::toCString(objName)); } /** * Tranfer objects ownership from layout to widget **/ static inline void qwidgetReparentLayout(QWidget *parent, QLayout *layout) { Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget*](parent)); for (int i=0; i < layout->count(); i++) { QLayoutItem* item = layout->itemAt(i); if (PyErr_Occurred() || !item) return; QWidget* w = item->widget(); if (w) { QWidget* pw = w->parentWidget(); if (pw != parent) { Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QWidget*](w)); Shiboken::Object::setParent(pyParent, pyChild); } } else { QLayout* l = item->layout(); if (l) qwidgetReparentLayout(parent, l); } } Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QLayout*](layout)); Shiboken::Object::setParent(pyParent, pyChild); //remove previous references Shiboken::Object::keepReference(reinterpret_cast(pyChild.object()), qPrintable(retrieveObjectName(pyChild)), Py_None); } static inline void qwidgetSetLayout(QWidget *self, QLayout *layout) { if (!layout || self->layout()) return; QObject* oldParent = layout->parent(); if (oldParent && oldParent != self) { if (oldParent->isWidgetType()) { // remove old parent policy Shiboken::AutoDecRef pyLayout(%CONVERTTOPYTHON[QLayout*](layout)); Shiboken::Object::setParent(Py_None, pyLayout); } else { PyErr_Format(PyExc_RuntimeError, "QWidget::setLayout: Attempting to set QLayout \"%s\" on %s \"%s\", when the QLayout already has a parent", qPrintable(layout->objectName()), self->metaObject()->className(), qPrintable(self->objectName())); return; } } if (oldParent != self) { qwidgetReparentLayout(self, layout); if (PyErr_Occurred()) return; self->setLayout(layout); } } ================================================ FILE: PySide/QtGui/typesystem_gui.xml.in ================================================ ================================================ FILE: PySide/QtGui/typesystem_gui_common.xml ================================================ QTransform _result; if (QTransform::quadToQuad(%1, %2, _result)) { %PYARG_0 = %CONVERTTOPYTHON[QTransform](_result); } else { Py_INCREF(Py_None); %PYARG_0 = Py_None; } QTransform _result; if (QTransform::quadToSquare(%1, _result)) { %PYARG_0 = %CONVERTTOPYTHON[QTransform](_result); } else { Py_INCREF(Py_None); %PYARG_0 = Py_None; } QTransform _result; if (QTransform::squareToQuad(%1, _result)) { %PYARG_0 = %CONVERTTOPYTHON[QTransform](_result); } else { Py_INCREF(Py_None); %PYARG_0 = Py_None; } uchar* buffer = (uchar*) Shiboken::Buffer::getPointer(%PYARG_2); QBitmap %0 = QBitmap::fromData(%1, buffer, %3); %PYARG_0 = %CONVERTTOPYTHON[QBitmap](%0); %BEGIN_ALLOW_THREADS %RETURN_TYPE %0 = %CPPSELF->::%TYPE::%FUNCTION_NAME(&%1, %2); %END_ALLOW_THREADS %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[%ARG1_TYPE](%1)); if (_i < 0 || _i >= %CPPSELF.count()) { PyErr_SetString(PyExc_IndexError, "index out of bounds"); return 0; } int item = (*%CPPSELF)[_i]; return %CONVERTTOPYTHON[int](item); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.data(), %CPPSELF.size()); PyObject* %out = Shiboken::Buffer::newObject(%in, size); Py_ssize_t bufferLen; char* %out = (char*) Shiboken::Buffer::getPointer(%PYARG_1, &bufferLen); uint %out = bufferLen; const QTextDocument* doc = %CPPSELF.document(); if (doc) { Shiboken::AutoDecRef pyDocument(%CONVERTTOPYTHON[QTextDocument*](doc)); Shiboken::Object::setParent(pyDocument, %PYARG_1); } const QTextDocument* doc = %CPPSELF.document(); if (doc) { Shiboken::AutoDecRef pyDocument(%CONVERTTOPYTHON[QTextDocument*](doc)); Shiboken::Object::setParent(pyDocument, %PYARG_0); } PyObject* points = PyList_New(%CPPSELF.count()); for (int i = 0, max = %CPPSELF.count(); i < max; ++i){ int x, y; %CPPSELF.point(i, &x, &y); QPoint pt = QPoint(x, y); PyList_SET_ITEM(points, i, %CONVERTTOPYTHON[QPoint](pt)); } // %FUNCTION_NAME() *%CPPSELF << %1; %PYARG_0 = %CONVERTTOPYTHON[QPolygon*](%CPPSELF); // %FUNCTION_NAME() *%CPPSELF << %1; %PYARG_0 = %CONVERTTOPYTHON[QPolygon*](%CPPSELF); if (**%CPPSELF) { QTreeWidgetItemIterator* %0 = new QTreeWidgetItemIterator((*%CPPSELF)++); %PYARG_0 = %CONVERTTOPYTHON[QTreeWidgetItemIterator*](%0); } QTreeWidgetItem* %0 = %CPPSELF.operator*(); %PYARG_0 = %CONVERTTOPYTHON[QTreeWidgetItem*](%0); Shiboken::Object::releaseOwnership(%PYARG_0); %0 = new %TYPE(QPixmap::fromImage(%1)); const uchar* %out = reinterpret_cast<const uchar*>(PyBytes_AS_STRING(%PYARG_1)); uint %out = static_cast<uint>(PyBytes_Size(%PYARG_1)); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.byteCount()); // byteCount() is only available on Qt4.7, so we use bytesPerLine * height %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.bytesPerLine() * %CPPSELF.height(), Shiboken::Buffer::ReadWrite); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1), %CPPSELF.bytesPerLine()); %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1), %CPPSELF.bytesPerLine(), Shiboken::Buffer::ReadWrite); Shiboken::AutoDecRef func(PyObject_GetAttr(%PYSELF, PyTuple_GET_ITEM(%1, 0))); PyObject* args = PyTuple_GET_ITEM(%1, 1); %PYARG_0 = PyObject_Call(func, args, NULL); switch(%CPPSELF.spec()) { case QColor::Rgb: { qreal r, g, b, a; %CPPSELF.getRgbF(&r, &g, &b, &a); %PYARG_0 = Py_BuildValue("(ON(s(ffff)))", Py_TYPE(%PYSELF), PyTuple_New(0), "setRgbF", (float)r, (float)g, (float)b, (float)a); break; } case QColor::Hsv: { qreal h, s, v, a; %CPPSELF.getHsvF(&h, &s, &v, &a); %PYARG_0 = Py_BuildValue("(ON(s(ffff)))", Py_TYPE(%PYSELF), PyTuple_New(0), "setHsvF", (float)h, (float)s, (float)v, (float)a); break; } case QColor::Cmyk: { qreal c, m, y, k, a; %CPPSELF.getCmykF(&c, &m, &y, &k, &a); %PYARG_0 = Py_BuildValue("(ON(s(fffff)))", Py_TYPE(%PYSELF), PyTuple_New(0), "setCmykF", (float)c, (float)m, (float)y, (float)k, (float)a); break; } #if QT_VERSION >= 0x040600 case QColor::Hsl: { qreal h, s, l, a; %CPPSELF.getHslF(&h, &s, &l, &a); %PYARG_0 = Py_BuildValue("(ON(s(ffff)))", Py_TYPE(%PYSELF), PyTuple_New(0), "setHslF", (float)h, (float)s, (float)l, (float)a); break; } #endif default: { %PYARG_0 = Py_BuildValue("(N(O))", PyObject_Type(%PYSELF), Py_None); } } switch(%CPPSELF.spec()) { case QColor::Rgb: { int r, g, b, a; %CPPSELF.getRgb(&r, &g, &b, &a); %PYARG_0 = Py_BuildValue("iiii", r, g, b, a); break; } case QColor::Hsv: { int h, s, v, a; %CPPSELF.getHsv(&h, &s, &v, &a); %PYARG_0 = Py_BuildValue("iiii", h, s, v, a); break; } case QColor::Cmyk: { int c, m, y, k, a; %CPPSELF.getCmyk(&c, &m, &y, &k, &a); %PYARG_0 = Py_BuildValue("iiiii", c, m, y, k, a); break; } case QColor::Hsl: { int h, s, l, a; %CPPSELF.getHsl(&h, &s, &l, &a); %PYARG_0 = Py_BuildValue("iiii", h, s, l, a); break; } default: { %PYARG_0 = 0; } } if (%1.type() == QVariant::Color) %0 = new %TYPE(%1.value<QColor>()); else PyErr_SetString(PyExc_TypeError, "QVariant must be holding a QColor"); int* array = NULL; bool errorOccurred = false; if (numArgs == 5) { array = Shiboken::sequenceToIntArray(%PYARG_5, true); if (PyErr_Occurred()) { if (array) delete []array; errorOccurred = true; } } if (!errorOccurred) { %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, array); if (array) delete []array; %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval); } int* array = NULL; bool errorOccurred = false; if (numArgs == 4) { array = Shiboken::sequenceToIntArray(%PYARG_4, true); if (PyErr_Occurred()) { if (array) delete []array; errorOccurred = true; } } if (!errorOccurred) { %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, array); if (array) delete []array; %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval); } int* array = NULL; bool errorOccurred = false; if (numArgs == 8) { array = Shiboken::sequenceToIntArray(%PYARG_8, true); if (PyErr_Occurred()) { if (array) delete []array; errorOccurred = true; } } if (!errorOccurred) { %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, %7, array); if (array) delete []array; %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval); } int* array = NULL; bool errorOccurred = false; if (numArgs == 5) { array = Shiboken::sequenceToIntArray(%PYARG_5, true); if (PyErr_Occurred()) { if (array) delete []array; errorOccurred = true; } } if (!errorOccurred) { %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, array); if (array) delete []array; %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval); } int* array = NULL; bool errorOccurred = false; if (numArgs == 4) { array = Shiboken::sequenceToIntArray(%PYARG_4, true); if (PyErr_Occurred()) { if (array) delete []array; errorOccurred = true; } } if (!errorOccurred) { %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, array); if (array) delete []array; %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval); } PyObject* userTypeConstant = PyInt_FromLong(QGraphicsItem::UserType); PyDict_SetItemString(Sbk_QGraphicsItem_Type.super.ht_type.tp_dict, "UserType", userTypeConstant); QGraphicsItem *item_ = NULL; %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&item_); %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval_)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QGraphicsItem*](item_)); Shiboken::Object::releaseOwnership(%PYARG_2); //this function is static we need keep ref to default value, to be able to call python virtual functions static PyObject* _defaultValue = 0; %CPPSELF.%FUNCTION_NAME(%1); Py_INCREF(%PYARG_1); if (_defaultValue) Py_DECREF(_defaultValue); _defaultValue = %PYARG_1; %PYARG_0 = addActionWithPyObject(%CPPSELF, QIcon(), %1, %2, %3); %PYARG_0 = addActionWithPyObject(%CPPSELF, %1, %2, %3, %4); Shiboken::BindingManager& bm = Shiboken::BindingManager::instance(); PyObject* pyObj; foreach(QAction* act, %CPPSELF.actions()) { if ((pyObj = (PyObject*)bm.retrieveWrapper(act)) != 0) { Py_INCREF(pyObj); Shiboken::Object::setParent(NULL, pyObj); Shiboken::Object::invalidate(pyObj); Py_DECREF(pyObj); } } %PYARG_0 = addActionWithPyObject(%CPPSELF, %1, %2); foreach(QAction *act, %CPPSELF.actions()) { Shiboken::AutoDecRef pyAct(%CONVERTTOPYTHON[QAction*](act)); Shiboken::Object::setParent(NULL, pyAct); Shiboken::Object::invalidate(pyAct); } QPixmap p; if (%CPPSELF.%FUNCTION_NAME(%1, &p)) { %PYARG_0 = %CONVERTTOPYTHON[QPixmap](p); } else { %PYARG_0 = Py_None; Py_INCREF(%PYARG_0); } %0 = new %TYPE(%1, %2); Shiboken::AutoDecRef result(PyObject_CallMethod(%PYSELF, "connect", "OsO", %PYSELF, SIGNAL(activated()), %PYARG_3)); if (!result.isNull()) Shiboken::Object::setParent(%PYARG_2, %PYSELF); // Clear parent from the old child QStandardItem* _i = %CPPSELF->child(%1, %2); if (_i) { PyObject* _pyI = %CONVERTTOPYTHON[QStandardItem*](_i); Shiboken::Object::setParent(0, _pyI); } // Clear parent from the old child QStandardItem* _i = %CPPSELF->child(%1); if (_i) { PyObject* _pyI = %CONVERTTOPYTHON[QStandardItem*](_i); Shiboken::Object::setParent(0, _pyI); } QWidget *_widget = %CPPSELF.widget(%1); if (_widget) { Shiboken::AutoDecRef pyWidget(%CONVERTTOPYTHON[QWidget*](_widget)); Shiboken::Object::setParent(0, pyWidget); } bool ret = !(&%CPPSELF == %1); %PYARG_0 = %CONVERTTOPYTHON[bool](ret); addLayoutOwnership(%CPPSELF, %0); removeLayoutOwnership(%CPPSELF, %1); removeLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %2); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %2); addLayoutOwnership(%CPPSELF, %2); addLayoutOwnership(%CPPSELF, %2); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %2); addLayoutOwnership(%CPPSELF, %0); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %1); addLayoutOwnership(%CPPSELF, %1); int a, b, c, d; %CPPSELF.%FUNCTION_NAME(%1, &a, &b, &c, &d); %PYARG_0 = PyTuple_New(4); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[int](a)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[int](b)); PyTuple_SET_ITEM(%PYARG_0, 2, %CONVERTTOPYTHON[int](c)); PyTuple_SET_ITEM(%PYARG_0, 3, %CONVERTTOPYTHON[int](d)); int %out = PySequence_Size(%PYARG_1); int numItems = PySequence_Size(%PYARG_1); Shiboken::AutoArrayPointer<QGraphicsItem*> %out(numItems); for (int i=0; i < numItems; i++) { %out[i] = %CONVERTTOCPP[QGraphicsItem*](PySequence_Fast_GET_ITEM(%PYARG_1, i)); } Shiboken::AutoDecRef object(PyList_New(0)); for (int i=0, max=numItems; i < max; i++) { PyList_Append(object, %CONVERTTOPYTHON[QGraphicsItem*](%in[i])); } PyObject *%out = object.object(); Shiboken::AutoDecRef option_object(PyList_New(0)); for (int i=0, max=numItems; i < max; i++) { const QStyleOptionGraphicsItem* item = &%in[i]; PyList_Append(option_object, %CONVERTTOPYTHON[QStyleOptionGraphicsItem](item)); } PyObject* %out = option_object.object(); int numOptions = PySequence_Size(%PYARG_2); Shiboken::AutoArrayPointer<QStyleOptionGraphicsItem> %out(numOptions); for (int i=0; i < numOptions; i++) { %out[i] = %CONVERTTOCPP[QStyleOptionGraphicsItem](PySequence_Fast_GET_ITEM(%PYARG_1, i)); } QGraphicsItem* parentItem = %1->parentItem(); Shiboken::AutoDecRef parent(%CONVERTTOPYTHON[QGraphicsItem*](parentItem)); foreach (QGraphicsItem* item, %1->children()) Shiboken::Object::setParent(parent, %CONVERTTOPYTHON[QGraphicsItem*](item)); %BEGIN_ALLOW_THREADS %CPPSELF.%FUNCTION_NAME(%1); %END_ALLOW_THREADS // the arg was destroyed by Qt. Shiboken::Object::invalidate(%PYARG_1); %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(%1, %2); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); Shiboken::Object::keepReference((SbkObject*)%PYARG_0, "setWidget(QWidget*)1", %PYARG_1); const QList<QGraphicsItem*> items = %CPPSELF.items(); Shiboken::BindingManager& bm = Shiboken::BindingManager::instance(); foreach (QGraphicsItem* item, items) { SbkObject* obj = bm.retrieveWrapper(item); if (obj) { if (reinterpret_cast<PyObject*>(obj)->ob_refcnt > 1) // If the refcnt is 1 the object will vannish anyway. Shiboken::Object::invalidate(obj); Shiboken::Object::removeParent(obj); } } %CPPSELF.%FUNCTION_NAME(); QTreeWidgetItem *rootItem = %CPPSELF.invisibleRootItem(); Shiboken::BindingManager &bm = Shiboken::BindingManager::instance(); for (int i = 0; i < rootItem->childCount(); ++i) { QTreeWidgetItem *item = rootItem->child(i); SbkObject* wrapper = bm.retrieveWrapper(item); if (wrapper) Shiboken::Object::setParent(0, reinterpret_cast<PyObject*>(wrapper)); } // Only call the parent function if this return some value // the parent can be the TreeWidget if (%0) Shiboken::Object::setParent(%PYARG_0, %PYSELF); // Only call the parent function if this return some value // the parent can be the TreeWidgetItem if (%0) Shiboken::Object::setParent(%PYARG_0, %PYSELF); Shiboken::Object::keepReference(reinterpret_cast<SbkObject*>(%PYSELF), "__style__", %PYARG_1); QStyle* myStyle = %CPPSELF->style(); if (myStyle && qApp) { %PYARG_0 = %CONVERTTOPYTHON[QStyle*](myStyle); QStyle *appStyle = qApp->style(); if (appStyle == myStyle) { Shiboken::AutoDecRef pyApp(%CONVERTTOPYTHON[QApplication*](qApp)); Shiboken::Object::setParent(pyApp, %PYARG_0); Shiboken::Object::releaseOwnership(%PYARG_0); } else { Shiboken::Object::keepReference(reinterpret_cast<SbkObject*>(%PYSELF), "__style__", %PYARG_0); } } qwidgetSetLayout(%CPPSELF, %1); // %FUNCTION_NAME() - disable generation of function call. Returns the window system identifier of the widget. Portable in principle, but if you use it you are probably about to do something non-portable. Be careful. If a widget is non-native (alien) and winId() is invoked on it, that widget will be provided a native handle. On X11 the type returned is long, on other platforms it's void pointer casted to a Python long long. This value may change at run-time. An event with type PySide.QtCore.QEvent.WinIdChange will be sent to the widget following a change in window system identifier. QWidget* tab = %CPPSELF.widget(%1); if (tab) { Shiboken::AutoDecRef pyWidget(%CONVERTTOPYTHON[QWidget*](tab)); %CPPSELF.%FUNCTION_NAME(%1); } for (int i = 0; i < %CPPSELF.count(); i++) { QWidget* widget = %CPPSELF.widget(i); Shiboken::AutoDecRef pyWidget(%CONVERTTOPYTHON[QWidget*](widget)); Shiboken::Object::setParent(0, pyWidget); } %CPPSELF.%FUNCTION_NAME(); // Clear parent from the old child QStandardItem* _i = %CPPSELF->item(%1, %2); if (_i) { PyObject* _pyI = %CONVERTTOPYTHON[QStandardItem*](_i); Shiboken::Object::setParent(0, _pyI); } // Clear parent from the old child QStandardItem* _i = %CPPSELF->item(%1); if (_i) { PyObject* _pyI = %CONVERTTOPYTHON[QStandardItem*](_i); Shiboken::Object::setParent(0, _pyI); } // Clear parent from the old child QStandardItem* _i = %CPPSELF->verticalHeaderItem(%1); if (_i) { PyObject* _pyI = %CONVERTTOPYTHON[QStandardItem*](_i); Shiboken::Object::setParent(0, _pyI); } Shiboken::BindingManager& bm = Shiboken::BindingManager::instance(); SbkObject* pyRoot = bm.retrieveWrapper(%CPPSELF.invisibleRootItem()); if (pyRoot) { Shiboken::Object::destroy(pyRoot, %CPPSELF.invisibleRootItem()); } for(int r=0, r_max = %CPPSELF.rowCount(); r < r_max; r++) { QList<QStandardItem *> ri = %CPPSELF.takeRow(0); PyObject *pyResult = %CONVERTTOPYTHON[QList<QStandardItem * >](ri); Shiboken::Object::setParent(Py_None, pyResult); Py_XDECREF(pyResult); } %BEGIN_ALLOW_THREADS %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2); %END_ALLOW_THREADS %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval_)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[%ARG1_TYPE](%1)); :: def callback_int(value_as_int): print 'int value changed:', repr(value_as_int) app = QApplication(sys.argv) spinbox = QSpinBox() spinbox.valueChanged[unicode].connect(callback_unicode) spinbox.show() sys.exit(app.exec_()) :: def callback_unicode(value_as_unicode): print 'unicode value changed:', repr(value_as_unicode) app = QApplication(sys.argv) spinbox = QSpinBox() spinbox.valueChanged[unicode].connect(callback_unicode) spinbox.show() sys.exit(app.exec_()) QAction* action = %CPPSELF.addAction(%1, %2); %PYARG_0 = %CONVERTTOPYTHON[QAction*](action); Shiboken::AutoDecRef result(PyObject_CallMethod(%PYARG_0, "connect", "OsO", %PYARG_0, SIGNAL(triggered()), %PYARG_3)); QAction* action = %CPPSELF.addAction(%1); %PYARG_0 = %CONVERTTOPYTHON[QAction*](action); Shiboken::AutoDecRef result(PyObject_CallMethod(%PYARG_0, "connect", "OsO", %PYARG_0, SIGNAL(triggered()), %PYARG_2)); QList<PyObject* > lst; Shiboken::BindingManager& bm = Shiboken::BindingManager::instance(); foreach(QToolButton* child, %CPPSELF.findChildren<QToolButton*>()) { if (bm.hasWrapper(child)) { PyObject* pyChild = %CONVERTTOPYTHON[QToolButton*](child); Shiboken::Object::setParent(0, pyChild); lst << pyChild; } } //Remove actions foreach(QAction *act, %CPPSELF.actions()) { Shiboken::AutoDecRef pyAct(%CONVERTTOPYTHON[QAction*](act)); Shiboken::Object::setParent(NULL, pyAct); Shiboken::Object::invalidate(pyAct); } %CPPSELF.clear(); foreach(PyObject* obj, lst) { Shiboken::Object::invalidate(reinterpret_cast<SbkObject* >(obj)); Py_XDECREF(obj); } %BEGIN_ALLOW_THREADS %CPPSELF.%FUNCTION_NAME(%1.data(), %1.size(), %2); %END_ALLOW_THREADS %BEGIN_ALLOW_THREADS %CPPSELF.%FUNCTION_NAME(%1.data(), %1.size(), %2); %END_ALLOW_THREADS PyObject* moduleQtGui; QApplicationConstructor(%PYSELF, %1, &%0); QApplicationConstructor(%PYSELF, %1, %2, &%0); QApplicationConstructor(%PYSELF, %1, %2, &%0); Shiboken::Object::setParent(%CONVERTTOPYTHON[QApplication*](qApp), %PYARG_1); QWidget* _old = %CPPSELF.widget(); if (_old) Shiboken::Object::setParent(NULL, %CONVERTTOPYTHON[QWidget*](_old)); %CPPSELF.%FUNCTION_NAME(%1); Shiboken::Object::setParent(%PYSELF, %PYARG_1); if (PySequence_Size(%PYARG_1) == 16) { qreal values[16]; for(int i=0; i < 16; i++) { PyObject *pv = PySequence_Fast_GET_ITEM(%PYARG_1, i); values[i] = PyFloat_AsDouble(pv); } %0 = new %TYPE(values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11], values[12], values[13], values[14], values[15]); } qreal values[16]; %CPPSELF.%FUNCTION_NAME(values); %PYARG_0 = PyTuple_New(16); for(int i=0; i < 16; i++) { PyObject *v = PyFloat_FromDouble(values[i]); PyTuple_SET_ITEM(%PYARG_0, i, v); } if (PySequence_Check(_key)) { Shiboken::AutoDecRef key(PySequence_Fast(_key, "Invalid matrix index.")); if (PySequence_Fast_GET_SIZE(key.object()) == 2) { PyObject* posx = PySequence_Fast_GET_ITEM(key.object(), 0); PyObject* posy = PySequence_Fast_GET_ITEM(key.object(), 1); Py_ssize_t x = PyInt_AsSsize_t(posx); Py_ssize_t y = PyInt_AsSsize_t(posy); qreal ret = (*%CPPSELF)(x,y); return %CONVERTTOPYTHON[qreal](ret); } } PyErr_SetString(PyExc_IndexError, "Invalid matrix index."); return 0; ================================================ FILE: PySide/QtGui/typesystem_gui_mac.xml ================================================ ================================================ FILE: PySide/QtGui/typesystem_gui_maemo.xml ================================================ ================================================ FILE: PySide/QtGui/typesystem_gui_simulator.xml ================================================ ================================================ FILE: PySide/QtGui/typesystem_gui_win.xml ================================================ #ifdef IS_PY3K return PyCapsule_New(%in, 0, 0); #else return PyCObject_FromVoidPtr(%in, 0); #endif %out = 0; #ifdef IS_PY3K %out = (%OUTTYPE)PyCapsule_GetPointer(%in, 0); #else %out = (%OUTTYPE)PyCObject_AsVoidPtr(%in); #endif ================================================ FILE: PySide/QtGui/typesystem_gui_x11.xml ================================================ %PYARG_0 = PyLong_FromVoidPtr(%TYPE::%FUNCTION_NAME()); %PYARG_0 = PyLong_FromVoidPtr(%CPPSELF.%FUNCTION_NAME()); %PYARG_0 = PyLong_FromVoidPtr(%CPPSELF.%FUNCTION_NAME()); ================================================ FILE: PySide/QtHelp/CMakeLists.txt ================================================ project(QtHelp) set(QtHelp_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpcontentitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpcontentmodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpcontentwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpenginecore_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpengine_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpindexmodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpindexwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpsearchengine_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpsearchquerywidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpsearchquery_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qhelpsearchresultwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp/qthelp_module_wrapper.cpp ) set(QtHelp_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtHelp_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(QtHelp_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTHELP_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${QtGui_BINARY_DIR}/PySide/QtGui/ ${QtCore_BINARY_DIR}/PySide/QtCore/ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtHelp) set(QtHelp_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTHELP_LIBRARY}) set(QtHelp_deps QtGui) create_pyside_module(QtHelp QtHelp_include_dirs QtHelp_libraries QtHelp_deps QtHelp_typesystem_path QtHelp_SRC "") ================================================ FILE: PySide/QtHelp/typesystem_help.xml ================================================ ================================================ FILE: PySide/QtMaemo5/CMakeLists.txt ================================================ project(QtMaemo5) set(QtMaemo5_SRC ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtMaemo5/qmaemo5abstractpickselector_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtMaemo5/qmaemo5datepickselector_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtMaemo5/qmaemo5editbar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtMaemo5/qmaemo5informationbox_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtMaemo5/qmaemo5listpickselector_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtMaemo5/qmaemo5timepickselector_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtMaemo5/qmaemo5valuebutton_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtMaemo5/qtmaemo5_module_wrapper.cpp ) set(QtMaemo5_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtMaemo5_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") # QT_QTMAEMO5_* variables are not defined by CMake if(NOT QT_QTMAEMO5_INCLUDE_DIR) FIND_PATH(QT_QTMAEMO5_INCLUDE_DIR QtMaemo5 PATHS ${QT_HEADERS_DIR}/QtMaemo5 NO_DEFAULT_PATH) endif() if(NOT QT_QTMAEMO5_LIBRARY) FIND_LIBRARY(QT_QTMAEMO5_LIBRARY QtMaemo5 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) endif() set(QtMaemo5_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTMAEMO5_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${QtCore_BINARY_DIR}/${BINDING_NAME}/QtCore/ ${QtGui_BINARY_DIR}/${BINDING_NAME}/QtGui/ ${CMAKE_CURRENT_BINARY_DIR}/${BINDING_NAME}/QtMaemo5) set(QtMaemo5_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTMAEMO5_LIBRARY}) set(QtMaemo5_deps QtGui) create_pyside_module(QtMaemo5 QtMaemo5_include_dirs QtMaemo5_libraries QtMaemo5_deps QtMaemo5_typesystem_path QtMaemo5_SRC "") ================================================ FILE: PySide/QtMaemo5/typesystem_maemo5.xml ================================================ ================================================ FILE: PySide/QtMultimedia/CMakeLists.txt ================================================ project(QtMultimedia) set(QtMultimedia_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qaudio_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qabstractvideobuffer_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qaudioenginefactoryinterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qvideosurfaceformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qabstractvideosurface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qaudiodeviceinfo_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qabstractaudiodeviceinfo_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qabstractaudiooutput_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qabstractaudioinput_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qaudioengineplugin_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qaudioformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qaudioinput_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qaudiooutput_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qvideoframe_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/qtmultimedia_module_wrapper.cpp ) set(QtMultimedia_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(QtMultimedia_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtMultimedia/ ${QT_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTMULTIMEDIA_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore/ ${QtGui_BINARY_DIR}/PySide/QtGui/) set(QtMultimedia_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTMULTIMEDIA_LIBRARY} ${QT_QTGUI_LIBRARY}) set(QtMultimedia_deps QtGui) create_pyside_module(QtMultimedia QtMultimedia_include_dirs QtMultimedia_libraries QtMultimedia_deps QtMultimedia_typesystem_path QtMultimedia_SRC "") ================================================ FILE: PySide/QtMultimedia/typesystem_multimedia.xml ================================================ ================================================ FILE: PySide/QtNetwork/CMakeLists.txt ================================================ project(QtNetwork) if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} GREATER 6) set (QtNetwork_47_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkconfiguration_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkconfigurationmanager_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworksession_wrapper.cpp ) else() set(QtNetwork_47_SRC ) endif () set(QtNetwork_OPTIONAL_SRC ) set(QtNetwork_DROPPED_ENTRIES ) check_qt_class(QtNetwork QSslCertificate QtNetwork_OPTIONAL_SRC QtNetwork_DROPPED_ENTRIES) check_qt_class(QtNetwork QSslCipher QtNetwork_OPTIONAL_SRC QtNetwork_DROPPED_ENTRIES) check_qt_class(QtNetwork QSslConfiguration QtNetwork_OPTIONAL_SRC QtNetwork_DROPPED_ENTRIES) check_qt_class(QtNetwork QSslError QtNetwork_OPTIONAL_SRC QtNetwork_DROPPED_ENTRIES) check_qt_class(QtNetwork QSslKey QtNetwork_OPTIONAL_SRC QtNetwork_DROPPED_ENTRIES) check_qt_class(QtNetwork QSslSocket QtNetwork_OPTIONAL_SRC QtNetwork_DROPPED_ENTRIES) set(QtNetwork_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qabstractnetworkcache_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qabstractsocket_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qauthenticator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qftp_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qhostaddress_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qhostinfo_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qhttp_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qhttpheader_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qhttprequestheader_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qhttpresponseheader_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qipv6address_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qlocalserver_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qlocalsocket_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkaccessmanager_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkaddressentry_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkcachemetadata_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkcookie_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkcookiejar_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkdiskcache_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkinterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkproxy_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkproxyfactory_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkproxyquery_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkreply_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qnetworkrequest_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qssl_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qtcpserver_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qtcpsocket_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qtnetwork_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qudpsocket_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/qurlinfo_wrapper.cpp ${QtNetwork_47_SRC} ${QtNetwork_OPTIONAL_SRC} ) set(QtNetwork_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}") set(QtNetwork_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtNetwork/ ${QT_INCLUDE_DIR} ${QT_QTNETWORK_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore/) set(QtNetwork_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTNETWORK_LIBRARY}) set(QtNetwork_deps QtCore) create_pyside_module(QtNetwork QtNetwork_include_dirs QtNetwork_libraries QtNetwork_deps QtNetwork_typesystem_path QtNetwork_SRC "" "" QtNetwork_DROPPED_ENTRIES) ================================================ FILE: PySide/QtNetwork/typesystem_network.xml ================================================ Shiboken::AutoArrayPointer<char> data(%ARGUMENT_NAMES); QHostAddress ha; quint16 port; %BEGIN_ALLOW_THREADS %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(data, %ARGUMENT_NAMES, &ha, &port); %END_ALLOW_THREADS QByteArray ba(data, retval); %PYARG_0 = PyTuple_New(3); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[QByteArray](ba)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QHostAddress](ha)); PyTuple_SET_ITEM(%PYARG_0, 2, %CONVERTTOPYTHON[quint16](port)); return 16; if (_i >= 16) { PyErr_SetString(PyExc_IndexError, "index out of bounds"); return 0; } if (_i < 0) _i = 16 - qAbs(_i); uint item = %CPPSELF.c[_i]; return %CONVERTTOPYTHON[uint](item); return 16; if (_i >= 16) { PyErr_SetString(PyExc_IndexError, "index out of bounds"); return -1; } if (_i < 0) _i = 16 - qAbs(_i); quint8 item = %CONVERTTOCPP[quint8](_value); %CPPSELF.c[_i] = item; return 0; ================================================ FILE: PySide/QtOpenGL/CMakeLists.txt ================================================ project(QtOpenGL) if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 6) set(QtOpenGL_46_SRC ) else() set(QtOpenGL_46_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qglframebufferobjectformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qglshaderprogram_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qglshader_wrapper.cpp ) endif() if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 7) set(QtOpenGL_47_SRC ) else() set(QtOpenGL_47_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qglbuffer_wrapper.cpp ) endif() set(QtOpenGL_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qgl_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qglcolormap_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qglcontext_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qglformat_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qglframebufferobject_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qglpixelbuffer_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qglwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL/qtopengl_module_wrapper.cpp ${QtOpenGL_46_SRC} ${QtOpenGL_47_SRC} ) set(QtOpenGL_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtOpenGL_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(QtOpenGL_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTOPENGL_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${QtGui_BINARY_DIR}/PySide/QtGui/ ${QtCore_BINARY_DIR}/PySide/QtCore/ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtOpenGL) set(QtOpenGL_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTOPENGL_LIBRARY}) set(QtOpenGL_deps QtGui) create_pyside_module(QtOpenGL QtOpenGL_include_dirs QtOpenGL_libraries QtOpenGL_deps QtOpenGL_typesystem_path QtOpenGL_SRC "") ================================================ FILE: PySide/QtOpenGL/typesystem_opengl.xml ================================================ int size = (%2 < 0) ? %1.size() : %2; %CPPSELF.allocate((const void*) %1.data(), size); Py_ssize_t dataSize = %CPPSELF.size(); void* data = %CPPSELF.map(%1); if (!data) { Py_INCREF(Py_None); %PYARG_0 = Py_None; } else if (%1 == QGLBuffer::ReadOnly) { %PYARG_0 = Shiboken::Buffer::newObject(data, dataSize, Shiboken::Buffer::ReadOnly); } else { %PYARG_0 = Shiboken::Buffer::newObject(data, dataSize, Shiboken::Buffer::ReadWrite); } char *data = new char[%3]; bool result = %CPPSELF.read(%1, data, %3); QByteArray ret; if (result) ret.append((const char*)data, %3); %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[bool](result)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QByteArray](ret)); delete[] data; int size = (%3 < 0) ? %2.size() : %3; %CPPSELF.write(%1, (const void*) %2.data(), size); ================================================ FILE: PySide/QtScript/CMakeLists.txt ================================================ project(QtScript) if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 7) set (QtScript_47_SRC ) else() set(QtScript_47_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptprogram_wrapper.cpp ) endif() set(QtScript_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptable_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptclass_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptclasspropertyiterator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptcontext_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptcontextinfo_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptengineagent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qtscript_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptengine_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptextensioninterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptextensionplugin_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptstring_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptvalue_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript/qscriptvalueiterator_wrapper.cpp ${QtScript_47_SRC} ) set(QtScript_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}") set(QtScript_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScript ${QT_INCLUDE_DIR} ${QT_QTSCRIPT_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore ) set(QtScript_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTCORE_LIBRARY} ${QT_QTSCRIPT_LIBRARY}) set(QtScript_deps QtCore) create_pyside_module(QtScript QtScript_include_dirs QtScript_libraries QtScript_deps QtScript_typesystem_path QtScript_SRC "") ================================================ FILE: PySide/QtScript/typesystem_script.xml ================================================ if (%CPPSELF.isVariant() || %CPPSELF.isString()) { QString format = QString().sprintf("%s(\"%s\")", ((PyObject*)%PYSELF)->ob_type->tp_name, qPrintable(%CPPSELF.toString())); %PYARG_0 = Shiboken::String::fromCString(qPrintable(format)); } else { %PYARG_0 = Shiboken::String::fromCString( ((PyObject* )%PYSELF)->ob_type->tp_name); } Shiboken::AutoDecRef key(PyObject_Str(_key)); QVariant res = %CPPSELF.property(Shiboken::String::toCString(key.object())).toVariant(); if (res.isValid()) { return %CONVERTTOPYTHON[QVariant](res); } else { PyObject* errorType = PyInt_Check(_key) ? PyExc_IndexError : PyExc_KeyError; PyErr_SetString(errorType, "Key not found."); return 0; } %PYARG_0 = Shiboken::createWrapper(new QScriptValueIterator(*%CPPSELF), true, true); if (%CPPSELF.hasNext()) { %CPPSELF.next(); QString name = %CPPSELF.name(); QVariant value = %CPPSELF.value().toVariant(); %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[QString](name)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QVariant](value)); } else { PyErr_SetNone(PyExc_StopIteration); } ================================================ FILE: PySide/QtScriptTools/CMakeLists.txt ================================================ project(QtScriptTools) set(QtScriptTools_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScriptTools/qtscripttools_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScriptTools/qscriptenginedebugger_wrapper.cpp ) set(QtScriptTools_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtScript_SOURCE_DIR}${PATH_SEP}${QtScriptTools_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(QtScriptTools_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_GUI_INCLUDE_DIR} ${QT_QTSCRIPT_INCLUDE_DIR} ${QT_QTSCRIPTTOOLS_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore/ ${QtGui_BINARY_DIR}/PySide/QtGui/ ${QtScript_BINARY_DIR}/PySide/QtScript/ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtScriptTools) set(QtScriptTools_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_GUI_LIBRARY} ${QT_QTSCRIPT_LIBRARY} ${QT_QTSCRIPTTOOLS_LIBRARY}) set(QtScriptTools_deps QtCore QtScript QtGui) create_pyside_module(QtScriptTools QtScriptTools_include_dirs QtScriptTools_libraries QtScriptTools_deps QtScriptTools_typesystem_path QtScriptTools_SRC "") ================================================ FILE: PySide/QtScriptTools/typesystem_scripttools.xml ================================================ ================================================ FILE: PySide/QtSql/CMakeLists.txt ================================================ project(QtSql) set(QtSql_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqlindex_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqldatabase_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqldrivercreatorbase_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqldriver_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqlerror_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqlfield_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqlquerymodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqlquery_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqlrecord_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqlrelationaldelegate_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqlrelationaltablemodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqlrelation_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqlresult_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsqltablemodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qsql_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/qtsql_module_wrapper.cpp ) set(QtSql_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtSql_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(QtSql_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTSQL_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore/ ${QtGui_BINARY_DIR}/PySide/QtGui/ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSql/) set(QtSql_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTSQL_LIBRARY}) set(QtSql_deps QtGui) create_pyside_module(QtSql QtSql_include_dirs QtSql_libraries QtSql_deps QtSql_typesystem_path QtSql_SRC "") ================================================ FILE: PySide/QtSql/typesystem_sql.xml ================================================ ================================================ FILE: PySide/QtSvg/CMakeLists.txt ================================================ project(QtSvg) set(QtSvg_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSvg/qgraphicssvgitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSvg/qsvggenerator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSvg/qsvgrenderer_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSvg/qsvgwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSvg/qtsvg_module_wrapper.cpp ) set(QtSvg_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(QtSvg_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtSvg/ ${QT_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTSVG_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore/ ${QtGui_BINARY_DIR}/PySide/QtGui/) set(QtSvg_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTSVG_LIBRARY} ${QT_QTGUI_LIBRARY}) set(QtSvg_deps QtGui) create_pyside_module(QtSvg QtSvg_include_dirs QtSvg_libraries QtSvg_deps QtSvg_typesystem_path QtSvg_SRC "") ================================================ FILE: PySide/QtSvg/typesystem_svg.xml ================================================ ================================================ FILE: PySide/QtTest/CMakeLists.txt ================================================ project(QtTest) if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 6) set(QtTest_46_SRC "") else() set(QtTest_46_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtTest/qtest_pysideqtoucheventsequence_wrapper.cpp ) endif() set(QtTest_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtTest/qtest_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtTest/qttest_module_wrapper.cpp ${QtTest_46_SRC} ) set(QtTest_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(QtTest_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtTest/ ${QT_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTTEST_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore/ ${QtGui_BINARY_DIR}/PySide/QtGui/) set(QtTest_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTTEST_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTCORE_LIBRARY}) set(QtTest_deps QtGui) create_pyside_module(QtTest QtTest_include_dirs QtTest_libraries QtTest_deps QtTest_typesystem_path QtTest_SRC "") ================================================ FILE: PySide/QtTest/typesystem_test.xml ================================================ ================================================ FILE: PySide/QtUiTools/CMakeLists.txt ================================================ project(QtUiTools) set(QtUiTools_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtUiTools/qtuitools_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtUiTools/quiloader_wrapper.cpp ) set(QtUiTools_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtXml_SOURCE_DIR}${PATH_SEP}${QtUiTools_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(QtUiTools_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTXML_INCLUDE_DIR} ${QT_QTDESIGNER_INCLUDE_DIR} ${QT_QTUITOOLS_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${plugins_SOURCE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore/ ${QtXml_BINARY_DIR}/PySide/QtXml/ ${QtGui_BINARY_DIR}/PySide/QtGui/ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtUiTools) set(QtUiTools_libraries pyside uiplugin ${SHIBOKEN_PYTHON_LIBRARIES} ${QT_QTUITOOLS_LIBRARY} ${QT_QTDESIGNER_LIBRARY} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY}) set(QtUiTools_deps QtGui QtXml) create_pyside_module(QtUiTools QtUiTools_include_dirs QtUiTools_libraries QtUiTools_deps QtUiTools_typesystem_path QtUiTools_SRC "") ================================================ FILE: PySide/QtUiTools/glue/plugins.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _PLUGIN_H_ #define _PLUGIN_H_ #include #include "customwidgets.h" inline void registerCustomWidget(PyObject* obj) { static PyCustomWidgets* plugin = 0; if (plugin == 0) { foreach(QObject* o, QPluginLoader::staticInstances()) { plugin = qobject_cast(o); if (plugin) break; } } if (!plugin) qDebug() << "Failed to load uiloader plugin."; else plugin->registerWidgetType(obj); } #endif ================================================ FILE: PySide/QtUiTools/glue/uitools_loadui.cpp ================================================ /* * Based on code provided by: * Antonio Valentino * Frédéric */ #include #include #include #include static void createChildrenNameAttributes(PyObject* root, QObject* object) { foreach (QObject* child, object->children()) { const QByteArray name = child->objectName().toLocal8Bit(); if (!name.isEmpty() && !name.startsWith("_") && !name.startsWith("qt_")) { bool hasAttr = PyObject_HasAttrString(root, name.constData()); if (!hasAttr) { Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QObject*](child)); PyObject_SetAttrString(root, name.constData(), pyChild); } createChildrenNameAttributes(root, child); } createChildrenNameAttributes(root, child); } } static PyObject* QUiLoadedLoadUiFromDevice(QUiLoader* self, QIODevice* dev, QWidget* parent) { QWidget* wdg = self->load(dev, parent); if (wdg) { PyObject* pyWdg = %CONVERTTOPYTHON[QWidget*](wdg); createChildrenNameAttributes(pyWdg, wdg); if (parent) { Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget*](parent)); Shiboken::Object::setParent(pyParent, pyWdg); } return pyWdg; } if (!PyErr_Occurred()) PyErr_SetString(PyExc_RuntimeError, "Unable to open/read ui device"); return 0; } static PyObject* QUiLoaderLoadUiFromFileName(QUiLoader* self, const QString& uiFile, QWidget* parent) { QFile fd(uiFile); return QUiLoadedLoadUiFromDevice(self, &fd, parent); } ================================================ FILE: PySide/QtUiTools/typesystem_uitools.xml ================================================ Q_IMPORT_PLUGIN(uiplugin); Registers a Python created custom widget to QUiLoader, so it can be recognized when loading a `.ui` file. The custom widget type is passed via the ``customWidgetType`` argument. This is needed when you want to override a virtual method of some widget in the interface, since duck punching will not work with widgets created by QUiLoader based on the contents of the `.ui` file. (Remember that `duck punching virtual methods is an invitation for your own demise! <http://www.pyside.org/docs/shiboken/wordsofadvice.html#duck-punching-and-virtual-methods>`_) Let's see an obvious example. If you want to create a new widget it's probable you'll end up overriding :class:`~PySide.QtGui.QWidget`'s :meth:`~PySide.QtGui.QWidget.paintEvent` method. .. code-block:: python class Circle(QWidget): def paintEvent(self, event): painter = QPainter(self) painter.setPen(self.pen) painter.setBrush(QBrush(self.color)) painter.drawEllipse(event.rect().center(), 20, 20) # ... loader = QUiLoader() loader.registerCustomWidget(Circle) circle = loader.load('circle.ui') circle.show() # ... registerCustomWidget(%PYARG_1); %CPPSELF.addPluginPath(""); // force reload widgets // Avoid calling the original function: %CPPSELF.%FUNCTION_NAME() %PYARG_0 = QUiLoadedLoadUiFromDevice(%CPPSELF, %1, %2); // Avoid calling the original function: %CPPSELF.%FUNCTION_NAME() %PYARG_0 = QUiLoaderLoadUiFromFileName(%CPPSELF, %1, %2); ================================================ FILE: PySide/QtWebKit/CMakeLists.txt ================================================ project(QtWebKit) if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 6) set (QtWebKit_46_SRC ) else () set(QtWebKit_46_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebelement_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebelementcollection_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebinspector_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebpage_errorpageextensionoption_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebpage_errorpageextensionreturn_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qgraphicswebview_wrapper.cpp ) endif () set(QtWebKit_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qtwebkit_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebdatabase_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebframe_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebhistoryinterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebhistoryitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebhistory_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebhittestresult_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebpage_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebpage_choosemultiplefilesextensionoption_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebpage_choosemultiplefilesextensionreturn_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebpage_extensionoption_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebpage_extensionreturn_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebpluginfactory_mimetype_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebpluginfactory_plugin_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebpluginfactory_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebsecurityorigin_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebsettings_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/qwebview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebKit/webcore_wrapper.cpp ${QtWebKit_46_SRC} ) set(QtWebKit_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtNetwork_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(QtWebkit_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtWebkit/ ${QT_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTNETWORK_INCLUDE_DIR} ${QT_QTWEBKIT_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore/ ${QtGui_BINARY_DIR}/PySide/QtGui/ ${QtNetwork_BINARY_DIR}/PySide/QtNetwork/ ) set(QtWebKit_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTWEBKIT_LIBRARY} ${QT_QTNETWORK_LIBRARY} ${QT_QTGUI_LIBRARY}) set(QtWebKit_deps QtGui QtNetwork) create_pyside_module(QtWebKit QtWebkit_include_dirs QtWebKit_libraries QtWebKit_deps QtWebKit_typesystem_path QtWebKit_SRC "") ================================================ FILE: PySide/QtWebKit/typesystem_webkit.xml ================================================ SbkObject* _pyReturn = reinterpret_cast<SbkObject*>(%PYARG_0); if (!Shiboken::Object::hasParentInfo(_pyReturn)) Shiboken::Object::setParent(%PYSELF, %PYARG_0); QString _local; QString* %4 = &_local; Shiboken::AutoDecRef pyRes(PySequence_GetItem(%PYARG_0, 0)); Shiboken::AutoDecRef pyStr(PySequence_GetItem(%PYARG_0, 1)); %RETURN_TYPE %out = %CONVERTTOCPP[%RETURN_TYPE](pyRes); *%4 = %CONVERTTOCPP[QString](pyStr); %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QString](*%4)); static int _signalIndex = -1; static QMetaMethod _m; if (_signalIndex == -1) { _signalIndex = QWebPage::staticMetaObject.indexOfSlot("shouldInterruptJavaScript()"); _m = QWebPage::staticMetaObject.method(_signalIndex); } if (_signalIndex == id) { Shiboken::GilState gil; PyObject* self = (PyObject*)Shiboken::BindingManager::instance().retrieveWrapper(this); if (self) { Shiboken::AutoDecRef _pyMethod(PyObject_GetAttrString(self, "shouldInterruptJavaScript")); return PySide::SignalManager::callPythonMetaMethod(_m, args, _pyMethod, false); } } return %CPPSELF.count(); if (_i < 0 || _i >= %CPPSELF.count()) { PyErr_SetString(PyExc_IndexError, "index out of bounds"); return 0; } QWebElement element = %CPPSELF.at(_i); return %CONVERTTOPYTHON[QWebElement](element); ================================================ FILE: PySide/QtWebKit/typesystem_webkit_simulator.xml ================================================ ================================================ FILE: PySide/QtXml/CMakeLists.txt ================================================ project(QtXml) set(QtXml_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomattr_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomcdatasection_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomcharacterdata_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomcomment_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomdocument_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomdocumentfragment_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomdocumenttype_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomelement_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomentity_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomentityreference_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomimplementation_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomnamednodemap_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomnode_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomnodelist_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomnotation_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomprocessinginstruction_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qdomtext_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qtxml_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmlattributes_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmlcontenthandler_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmldeclhandler_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmldefaulthandler_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmldtdhandler_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmlentityresolver_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmlerrorhandler_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmlinputsource_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmllexicalhandler_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmllocator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmlnamespacesupport_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmlparseexception_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmlreader_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml/qxmlsimplereader_wrapper.cpp ) set(QtXml_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}") set(QtXml_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXml ${CMAKE_SOURCE_DIR} ${QT_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTXML_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore) set(QtXml_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTXML_LIBRARY}) set(QtXml_deps QtCore) create_pyside_module(QtXml QtXml_include_dirs QtXml_libraries QtXml_deps QtXml_typesystem_path QtXml_SRC "") ================================================ FILE: PySide/QtXml/typesystem_xml.xml ================================================ QXmlInputSource* _qxmlinputsource_arg_ = 0; %BEGIN_ALLOW_THREADS %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(%1, %2, _qxmlinputsource_arg_); %END_ALLOW_THREADS %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QXmlInputSource*](_qxmlinputsource_arg_)); QXmlInputSource* _qxmlinputsource_arg_ = 0; %BEGIN_ALLOW_THREADS %RETURN_TYPE %0 = %CPPSELF.%TYPE::%FUNCTION_NAME(%1, %2, _qxmlinputsource_arg_); %END_ALLOW_THREADS %PYARG_0 = PyTuple_New(2); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QXmlInputSource*](_qxmlinputsource_arg_)); ================================================ FILE: PySide/QtXmlPatterns/CMakeLists.txt ================================================ project(QtXmlPatterns) if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 6) set(QtXmlPatterns_46_SRC ) else() set(QtXmlPatterns_46_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qxmlschemavalidator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qxmlschema_wrapper.cpp ) endif() set(QtXmlPatterns_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qabstractmessagehandler_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qabstracturiresolver_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qabstractxmlnodemodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qabstractxmlreceiver_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qsourcelocation_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qtxmlpatterns_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qxmlformatter_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qxmlitem_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qxmlnamepool_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qxmlname_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qxmlnodemodelindex_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qxmlquery_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qxmlresultitems_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns/qxmlserializer_wrapper.cpp ${QtXmlPatterns_46_SRC} ) set(QtXmlPatterns_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}") set(QtXmlPatterns_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTXMLPATTERNS_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore/ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtXmlPatterns) set(QtXmlPatterns_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTXMLPATTERNS_LIBRARY}) set(QtXmlPatterns_deps QtCore) create_pyside_module(QtXmlPatterns QtXmlPatterns_include_dirs QtXmlPatterns_libraries QtXmlPatterns_deps QtXmlPatterns_typesystem_path QtXmlPatterns_SRC "") ================================================ FILE: PySide/QtXmlPatterns/typesystem_xmlpatterns.xml ================================================ QXmlSchema* %0 = new QXmlSchema(%CPPSELF.schema()); %PYARG_0 = %CONVERTTOPYTHON[QXmlSchema*](%0); ================================================ FILE: PySide/__init__.py.in ================================================ __all__ = ['QtCore', 'QtGui', 'QtNetwork', 'QtOpenGL', 'QtSql', 'QtSvg', 'QtTest', 'QtWebKit', 'QtScript'] __version__ = "@BINDING_API_VERSION_FULL@" __version_info__ = (@BINDING_API_MAJOR_VERSION@, @BINDING_API_MINOR_VERSION@, @BINDING_API_MICRO_VERSION@, "@BINDING_API_RELEASE_LEVEL@", @BINDING_API_SERIAL@) def _setupQtDirectories(): import sys import os from . import _utils pysideDir = _utils.get_pyside_dir() # Register PySide qt.conf to override the built-in # configuration variables, if there is no default qt.conf in # executable folder prefix = pysideDir.replace('\\', '/') _utils.register_qt_conf(prefix=prefix, binaries=prefix, plugins=prefix+"/plugins", imports=prefix+"/imports", translations=prefix+"/translations") # On Windows add the PySide\openssl folder (if it exists) to the # PATH so the SSL DLLs can be found when Qt tries to dynamically # load them. Tell Qt to load them and then reset the PATH. if sys.platform == 'win32': opensslDir = os.path.join(pysideDir, 'openssl') if os.path.exists(opensslDir): path = os.environ['PATH'] try: os.environ['PATH'] = opensslDir + os.pathsep + path try: from . import QtNetwork except ImportError: pass else: QtNetwork.QSslSocket.supportsSsl() finally: os.environ['PATH'] = path _setupQtDirectories() ================================================ FILE: PySide/_utils.py.in ================================================ # This file is part of PySide: Python for Qt # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # # Contact: PySide team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public License # version 2 as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA import sys import os import fnmatch if sys.platform == 'win32': # On Windows get the PySide package path in case sensitive format. # Even if the file system on Windows is case insensitive, # some parts in Qt environment such as qml imports path, # requires to be in case sensitive format. import ctypes from ctypes import POINTER, WinError, sizeof, byref, create_unicode_buffer from ctypes.wintypes import MAX_PATH, LPCWSTR, LPWSTR, DWORD GetShortPathNameW = ctypes.windll.kernel32.GetShortPathNameW GetShortPathNameW.argtypes = [LPCWSTR, LPWSTR, DWORD] GetShortPathNameW.restype = DWORD GetLongPathNameW = ctypes.windll.kernel32.GetLongPathNameW GetLongPathNameW.argtypes = [LPCWSTR, LPWSTR, DWORD] GetLongPathNameW.restype = DWORD PY_2 = sys.version_info[0] < 3 if PY_2: def u(x): return unicode(x) def u_fs(x): return unicode(x, sys.getfilesystemencoding()) else: def u(x): return x def u_fs(x): return x def _get_win32_short_name(s): """ Returns short name """ buf_size = MAX_PATH for i in range(2): buf = create_unicode_buffer(u('\0') * (buf_size + 1)) r = GetShortPathNameW(u_fs(s), buf, buf_size) if r == 0: raise WinError() if r < buf_size: if PY_2: return buf.value.encode(sys.getfilesystemencoding()) return buf.value buf_size = r raise WinError() def _get_win32_long_name(s): """ Returns long name """ buf_size = MAX_PATH for i in range(2): buf = create_unicode_buffer(u('\0') * (buf_size + 1)) r = GetLongPathNameW(u_fs(s), buf, buf_size) if r == 0: raise WinError() if r < buf_size: if PY_2: return buf.value.encode(sys.getfilesystemencoding()) return buf.value buf_size = r raise WinError() def _get_win32_case_sensitive_name(s): """ Returns long name in case sensitive format """ path = _get_win32_long_name(_get_win32_short_name(s)) return path def get_pyside_dir(): try: from . import QtCore except ImportError: return _get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(__file__))) else: return _get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(QtCore.__file__))) else: def get_pyside_dir(): try: from . import QtCore except ImportError: return os.path.abspath(os.path.dirname(__file__)) else: return os.path.abspath(os.path.dirname(QtCore.__file__)) def _filter_match(name, patterns): for pattern in patterns: if pattern is None: continue if fnmatch.fnmatch(name, pattern): return True return False def _dir_contains(dir, filter): names = os.listdir(dir) for name in names: srcname = os.path.join(dir, name) if not os.path.isdir(srcname) and _filter_match(name, filter): return True return False def _rcc_write_number(out, number, width): dividend = 1 if width == 2: dividend = 256 elif width == 3: dividend = 65536 elif width == 4: dividend = 16777216 while dividend >= 1: tmp = int(number / dividend) out.append("%02x" % tmp) number -= tmp * dividend dividend = int(dividend / 256) def _rcc_write_data(out, data): _rcc_write_number(out, len(data), 4) for d in data: _rcc_write_number(out, ord(d), 1) def _get_qt_conf_resource(prefix, binaries, plugins, imports, translations): """ Generate Qt resource with embedded qt.conf """ qt_conf_template = "\ [Paths]\x0d\x0a\ Prefix = %(prefix)s\x0d\x0a\ Binaries = %(binaries)s\x0d\x0a\ Imports = %(imports)s\x0d\x0a\ Plugins = %(plugins)s\x0d\x0a\ Translations = %(translations)s" rc_data_input = qt_conf_template % {"prefix": prefix, "binaries": binaries, "plugins": plugins, "imports": imports, "translations": translations} rc_data_ouput = [] _rcc_write_data(rc_data_ouput, rc_data_input) # The rc_struct and rc_name was pre-generated by pyside-rcc from file: # # # qt/etc/qt.conf # # PY_2 = sys.version_info[0] < 3 if PY_2: rc_struct = "\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x0a\x00\x02\x00\x00\ \x00\x01\x00\x00\x00\x03\x00\x00\x00\x16\x00\x00\x00\x00\x00\x01\x00\x00\ \x00\x00" rc_name = "\ \x00\x02\x00\x00\x07\x84\x00q\x00t\x00\x03\x00\x00l\xa3\x00e\x00t\x00c\x00\ \x07\x08t\xa6\xa6\x00q\x00t\x00.\x00c\x00o\x00n\x00f" rc_data = "".join(rc_data_ouput).decode('hex') else: rc_struct = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x0a\x00\x02\x00\x00\ \x00\x01\x00\x00\x00\x03\x00\x00\x00\x16\x00\x00\x00\x00\x00\x01\x00\x00\ \x00\x00" rc_name = b"\ \x00\x02\x00\x00\x07\x84\x00q\x00t\x00\x03\x00\x00l\xa3\x00e\x00t\x00c\x00\ \x07\x08t\xa6\xa6\x00q\x00t\x00.\x00c\x00o\x00n\x00f" rc_data = bytes.fromhex("".join(rc_data_ouput)) return rc_struct, rc_name, rc_data def register_qt_conf(prefix, binaries, plugins, imports, translations, force=False): """ Register qt.conf in Qt resource system to override the built-in configuration variables, if there is no default qt.conf in executable folder and another qt.conf is not already registered in Qt resource system. """ try: from . import QtCore except ImportError: return # Check folder structure if not prefix or not os.path.exists(prefix): if force: raise RuntimeError("Invalid prefix path specified: %s" % prefix) else: return if not binaries or not os.path.exists(binaries): if force: raise RuntimeError("Invalid binaries path specified: %s" % binaries) else: return else: # Check if required Qt libs exists in binaries folder if sys.platform == 'win32': pattern = ["QtCore*.dll"] else: pattern = ["libQtCore.so.*"] if not _dir_contains(binaries, pattern): if force: raise RuntimeError("QtCore lib not found in folder: %s" % \ binaries) else: return if not plugins or not os.path.exists(plugins): if force: raise RuntimeError("Invalid plugins path specified: %s" % plugins) else: return if not imports or not os.path.exists(imports): if force: raise RuntimeError("Invalid imports path specified: %s" % imports) else: return if not translations or not os.path.exists(translations): if force: raise RuntimeError("Invalid translations path specified: %s" \ % translations) else: return # Check if there is no default qt.conf in executable folder exec_prefix = os.path.dirname(sys.executable) qtconf_path = os.path.join(exec_prefix, 'qt.conf') if os.path.exists(qtconf_path) and not force: return # Check if another qt.conf is not already registered in Qt resource system if QtCore.QFile.exists(":/qt/etc/qt.conf") and not force: return rc_struct, rc_name, rc_data = _get_qt_conf_resource(prefix, binaries, plugins, imports, translations) QtCore.qRegisterResourceData(0x01, rc_struct, rc_name, rc_data) # Initialize the Qt library by querying the QLibraryInfo prefixPath = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.PrefixPath) ================================================ FILE: PySide/global.h.in ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** ** This file is part of the QtCore module of the Qt Toolkit, plus some ** modifications by PySide team. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** Contact: http://www.qt-project.org/legal ** ****************************************************************************/ #undef QT_NO_STL #undef QT_NO_STL_WCHAR #define Q_BYTE_ORDER // used to enable QSysInfo.Endian detection on MacOSX #include "@QT_QTCORE_INCLUDE_DIR@/qnamespace.h" QT_BEGIN_HEADER QT_BEGIN_NAMESPACE QT_MODULE(Core) class QByteArray; class QString; #ifndef Q_MOC_OUTPUT_REVISION #define Q_MOC_OUTPUT_REVISION 61 #endif // macro for onaming members #ifdef METHOD #undef METHOD #endif #ifdef SLOT #undef SLOT #endif #ifdef SIGNAL #undef SIGNAL #endif Q_CORE_EXPORT const char *qFlagLocation(const char *method); #define QTOSTRING_HELPER(s) #s #define QTOSTRING(s) QTOSTRING_HELPER(s) #ifndef QT_NO_DEBUG # define QLOCATION "\0"__FILE__":"QTOSTRING(__LINE__) # define METHOD(a) qFlagLocation("0"#a QLOCATION) # define SLOT(a) qFlagLocation("1"#a QLOCATION) # define SIGNAL(a) qFlagLocation("2"#a QLOCATION) #else # define METHOD(a) "0"#a # define SLOT(a) "1"#a # define SIGNAL(a) "2"#a #endif #ifdef QT3_SUPPORT #define METHOD_CODE 0 // member type codes #define SLOT_CODE 1 #define SIGNAL_CODE 2 #endif #define QMETHOD_CODE 0 // member type codes #define QSLOT_CODE 1 #define QSIGNAL_CODE 2 #define Q_ARG(type, data) QArgument(#type, data) #define Q_RETURN_ARG(type, data) QReturnArgument(#type, data) class QObject; class QMetaMethod; class QMetaEnum; class QMetaProperty; class QMetaClassInfo; class Q_CORE_EXPORT QGenericArgument { public: inline QGenericArgument(const char *aName = 0, const void *aData = 0) : _data(aData), _name(aName) {} inline void *data() const { return const_cast(_data); } inline const char *name() const { return _name; } private: const void *_data; const char *_name; }; class Q_CORE_EXPORT QGenericReturnArgument: public QGenericArgument { public: inline QGenericReturnArgument(const char *aName = 0, void *aData = 0) : QGenericArgument(aName, aData) {} }; template class QArgument: public QGenericArgument { public: inline QArgument(const char *aName, const T &aData) : QGenericArgument(aName, static_cast(&aData)) {} }; template class QReturnArgument: public QGenericReturnArgument { public: inline QReturnArgument(const char *aName, T &aData) : QGenericReturnArgument(aName, static_cast(&aData)) {} }; struct Q_CORE_EXPORT QMetaObject { const char *className() const; const QMetaObject *superClass() const; QObject *cast(QObject *obj) const; #ifndef QT_NO_TRANSLATION // ### Qt 4: Merge overloads QString tr(const char *s, const char *c) const; QString trUtf8(const char *s, const char *c) const; QString tr(const char *s, const char *c, int n) const; QString trUtf8(const char *s, const char *c, int n) const; #endif // QT_NO_TRANSLATION int methodOffset() const; int enumeratorOffset() const; int propertyOffset() const; int classInfoOffset() const; int constructorCount() const; int methodCount() const; int enumeratorCount() const; int propertyCount() const; int classInfoCount() const; int indexOfConstructor(const char *constructor) const; int indexOfMethod(const char *method) const; int indexOfSignal(const char *signal) const; int indexOfSlot(const char *slot) const; int indexOfEnumerator(const char *name) const; int indexOfProperty(const char *name) const; int indexOfClassInfo(const char *name) const; QMetaMethod constructor(int index) const; QMetaMethod method(int index) const; QMetaEnum enumerator(int index) const; QMetaProperty property(int index) const; QMetaClassInfo classInfo(int index) const; QMetaProperty userProperty() const; static bool checkConnectArgs(const char *signal, const char *method); static QByteArray normalizedSignature(const char *method); static QByteArray normalizedType(const char *type); // internal index-based connect static bool connect(const QObject *sender, int signal_index, const QObject *receiver, int method_index, int type = 0, int *types = 0); // internal index-based disconnect static bool disconnect(const QObject *sender, int signal_index, const QObject *receiver, int method_index); // internal slot-name based connect static void connectSlotsByName(QObject *o); // internal index-based signal activation static void activate(QObject *sender, int signal_index, void **argv); static void activate(QObject *sender, int from_signal_index, int to_signal_index, void **argv); static void activate(QObject *sender, const QMetaObject *, int local_signal_index, void **argv); static void activate(QObject *sender, const QMetaObject *, int from_local_signal_index, int to_local_signal_index, void **argv); // internal guarded pointers static void addGuard(QObject **ptr); static void removeGuard(QObject **ptr); static void changeGuard(QObject **ptr, QObject *o); static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()); static inline bool invokeMethod(QObject *obj, const char *member, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) { return invokeMethod(obj, member, Qt::AutoConnection, ret, val0, val1, val2, val3, val4, val5, val6, val7, val8, val9); } static inline bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) { return invokeMethod(obj, member, type, QGenericReturnArgument(), val0, val1, val2, val3, val4, val5, val6, val7, val8, val9); } static inline bool invokeMethod(QObject *obj, const char *member, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) { return invokeMethod(obj, member, Qt::AutoConnection, QGenericReturnArgument(), val0, val1, val2, val3, val4, val5, val6, val7, val8, val9); } QObject *newInstance(QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) const; enum Call { InvokeMetaMethod, ReadProperty, WriteProperty, ResetProperty, QueryPropertyDesignable, QueryPropertyScriptable, QueryPropertyStored, QueryPropertyEditable, QueryPropertyUser, CreateInstance }; int static_metacall(Call, int, void **) const; #ifdef QT3_SUPPORT QT3_SUPPORT const char *superClassName() const; #endif struct { // private data const QMetaObject *superdata; const char *stringdata; const uint *data; const void *extradata; } d; }; struct QMetaObjectExtraData { const QMetaObject **objects; int (*static_metacall)(QMetaObject::Call, int, void **); }; inline const char *QMetaObject::className() const { return d.stringdata; } inline const QMetaObject *QMetaObject::superClass() const { return d.superdata; } #ifdef QT3_SUPPORT inline const char *QMetaObject::superClassName() const { return d.superdata ? d.superdata->className() : 0; } #endif QT_END_NAMESPACE QT_END_HEADER #define qdoc #if @ENABLE_X11@ #define Q_WS_X11 #elif @ENABLE_MAC@ #define Q_WS_MAC #elif @ENABLE_WIN@ #include "pysidewtypes.h" #define Q_WS_WIN #elif @ENABLE_SIMULATOR@ #define Q_WS_SIMULATOR #endif // There are symbols in Qt that exist in Debug but // not in release #define QT_NO_DEBUG #include "@QT_QTCORE_INCLUDE_DIR@/QtCore" #if @ENABLE_MAC@ || @ENABLE_WIN@ // Workaround to parse the QApplication header #define Q_INTERNAL_QAPP_SRC #undef qdoc #endif #include "@QT_QTGUI_INCLUDE_DIR@/QtGui" #include "qpytextobject.h" // PySide class #if @ENABLE_X11@ #include "@QT_QTGUI_INCLUDE_DIR@/QX11Info" #include "@QT_QTGUI_INCLUDE_DIR@/QX11EmbedContainer" #include "@QT_QTGUI_INCLUDE_DIR@/QX11EmbedWidget" #elif @ENABLE_MAC@ #include "@QT_QTGUI_INCLUDE_DIR@/qmacstyle_mac.h" #endif #include "@QT_QTXML_INCLUDE_DIR@/QtXml" #include "@QT_QTUITOOLS_INCLUDE_DIR@/QtUiTools" #include "@QT_QTNETWORK_INCLUDE_DIR@/QtNetwork" #include "@QT_QTSCRIPT_INCLUDE_DIR@/QtScript" #include "@QT_QTSCRIPTTOOLS_INCLUDE_DIR@/QtScriptTools" #include "@QT_QTMULTIMEDIA_INCLUDE_DIR@/QtMultimedia" #include #include "@QT_QTDECLARATIVE_INCLUDE_DIR@/QtDeclarative" // QT_GUI_LIB must be defined to QSqlRelationalDelegate become visible #define QT_GUI_LIB #undef Q_DECLARE_INTERFACE #include "@QT_QTSQL_INCLUDE_DIR@/QtSql" #include "@QT_QTSVG_INCLUDE_DIR@/QtSvg" #if @QT_QTXMLPATTERNS_FOUND@ # include "@QT_QTXMLPATTERNS_INCLUDE_DIR@/QtXmlPatterns" #endif #if @QT_QTWEBKIT_FOUND@ # include "@QT_QTWEBKIT_INCLUDE_DIR@/QtWebKit" #endif #if @QT_QTTEST_FOUND@ # include "@QT_QTTEST_INCLUDE_DIR@/QtTest" #if @QT_VERSION_MINOR@ > 5 # include "pysideqtesttouch.h" #endif #endif // Phonon #include "phonon/pyside_phonon.h" #include "@QT_PHONON_INCLUDE_DIR@/abstractaudiooutput.h" #include "@QT_PHONON_INCLUDE_DIR@/abstractmediastream.h" #include "@QT_PHONON_INCLUDE_DIR@/abstractvideooutput.h" #include "@QT_PHONON_INCLUDE_DIR@/addoninterface.h" #include "@QT_PHONON_INCLUDE_DIR@/audiooutput.h" #include "@QT_PHONON_INCLUDE_DIR@/audiooutputinterface.h" #include "@QT_PHONON_INCLUDE_DIR@/backendcapabilities.h" #include "@QT_PHONON_INCLUDE_DIR@/backendinterface.h" #include "@QT_PHONON_INCLUDE_DIR@/effect.h" #include "@QT_PHONON_INCLUDE_DIR@/effectinterface.h" #include "@QT_PHONON_INCLUDE_DIR@/effectparameter.h" #include "@QT_PHONON_INCLUDE_DIR@/effectwidget.h" #include "@QT_PHONON_INCLUDE_DIR@/mediacontroller.h" #include "@QT_PHONON_INCLUDE_DIR@/medianode.h" #include "@QT_PHONON_INCLUDE_DIR@/mediaobject.h" #include "@QT_PHONON_INCLUDE_DIR@/mediaobjectinterface.h" #include "@QT_PHONON_INCLUDE_DIR@/mediasource.h" #include "@QT_PHONON_INCLUDE_DIR@/objectdescription.h" #include "@QT_PHONON_INCLUDE_DIR@/objectdescriptionmodel.h" #include "@QT_PHONON_INCLUDE_DIR@/path.h" #include "@QT_PHONON_INCLUDE_DIR@/phonon_export.h" #include "@QT_PHONON_INCLUDE_DIR@/phonondefs.h" #include "@QT_PHONON_INCLUDE_DIR@/phononnamespace.h" #include "@QT_PHONON_INCLUDE_DIR@/platformplugin.h" #include "@QT_PHONON_INCLUDE_DIR@/seekslider.h" #include "@QT_PHONON_INCLUDE_DIR@/streaminterface.h" #include "@QT_PHONON_INCLUDE_DIR@/videoplayer.h" #include "@QT_PHONON_INCLUDE_DIR@/videowidget.h" #include "@QT_PHONON_INCLUDE_DIR@/videowidgetinterface.h" #include "@QT_PHONON_INCLUDE_DIR@/volumefadereffect.h" #include "@QT_PHONON_INCLUDE_DIR@/volumefaderinterface.h" #include "@QT_PHONON_INCLUDE_DIR@/volumeslider.h" //QtHelp need be included after QtSql #include "@QT_QTHELP_INCLUDE_DIR@/QtHelp" #ifndef QT_NO_OPENGL #include <@GL_H@> #include <@QT_QTOPENGL_INCLUDE_DIR@/QtOpenGL> #endif // QT_NO_OPENGL ================================================ FILE: PySide/licensecomment.txt ================================================ /* * This file is part of PySide: Python for Qt * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * version 2.1 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * */ ================================================ FILE: PySide/phonon/CMakeLists.txt ================================================ project(phonon) # workaround for a cmake bug under MacOSX, it finds phonon but not the include path if (NOT QT_PHONON_INCLUDE_DIR AND CMAKE_HOST_APPLE) set(QT_PHONON_INCLUDE_DIR "${QT_LIBRARY_DIR}/phonon.framework/Headers") endif () set(phonon_OPTIONAL_SRC ) set(phonon_DROPPED_ENTRIES ) check_qt_class(phonon VideoCaptureDevice phonon_OPTIONAL_SRC phonon_DROPPED_ENTRIES Phonon ObjectDescription) set(phonon_SRC ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_abstractaudiooutput_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_abstractmediastream_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_abstractvideooutput_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_addoninterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_audiocapturedevice_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_audiochanneldescription_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_audiooutputdevicemodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_audiooutputdevice_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_audiooutput_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_backendcapabilities_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_backendinterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_effectdescriptionmodel_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_effectdescription_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_effectinterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_effectparameter_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_effectwidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_effect_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_mediacontroller_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_medianode_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_mediaobjectinterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_mediaobject_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_mediasource_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_path_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_platformplugin_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_seekslider_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_streaminterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_subtitledescription_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_videoplayer_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_videowidgetinterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_videowidget_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_volumefadereffect_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_volumefaderinterface_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_volumeslider_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon/phonon_backendcapabilities_notifierwrapper_wrapper.cpp ${phonon_OPTIONAL_SRC} ) set(phonon_typesystem_path "${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${phonon_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}") set(phonon_include_dirs ${CMAKE_CURRENT_SOURCE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_PHONON_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${libpyside_SOURCE_DIR} ${QtGui_BINARY_DIR}/PySide/QtGui/ ${QtCore_BINARY_DIR}/PySide/QtCore/ ${CMAKE_CURRENT_BINARY_DIR}/PySide/phonon) set(phonon_libraries pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_PHONON_LIBRARY}) set(phonon_deps QtGui) create_pyside_module(phonon phonon_include_dirs phonon_libraries phonon_deps phonon_typesystem_path phonon_SRC "" "" phonon_DROPPED_ENTRIES) ================================================ FILE: PySide/phonon/pyside_phonon.h ================================================ #ifndef PYSIDE_PHONON #define PYSIDE_PHONON #include #include namespace Phonon { namespace BackendCapabilities { class NotifierWrapper : public QObject { public: inline static NotifierWrapper* notifier() { Notifier* notifier = BackendCapabilities::notifier(); if (notifier != m_notifier) { delete m_instance; m_instance = new NotifierWrapper(notifier); } return m_instance; } inline const QMetaObject* metaObject() const { return m_notifier->metaObject(); } private: static NotifierWrapper* m_instance; static Notifier* m_notifier; NotifierWrapper(Notifier* notifier) { m_notifier = notifier; } NotifierWrapper() {} }; } } #endif ================================================ FILE: PySide/phonon/typesystem_phonon.xml ================================================ Phonon::BackendCapabilities::NotifierWrapper* Phonon::BackendCapabilities::NotifierWrapper::m_instance = 0; Phonon::BackendCapabilities::Notifier* Phonon::BackendCapabilities::NotifierWrapper::m_notifier = 0; Phonon::BackendCapabilities::NotifierWrapper *_notifierWrapper = Phonon::BackendCapabilities::NotifierWrapper::notifier(); %PYARG_0 = %CONVERTTOPYTHON[Phonon::BackendCapabilities::NotifierWrapper*](_notifierWrapper); .. class: Notifier Notifications about backend capabilities .. method:: capabilitiesChanged() This signal is emitted if the capabilities have changed. This can happen if the user has requested a backend change. .. method:: availableAudioOutputDevicesChanged() This signal is emitted when audio capture devices were plugged or unplugged. Check :meth:`PySide.phonon.BackendCapabilities.availableAudioOutputDevices` to get the current list of available devices. .. method:: availableAudioCaptureDevicesChanged() This signal is emitted when audio capture devices were plugged or unplugged. Check :meth:`PySide.phonon.BackendCapabilities.availableAudioCaptureDevices` to get the current list of available devices. PySideSignal* signal_item; signal_item = PySide::Signal::newObject("capabilitiesChanged", "void", NULL); PyDict_SetItemString(Sbk_Phonon_BackendCapabilities_NotifierWrapper_Type.super.ht_type.tp_dict, "capabilitiesChanged", (PyObject*)signal_item); Py_DECREF((PyObject*)signal_item); signal_item = PySide::Signal::newObject("availableAudioOutputDevicesChanged", "void", NULL); PyDict_SetItemString( Sbk_Phonon_BackendCapabilities_NotifierWrapper_Type.super.ht_type.tp_dict, "availableAudioOutputDevicesChanged", (PyObject*)signal_item); Py_DECREF((PyObject*)signal_item); ================================================ FILE: PySide/pysideqtesttouch.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtTest module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef PYSIDEQTESTTOUCH_H #define PYSIDEQTESTTOUCH_H #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE namespace QTest { class PySideQTouchEventSequence { public: ~PySideQTouchEventSequence() { commit(); } PySideQTouchEventSequence* press(int touchId, const QPoint &pt, QWidget *widget = 0) { QTouchEvent::TouchPoint &p = point(touchId); p.setScreenPos(mapToScreen(widget, pt)); p.setState(Qt::TouchPointPressed); return this; } PySideQTouchEventSequence* move(int touchId, const QPoint &pt, QWidget *widget = 0) { QTouchEvent::TouchPoint &p = point(touchId); p.setScreenPos(mapToScreen(widget, pt)); p.setState(Qt::TouchPointMoved); return this; } PySideQTouchEventSequence* release(int touchId, const QPoint &pt, QWidget *widget = 0) { QTouchEvent::TouchPoint &p = point(touchId); p.setScreenPos(mapToScreen(widget, pt)); p.setState(Qt::TouchPointReleased); return this; } PySideQTouchEventSequence* stationary(int touchId) { QTouchEvent::TouchPoint &p = point(touchId); p.setState(Qt::TouchPointStationary); return this; } void commit() { qt_translateRawTouchEvent(targetWidget, deviceType, points.values()); targetWidget = 0; points.clear(); } private: PySideQTouchEventSequence(QWidget *widget, QTouchEvent::DeviceType aDeviceType) : targetWidget(widget), deviceType(aDeviceType) { } PySideQTouchEventSequence(const PySideQTouchEventSequence &v); void operator=(const PySideQTouchEventSequence&); QTouchEvent::TouchPoint &point(int touchId) { if (!points.contains(touchId)) points[touchId] = QTouchEvent::TouchPoint(touchId); return points[touchId]; } QPoint mapToScreen(QWidget *widget, const QPoint &pt) { if (widget) return widget->mapToGlobal(pt); return targetWidget ? targetWidget->mapToGlobal(pt) : pt; } QMap points; QWidget *targetWidget; QTouchEvent::DeviceType deviceType; friend PySideQTouchEventSequence* generateTouchEvent(QWidget *, QTouchEvent::DeviceType); }; inline PySideQTouchEventSequence* generateTouchEvent(QWidget *widget = 0, QTouchEvent::DeviceType deviceType = QTouchEvent::TouchScreen) { return new PySideQTouchEventSequence(widget, deviceType); } } QT_END_NAMESPACE #endif // PYSIDEQTESTTOUCH_H ================================================ FILE: PySide/pysidewtypes.h ================================================ #ifndef __PYSIDEWTYPES__ #define __PYSIDEWTYPES__ typedef struct HWND__ *HWND; typedef unsigned UINT; typedef long LONG; typedef unsigned long DWORD; typedef UINT WPARAM; typedef LONG LPARAM; struct POINT { LONG x; LONG y; }; struct MSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; }; #endif ================================================ FILE: PySide/qpytextobject.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "qpytextobject.h" /*! \class QPyTextObject \brief Workaround to make possible use QTextObjectInterface on PySide. \ingroup richtext-processing Due to the technical details of how to bind C++ classes to Python, you need to use this class when you need to implement your own QTextObjectInterface rather than create a class inheriting from QObject and QTextObjectInterface. \sa QTextObjectInterface */ ================================================ FILE: PySide/qpytextobject.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef QPYTEXTOBJECT #define QPYTEXTOBJECT #include #include class QPyTextObject : public QObject, public QTextObjectInterface { Q_OBJECT Q_INTERFACES(QTextObjectInterface) public: QPyTextObject(QObject* parent = 0) : QObject(parent) {} void drawObject(QPainter* painter, const QRectF& rect, QTextDocument* doc, int posInDocument, const QTextFormat& format ) = 0; QSizeF intrinsicSize(QTextDocument* doc, int posInDocument, const QTextFormat& format ) = 0; }; #endif ================================================ FILE: PySide/typesystem_templates.xml ================================================ ================================================ FILE: cmake/Macros/FindQt4Extra.cmake ================================================ # # Try to find QtMultimedia # TODO: Remove this hack when cmake support QtMultimedia module if (NOT QT_QTMULTIMEDIA_FOUND AND ${QTVERSION} VERSION_GREATER 4.5.9) find_path(QT_QTMULTIMEDIA_INCLUDE_DIR QtMultimedia PATHS ${QT_HEADERS_DIR}/QtMultimedia ${QT_LIBRARY_DIR}/QtMultimedia.framework/Headers NO_DEFAULT_PATH) find_library(QT_QTMULTIMEDIA_LIBRARY QtMultimedia PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) if (QT_QTMULTIMEDIA_INCLUDE_DIR AND QT_QTMULTIMEDIA_LIBRARY) set(QT_QTMULTIMEDIA_FOUND ON) else() #Replace this on documentation set(if_QtMultimedia "") endif() endif () # Try to find QtMaemo5 - it has to be done before QtGui to enable some QtMaemo5 flags # TODO: Remove this hack when cmake support QtMaemo5 module if (NOT QT_QTMAEMO5_FOUND AND ${QTVERSION} VERSION_GREATER 4.5.9) find_path(QT_QTMAEMO5_INCLUDE_DIR QtMaemo5 PATHS ${QT_HEADERS_DIR}/QtMaemo5 ${QT_LIBRARY_DIR}/QtMaemo5.framework/Headers NO_DEFAULT_PATH) find_library(QT_QTMAEMO5_LIBRARY QtMaemo5 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) if (QT_QTMAEMO5_INCLUDE_DIR AND QT_QTMAEMO5_LIBRARY) set(QT_QTMAEMO5_FOUND ON) set(Q_WS_MAEMO_5 ON) else() #Replace this on documentation set(if_Maemo5 "") endif() endif () # Try to find QtDeclarative # TODO: Remove this hack when cmake support QtDeclarative module if (NOT QT_QTDECLARATIVE_FOUND AND ${QTVERSION} VERSION_GREATER 4.6.0) find_path(QT_QTDECLARATIVE_INCLUDE_DIR QtDeclarative PATHS ${QT_HEADERS_DIR}/QtDeclarative ${QT_LIBRARY_DIR}/QtDeclarative.framework/Headers NO_DEFAULT_PATH) find_library(QT_QTDECLARATIVE_LIBRARY QtDeclarative PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) if (QT_QTDECLARATIVE_INCLUDE_DIR AND QT_QTDECLARATIVE_LIBRARY) set(QT_QTDECLARATIVE_FOUND ON) else() #Replace this on documentation set(if_QtDeclarative "") endif() endif () ================================================ FILE: cmake/Macros/PySideModules.cmake ================================================ macro(create_pyside_module module_name module_include_dir module_libraries module_deps module_typesystem_path module_sources module_static_sources) string(TOLOWER ${module_name} _module) string(REGEX REPLACE ^qt "" _module ${_module}) if(${ARGC} GREATER 7) set (typesystem_name ${ARGV7}) else() set (typesystem_name "") endif() if(${ARGC} GREATER 8) string(REPLACE ";" "\\;" dropped_entries "${${ARGV8}}") else() set (dropped_entries "") endif() if (NOT EXISTS ${typesystem_name}) set(typesystem_path ${CMAKE_CURRENT_SOURCE_DIR}/typesystem_${_module}.xml) else() set(typesystem_path ${typesystem_name}) endif() add_custom_command(OUTPUT ${${module_sources}} COMMAND ${SHIBOKEN_BINARY} ${GENERATOR_EXTRA_FLAGS} ${pyside_BINARY_DIR}/pyside_global.h --include-paths=${pyside_SOURCE_DIR}${PATH_SEP}${QT_INCLUDE_DIR} --typesystem-paths=${pyside_SOURCE_DIR}${PATH_SEP}${${module_typesystem_path}} --output-directory=${CMAKE_CURRENT_BINARY_DIR} --license-file=${CMAKE_CURRENT_SOURCE_DIR}/../licensecomment.txt ${typesystem_path} --api-version=${SUPPORTED_QT_VERSION} --drop-type-entries="${dropped_entries}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Running generator for ${module_name}...") include_directories(${module_name} ${${module_include_dir}} ${pyside_SOURCE_DIR}) add_library(${module_name} MODULE ${${module_sources}} ${${module_static_sources}}) set_target_properties(${module_name} PROPERTIES PREFIX "" LIBRARY_OUTPUT_DIRECTORY ${pyside_BINARY_DIR}) if(WIN32) set_target_properties(${module_name} PROPERTIES SUFFIX ".pyd") set(${module_name}_suffix ".pyd") else() set(${module_name}_suffix ${CMAKE_SHARED_MODULE_SUFFIX}) endif() target_link_libraries(${module_name} ${${module_libraries}}) if(${module_deps}) add_dependencies(${module_name} ${${module_deps}}) endif() # install install(TARGETS ${module_name} LIBRARY DESTINATION ${SITE_PACKAGE}/PySide) string(TOLOWER ${module_name} lower_module_name) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/PySide/${module_name}/pyside_${lower_module_name}_python.h DESTINATION include/PySide${pyside_SUFFIX}/${module_name}/) file(GLOB typesystem_files ${CMAKE_CURRENT_SOURCE_DIR}/typesystem_*.xml ${typesystem_path}) install(FILES ${typesystem_files} DESTINATION share/PySide${pyside_SUFFIX}/typesystems) endmacro() #macro(check_qt_class_with_namespace module namespace class optional_source_files dropped_entries [namespace] [module]) macro(check_qt_class module class optional_source_files dropped_entries) if (${ARGC} GREATER 4) set (namespace ${ARGV4}) string(TOLOWER ${namespace} _namespace) else () set (namespace "") endif () if (${ARGC} GREATER 5) set (include_file ${ARGV5}) else () set (include_file ${class}) endif () string(TOLOWER ${class} _class) string(TOUPPER ${module} _module) if (_namespace) set(_cppfile ${CMAKE_CURRENT_BINARY_DIR}/PySide/${module}/${_namespace}_${_class}_wrapper.cpp) else () set(_cppfile ${CMAKE_CURRENT_BINARY_DIR}/PySide/${module}/${_class}_wrapper.cpp) endif () if (DEFINED PYSIDE_${class}) if (PYSIDE_${class}) list(APPEND ${optional_source_files} ${_cppfile}) else() list(APPEND ${dropped_entries} PySide.${module}.${class}) endif() else() if (NOT ${namespace} STREQUAL "" ) set (NAMESPACE_USE "using namespace ${namespace};") else () set (NAMESPACE_USE "") endif () set(SRC_FILE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test${class}.cxx) file(WRITE ${SRC_FILE} "#include <${include_file}>\n" "${NAMESPACE_USE}\n" "int main() { sizeof(${class}); }\n" ) try_compile(Q_WORKS ${CMAKE_BINARY_DIR} ${SRC_FILE} CMAKE_FLAGS "-DLINK_LIBRARIES=${QT_${_module}_LIBRARY}" "-DLINK_DIRECTORIES=${QT_LIBRARY_DIR}" "-DINCLUDE_DIRECTORIES=${QT_INCLUDE_DIR};${QT_${_module}_INCLUDE_DIR}" OUTPUT_VARIABLE OUTPUT) file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeCheckQtClassTest.log ${OUTPUT}) set("PYSIDE_${class}" ${Q_WORKS} CACHE STRING "Has ${class} class been found?") if(Q_WORKS) message(STATUS "Checking for ${class} in ${module} -- found") list(APPEND ${optional_source_files} ${_cppfile}) else() message(STATUS "Checking for ${class} in ${module} -- not found") list(APPEND ${dropped_entries} PySide.${module}.${class}) endif() endif() endmacro() # Only add subdirectory if the associated Qt module is found. macro(HAS_QT_MODULE var name) if (NOT DISABLE_${name} AND ${var}) add_subdirectory(${name}) else() # Used on documentation to skip modules set("if_${name}" "" PARENT_SCOPE) endif() endmacro() ================================================ FILE: cmake/Macros/icecc.cmake ================================================ include (CMakeForceCompiler) option(ENABLE_ICECC "Enable icecc checking, for distributed compilation") if (ENABLE_ICECC) find_program(ICECC icecc) if (ICECC) message(STATUS "icecc found! Distributed compilation for all!! huhuhu.") cmake_force_cxx_compiler(${ICECC} icecc) else(ICECC) message(FATAL_ERROR "icecc NOT found! re-run cmake without -DENABLE_ICECC") endif(ICECC) endif(ENABLE_ICECC) ================================================ FILE: cmake_uninstall.cmake ================================================ IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") IF(EXISTS "$ENV{DESTDIR}${file}") EXEC_PROGRAM( "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF(NOT "${rm_retval}" STREQUAL 0) MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") ENDIF(NOT "${rm_retval}" STREQUAL 0) ELSE(EXISTS "$ENV{DESTDIR}${file}") MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") ENDIF(EXISTS "$ENV{DESTDIR}${file}") ENDFOREACH(file) ================================================ FILE: doc/CMakeLists.txt ================================================ project(doc) set(DOC_DATA_DIR "${CMAKE_CURRENT_BINARY_DIR}/qdoc3-output") configure_file("pyside.qdocconf.in" "pyside.qdocconf" @ONLY) add_custom_target(qdoc3 COMMAND qdoc3 pyside.qdocconf COMMENT "Running qdoc3 against Qt source code..." SOURCE "pyside.qdocconf") find_program(SPHINX_BUILD NAMES sphinx-build) if (${SPHINX_BUILD} MATCHES "SPHINX_BUILD-NOTFOUND") message(FATAL_ERROR "sphinx-build command not found.") endif() add_custom_target(apidoc COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/rst COMMAND ${SHIBOKEN_PYTHON_INTERPRETER} ${SPHINX_BUILD} -b html ${CMAKE_CURRENT_BINARY_DIR}/rst html ) # create conf.py based on conf.py.in configure_file("conf.py.in" "rst/conf.py" @ONLY) configure_file(typesystem_doc.xml.in typesystem_doc.xml @ONLY) add_custom_target("docrsts" COMMAND ${SHIBOKEN_BINARY} --generator-set=qtdoc ${pyside_BINARY_DIR}/pyside_global.h --include-paths="${QT_INCLUDE_DIR}${PATH_SEP}${pyside_SOURCE_DIR}" --api-version=${SUPPORTED_QT_VERSION} --typesystem-paths="${pyside_SOURCE_DIR}${PATH_SEP}${QtCore_SOURCE_DIR}${PATH_SEP}${QtDeclarative_SOURCE_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}${PATH_SEP}${QtHelp_SOURCE_DIR}${PATH_SEP}${QtMaemo5_SOURCE_DIR}${PATH_SEP}${QtMultimedia_SOURCE_DIR}${PATH_SEP}${QtNetwork_SOURCE_DIR}${PATH_SEP}${QtOpenGL_SOURCE_DIR}${PATH_SEP}${QtScript_SOURCE_DIR}${PATH_SEP}${QtScriptTools_SOURCE_DIR}${PATH_SEP}${QtSql_SOURCE_DIR}${PATH_SEP}${QtSvg_SOURCE_DIR}${PATH_SEP}${QtTest_SOURCE_DIR}${PATH_SEP}${QtUiTools_SOURCE_DIR}${PATH_SEP}${QtWebKit_SOURCE_DIR}${PATH_SEP}${QtXml_SOURCE_DIR}${PATH_SEP}${QtXmlPatterns_SOURCE_DIR}${PATH_SEP}${phonon_SOURCE_DIR}" --library-source-dir=${QT_SRC_DIR} --documentation-only --documentation-data-dir=${DOC_DATA_DIR} --output-directory=${CMAKE_CURRENT_BINARY_DIR}/rst --documentation-code-snippets-dir=${CMAKE_CURRENT_SOURCE_DIR}/codesnippets${PATH_SEP}${CMAKE_CURRENT_SOURCE_DIR}/codesnippets/examples --documentation-extra-sections-dir=${CMAKE_CURRENT_SOURCE_DIR}/extras ${CMAKE_CURRENT_BINARY_DIR}/typesystem_doc.xml WORKING_DIRECTORY ${${module}_SOURCE_DIR} COMMENT "Running generator to generate documentation..." ) add_dependencies(apidoc docrsts) add_dependencies(docrsts qdoc3) # #create devhelp file # add_custom_target(apidevhelp # COMMAND python;${CMAKE_CURRENT_SOURCE_DIR}/pyhtml2devhelp.py;${CMAKE_BINARY_DIR}/apidoc/html;index.html > # ${CMAKE_BINARY_DIR}/apidoc/html/PySide.devhelp;${BINDING_API_VERSION}&&; # gzip;-9v;-f;${CMAKE_BINARY_DIR}/apidoc/html/PySide.devhelp # COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_INSTALL_PREFIX}/share/devhelp/books" # COMMAND ${CMAKE_COMMAND} -E create_symlink "${CMAKE_INSTALL_PREFIX}/share/doc/${BINDING_NAME}/html" "${CMAKE_INSTALL_PREFIX}/share/devhelp/books/${BINDING_NAME}" # ) #install files add_custom_target(apidocinstall COMMAND mkdir -p ${CMAKE_INSTALL_PREFIX}/share/doc/PySide-${BINDING_API_VERSION} && cp -rv ${CMAKE_CURRENT_BINARY_DIR}/html/* ${CMAKE_INSTALL_PREFIX}/share/doc/PySide-${BINDING_API_VERSION} ) add_dependencies(apidocinstall apidoc) # add_dependencies(apidocinstall apidevhelp) ================================================ FILE: doc/_templates/index.html ================================================ {% extends "layout.html" %} {% set title = 'Overview' %} {% block body %}

PySide {{ version }} Reference

Qt is a cross-platform application framework from Qt Software (owned by Nokia). It features a large number of libraries providing services like network abstraction and XML handling, along with a very rich GUI package, allowing C++ developers to write their applications once and run them unmodified in different systems. PySide aims to provide Python developers access to the Qt libraries in the most natural way.

PySide is built using the Shiboken binding generator.

Notes

About 0 vs None

The PySide class reference documentation is automatically generated from the original Qt documentation for C++, some parts were tuned to fit the Python world. However, it's not possible to rewrite all Qt docs as it would require a really huge effort, so if the documentation says you can use 0 on an QObject argument, interpret it as None.

About keyword arguments

Only optional arguments can be used as keyword arguments.

Modules

Tutorials and examples

A collection of tutorials and "walkthrough" guides are provided with PySide to help new users get started with PySide development. These documents were ported from C++ to Python and cover a range of topics, from basic use of widgets to step-by-step tutorials that show how an application is put together.

Other stuff

{% endblock %} ================================================ FILE: doc/_templates/layout.html ================================================ {% extends "!layout.html" %} # Invert sidebars {%- block sidebar1 %}{{ sidebar() }}{%- endblock %} {%- block sidebar2 %}{%- endblock %} {%- block header %}
{%- endblock -%} {%- block footer %}
{%- endblock %} # No top relbar. {%- block relbar1 %}{%- endblock %} # No bottom relbar. {%- block relbar2 %}{%- endblock %} ================================================ FILE: doc/_themes/pysidedocs/domainindex.html ================================================ {# basic/domainindex.html ~~~~~~~~~~~~~~~~~~~~~~ Template for domain indices (module index, ...). :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "layout.html" %} {% set title = indextitle %} {% block extrahead %} {{ super() }} {% if not embedded and collapse_index %} {% endif %} {% endblock %} {% block body %}
{%- set curr_group = 0 %}

{{ indextitle }}

{%- for (letter, entries) in content %} {{ letter }} {%- if not loop.last %} | {% endif %} {%- endfor %}
{%- for letter, entries in content %} {%- for (name, grouptype, page, anchor, extra, qualifier, description) in entries %} {%- if grouptype == 1 %}{% set curr_group = curr_group + 1 %}{% endif %} {%- endfor %} {%- endfor %}
 
{{ letter }}
{% if grouptype == 1 -%} {%- endif %} {% if grouptype == 2 %}   {% endif %} {% if page %}{% endif -%} {{ name|e }} {%- if page %}{% endif %} {%- if extra %} ({{ extra|e }}){% endif -%} {% if qualifier %}{{ qualifier|e }}:{% endif %} {{ description|e }}
{% endblock %} ================================================ FILE: doc/_themes/pysidedocs/searchbox.html ================================================ {%- if pagename != "search" %} {%- endif %} ================================================ FILE: doc/_themes/pysidedocs/static/pysidedocs.css ================================================ * { font: 100% Verdana, Arial, Helvetica, sans-serif; font-size:12px; } html { height: 100%; } body { margin: 0; padding: 0; background-color: #EBEBEB; height: 100%; color: #333; } strong { font-weight:bold; } .document { padding-bottom: 90px; } #container { position: relative; min-height: 100%; background-image: url(fakebar.png); background-repeat: repeat-y; background-color: white; } .footer { position: absolute; bottom: 0px; margin-top: 50px; text-align:center; background-color: white; border-top: 2px solid #e0e0e0; white-space: nowrap; height: 90px; width: 100%; } .footer img { margin-left: 8px; margin-right: 8px; } .sphinxsidebar { float: left; width: 250px; padding: 0px 10px 0px 10px; text-align: left; } .sphinxsidebar ul { padding: 0px; margin: 0px; list-style-position: inside; } .sphinxsidebar > ul { padding: 0px; margin: 0px; } .sphinxsidebar ul li { margin-left: 10px; padding: 0px; } .sphinxsidebar h3, .sphinxsidebar h3 a { font-weight: bold; color: #333; } .documentwrapper { margin-left: 270px; text-align: left; background-color: #ffffff; border-left: 1px solid #989898; font-size:18px; padding: 10px 50px 15px 50px; height: 100%; } h1 { font-size:18px; padding-left: 50px; padding-bottom: 15px; padding-top: 15px; border-bottom: 1px solid #c2c2c2; /* text-transform:uppercase; */ margin-right: -100px; position: relative; left: -50px; top: -10px; } h2 { font-size:12px; font-weight:bold; border-left-width: 1px; border-right-width: 1px; border-top-width: 1px; border-bottom-width: 2px; border-style: solid; border-left-color: #b1b1b1; border-right-color: #b1b1b1; border-top-color: #b1b1b1; border-bottom-color: #009491; background-color: #e0e0e0; padding:5px; margin-top: 20px; -moz-border-radius:5px; -webkit-border-radius:5px; -khtml-border-radius:5px; } h3, h4 { font-weight: bolder; } pre { border-top: 1px solid #e0e0e0; border-bottom: 1px solid #e0e0e0; background-color: #fafafa; padding: 5px; font: 100% monospace; overflow: auto; } pre * { font: 100% monospace; } .pre { font: 100% monospace; } .headerlink { font-size: 100%; color: inherit; float: right; visibility: Hidden } h1 .headerlink { padding-right: 50px; } h1:hover .headerlink, h2:hover .headerlink, h3:hover .headerlink { visibility: Visible; } a, a:visited { color: #009491; text-decoration: none; } a:hover { text-decoration: underline; } /* -- admonitions ----------------------------------------------------------- */ div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 7px; } div.admonition dt { font-weight: bold; } div.admonition dl { margin-bottom: 0; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } div.body p.centered { text-align: center; margin-top: 25px; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } div.seealso { background-color: #ffffcc; border: 1px solid #ffff66; } div.note { border: 1px solid #e3e3e3; } table.docutils { margin-left: auto; margin-right: auto; margin-bottom: 10px; border: none; } table.docutils td { border: none; } table.docutils th { border: none; font-weight: bold; vertical-align: top; } h2 em { float: right; font-size: 10px; position: relative; top: -20px; } /* Table of pymaemo components */ #development table.docutils td { border-bottom: 1px solid #EBEBEB; } #development th { background-color: #EBEBEB; color: #FC7E00; padding: 5px; } #development th:first-child { -moz-border-radius: 20px 0px 0px 0px; -webkit-border-radius: 20px 0px 0px 0px; -khtml-border-radius: 20px 0px 0px 0px; padding-left: 10px; } #development th:last-child { -moz-border-radius: 0px 20px 0px 0px; -webkit-border-radius: 0px 20px 0px 0px; -khtml-border-radius: 0px 20px 0px 0px; padding-right: 10px; width: 100px; } hr { border: none; border-bottom: 1px dashed #EBEBEB; width: 70% } .oldnews { text-align: right; } /******************* TOPO *****************************/ .header { background-image: url(bg_topo.jpg); background-repeat: repeat-x; height: 147px; } .header_container { background-image: url(bg_header.png); background-repeat: no-repeat; background-position: 100px 0px; } .logo { text-align: left; margin-bottom: 10px; } #searchbox { border-top: 1px solid #989898; padding-top: 10px; margin-left: -10px; margin-right: -10px; padding-left: 10px; padding-right: 10px; } #search_button { border: 1px solid #3A393A; background-color: #3A393A; color: white; cursor: pointer; -moz-border-radius: 5px; -webkit-border-radius: 5px; -khtml-border-radius: 5px; } form { margin: 0px; padding: 0px; } /* search field */ form #q { width: 136px; /* height: 22px; */ border: none; margin: 0px; -moz-border-radius: 5px; -webkit-border-radius: 5px; -khtml-border-radius: 5px; margin-top: 2px; padding: 4px; line-height: 22px } #search-results h2 { display: none; } #search-results h2 { display: none; } #search-results ul.search { margin: 0px; padding: 0px; } ul.search div.context { padding-left: 40px; } #installation td { text-align: center; font-weight: bold; } em { color: inherit; font-style:italic; } /******** REL bar *********/ .related { display: inline; } .related ul { padding: 0px 0px 0px 10px; margin: 0px; text-align: left; background-image: url(relbar_bg.png); } .related li { display: inline; color: white; font-weight: bold; } .related li a { color: inherit; line-height: 35px; font-weight: bold; vertical-align: middle; } .related li.right { float: right; margin-right: 5px; } .related h3 { display: none; } .align-center { text-align: center; } .contentstable { width: 100%; } .contentstable td { padding-left: 30px; vertical-align: top; } p.biglink a { font-size: 20px; } dt:target, .highlight { background-color: #fbe54e; } img { border: 0px; } .figure .caption { font-style:italic; } table.footnote { margin: 0px; } #synopsis table, table.field-list { margin: 0px; } tt.descname { font-size: 120%; font-weight: bold; } #functions ul, #virtual-functions ul, #slots ul, #signals ul, #static-functions ul { list-style: none; margin: 0px; padding: 10px; border: 1px solid #ddd; background-color: #f4f4f4; -moz-border-radius:10px; -webkit-border-radius:10px; -khtml-border-radius:10px; } #synopsis span.pre { color: #009491; font-weight: bolder; } #detailed-description .class dt, #detailed-description .method dt, #detailed-description .attribute dt { margin: 0px; padding: 10px; border: 1px solid #ddd; background-color: #f4f4f4; -moz-border-radius:10px; -webkit-border-radius:10px; -khtml-border-radius:10px; } .pysidetoc ul { list-style: none; padding: 0px; margin: 0px; } .pysidetoc em { font-style: normal; } .pysidetoc strong { display: block; padding: 5px; border: 1px solid #ddd; background-color: #f4f4f4; -moz-border-radius:6px; -webkit-border-radius:6px; -khtml-border-radius:6px; } .hide { display: none; } ================================================ FILE: doc/_themes/pysidedocs/theme.conf ================================================ [theme] inherit = default stylesheet = pysidedocs.css pygments_style = none [options] nosidebar = false ================================================ FILE: doc/codesnippets/doc/src/snippets/accessibilityfactorysnippet.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include //! [0] QAccessibleInterface *sliderFactory(const QString &classname, QObject *object) { QAccessibleInterface *interface = 0; if (classname == "QSlider" && object && object->isWidgetType()) interface = new SliderInterface(classname, static_cast(object)); return interface; } int main(int argv, char **args) { QApplication app(argv, args); QAccessible::installFactory(sliderFactory); //! [0] QMainWindow mainWindow; mainWindow.show(); return app.exec(); //! [1] } //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/accessibilitypluginsnippet.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class SliderPlugin : public QAccessiblePlugin { public: SliderPlugin() {} QStringList keys() const; QAccessibleInterface *create(const QString &classname, QObject *object); }; //! [0] QStringList SliderPlugin::keys() const { return QStringList() << "QSlider"; } //! [0] //! [1] QAccessibleInterface *SliderPlugin::create(const QString &classname, QObject *object) { QAccessibleInterface *interface = 0; if (classname == "QSlider" && object && object->isWidgetType()) interface = new AccessibleSlider(classname, static_cast(object)); return interface; } //! [1] //! [2] Q_EXPORT_STATIC_PLUGIN(SliderPlugin) Q_EXPORT_PLUGIN2(acc_sliderplugin, SliderPlugin) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/accessibilityslidersnippet.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] QAccessibleSlider::QAccessibleSlider(QWidget *w) : QAccessibleAbstractSlider(w) { Q_ASSERT(slider()); addControllingSignal(QLatin1String("valueChanged(int)")); } //! [0] QSlider *QAccessibleSlider::slider() const { return qobject_cast(object()); } //! [1] QRect QAccessibleSlider::rect(int child) const { //! [1] QRect rect; if (!slider()->isVisible()) return rect; const QStyleOptionSlider option = qt_qsliderStyleOption(slider()); QRect srect = slider()->style()->subControlRect(QStyle::CC_Slider, &option, QStyle::SC_SliderHandle, slider()); //! [2] switch (child) { case PageLeft: if (slider()->orientation() == Qt::Vertical) rect = QRect(0, 0, slider()->width(), srect.y()); else rect = QRect(0, 0, srect.x(), slider()->height()); break; case Position: rect = srect; break; case PageRight: if (slider()->orientation() == Qt::Vertical) rect = QRect(0, srect.y() + srect.height(), slider()->width(), slider()->height()- srect.y() - srect.height()); else rect = QRect(srect.x() + srect.width(), 0, slider()->width() - srect.x() - srect.width(), slider()->height()); break; default: return QAccessibleAbstractSlider::rect(child); } //! [2] //! [3] QPoint tp = slider()->mapToGlobal(QPoint(0,0)); return QRect(tp.x() + rect.x(), tp.y() + rect.y(), rect.width(), rect.height()); } //! [3] int QAccessibleSlider::childCount() const { if (!slider()->isVisible()) return 0; return PageRight; } //! [4] QString QAccessibleSlider::text(Text t, int child) const { if (!slider()->isVisible()) return QString(); switch (t) { case Value: if (!child || child == 2) return QString::number(slider()->value()); return QString(); case Name: switch (child) { case PageLeft: return slider()->orientation() == Qt::Horizontal ? QSlider::tr("Page left") : QSlider::tr("Page up"); case Position: return QSlider::tr("Position"); case PageRight: return slider()->orientation() == Qt::Horizontal ? QSlider::tr("Page right") : QSlider::tr("Page down"); } break; default: break; } return QAccessibleAbstractSlider::text(t, child); } //! [4] //! [5] QAccessible::Role QAccessibleSlider::role(int child) const { switch (child) { case PageLeft: case PageRight: return PushButton; case Position: return Indicator; default: return Slider; } } //! [5] //! [6] QAccessible::State QAccessibleSlider::state(int child) const { const State parentState = QAccessibleAbstractSlider::state(0); //! [6] if (child == 0) return parentState; // Inherit the Invisible state from parent. State state = parentState & QAccessible::Invisible; // Disable left/right if we are at the minimum/maximum. const QSlider * const slider = QAccessibleSlider::slider(); //! [7] switch (child) { case PageLeft: if (slider->value() <= slider->minimum()) state |= Unavailable; break; case PageRight: if (slider->value() >= slider->maximum()) state |= Unavailable; break; case Position: default: break; } return state; } //! [7] int QAccessibleSlider::defaultAction(int child) const { switch (child) { case SliderSelf: return SetFocus; case PageLeft: return Press; case PageRight: return Press; } return 0; } // Name, Description, Value, Help, Accelerator static const char * const actionTexts[][5] = { {"Press", "Decreases the value of the slider", "", "", "Ctrl+L"}, {"Press", "Increaces the value of the slider", "", "", "Ctrl+R"} }; QString QAccessibleSlider::actionText(int action, Text text, int child) const { if (action != Press || child < 1 || child > 2) return QAccessibleAbstractSlider::actionText(action, text, child); return actionTexts[child - 1][t]; } bool QAccessibleSlider::doAction(int action, int child) { if (action != Press || child < 1 || child > 2) return false; if (child == PageLeft) slider()->setValue(slider()->value() - slider()->pageStep()); else slider()->setValue(slider()->value() + slider()->pageStep()); } QAccessibleAbstractSlider::QAccessibleAbstractSlider(QWidget *w, Role r) : QAccessibleWidgetEx(w, r) { Q_ASSERT(qobject_cast(w)); } QVariant QAccessibleAbstractSlider::invokeMethodEx(Method method, int child, const QVariantList ¶ms) { switch (method) { case ListSupportedMethods: { QSet set; set << ListSupportedMethods; return qVariantFromValue(set | qvariant_cast >( QAccessibleWidgetEx::invokeMethodEx(method, child, params))); } default: return QAccessibleWidgetEx::invokeMethodEx(method, child, params); } } QVariant QAccessibleAbstractSlider::currentValue() { return abstractSlider()->value(); } void QAccessibleAbstractSlider::setCurrentValue(const QVariant &value) { abstractSlider()->setValue(value.toInt()); } QVariant QAccessibleAbstractSlider::maximumValue() { return abstractSlider()->maximum(); } QVariant QAccessibleAbstractSlider::minimumValue() { return abstractSlider()->minimum(); } QAbstractSlider *QAccessibleAbstractSlider::abstractSlider() const { return static_cast(object()); } ================================================ FILE: doc/codesnippets/doc/src/snippets/alphachannel.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] pixmap = QPixmap(100, 100) pixmap.fill(Qt.transparent) gradient = QRadialGradient(50, 50, 50, 50, 50) gradient.setColorAt(0, QColor.fromRgbF(1, 0, 0, 1)) gradient.setColorAt(1, QColor.fromRgbF(0, 0, 0, 0)) painter = QPainter(pixmap) painter.fillRect(0, 0, 100, 100, gradient) channelImage = pixmap.alphaChannel() update() //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/audio/main.cpp ================================================ class Window2 (QWidget): //![0] @Slot(QAudio.State) def stateChanged(self, newState): if newState == QAudio.StopState: if self.input.error() != QAudio.NoError: # Error handling //![0] class Window (QWidget): def __init__(self): QWidget.__init__(self) self.output = QAudioOutput() self.output.stateChanged[QAudio.State].connect(self.stateChanged) def setupFormat(self): //![1] format = QAudioFormat() format.setFrequency(44100) //![1] format.setChannels(2) format.setSampleSize(16) format.setCodec("audio/pcm") format.setByteOrder(QAudioFormat.LittleEndian) //![2] format.setSampleType(QAudioFormat.SignedInt) info = QAudioDeviceInfo(QAudioDeviceInfo.defaultOutputDevice()) if not info.isFormatSupported(format): format = info.nearestFormat(format) //![2] //![3] @Slot(QAudio.State) def stateChanged(self, newState): if newState == QAudio.StopState: if self.output.error() != QAudio.NoError: # Perform error handling else: # Normal stop //![3] # Handle elif newState == QAudio.ActiveState: # Handle active state... app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_()) ================================================ FILE: doc/codesnippets/doc/src/snippets/audioeffects.cpp ================================================ #include #include #include #include #include #include int main(int argv, char **args) { QApplication app(argv, args); app.setApplicationName("Audio effect tester"); Phonon::MediaObject *mediaObject = new Phonon::MediaObject; mediaObject->setCurrentSource(QString("/home/gvatteka/Music/Lumme-Badloop.ogg")); Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory); //! [0] QList effectDescriptions = Phonon::BackendCapabilities::availableAudioEffects(); Phonon::EffectDescription effectDescription = effectDescriptions.at(4); Phonon::Path path = Phonon::createPath(mediaObject, audioOutput); //! [1] Phonon::Effect *effect = new Phonon::Effect(effectDescription); path.insertEffect(effect); //! [0] Phonon::EffectWidget *effectWidget = new Phonon::EffectWidget(effect); effectWidget->show(); //! [1] mediaObject->play(); effectWidget->setWindowTitle("Effect Name: " + effectDescription.name()); app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/brush/brush.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main() { QWidget anyPaintDevice; { // PEN SNIPPET QPainter painter; QPen pen(Qt::red, 2); // red solid line, 2 pixels wide painter.begin(&anyPaintDevice); // paint something painter.setPen(pen); // set the red, wide pen painter.drawRect(40,30, 200,100); // draw a rectangle painter.setPen(Qt::blue); // set blue pen, 0 pixel width painter.drawLine(40,30, 240,130); // draw a diagonal in rectangle painter.end(); // painting done } { // BRUSH SNIPPET QPainter painter; QBrush brush(Qt::yellow); // yellow solid pattern painter.begin(&anyPaintDevice); // paint something painter.setBrush(brush); // set the yellow brush painter.setPen(Qt::NoPen); // do not draw outline painter.drawRect(40,30, 200,100); // draw filled rectangle painter.setBrush(Qt::NoBrush); // do not fill painter.setPen(Qt::black); // set black pen, 0 pixel width painter.drawRect(10,10, 30,20); // draw rectangle outline painter.end(); // painting done } // LINEAR //! [0] linearGrad = QLinearGradient(QPointF(100, 100), QPointF(200, 200)) linearGrad.setColorAt(0, Qt.black) linearGrad.setColorAt(1, Qt.white) //! [0] // RADIAL //! [1] radialGrad = QRadialGradient(QPointF(100, 100), 100) radialGrad.setColorAt(0, Qt.red) radialGrad.setColorAt(0.5, Qt.blue) radialGrad.setColorAt(1, Qt.green) //! [1] } ================================================ FILE: doc/codesnippets/doc/src/snippets/brush/gradientcreationsnippet.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argv, char **args) { QApplication app(argv, args); //! [0] gradient = QRadialGradient gradient(50, 50, 50, 50, 50) gradient.setColorAt(0, QColor.fromRgbF(0, 1, 0, 1)) gradient.setColorAt(1, QColor.fromRgbF(0, 0, 0, 0)) brush = QBrush(gradient) //! [0] QWidget widget; QPalette palette; palette.setBrush(widget.backgroundRole(), brush); widget.setPalette(palette); widget.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/brushstyles/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "stylewidget.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); StyleWidget widget; widget.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/brushstyles/renderarea.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "renderarea.h" RenderArea::RenderArea(QBrush *brush, QWidget *parent) : QWidget(parent) { currentBrush = brush; } QSize RenderArea::minimumSizeHint() const { return QSize(120, 60); } void RenderArea::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setPen(Qt::NoPen); painter.setRenderHint(QPainter::Antialiasing); if(currentBrush->style() == Qt::LinearGradientPattern) { currentBrush = new QBrush(QLinearGradient(0, 0, width(), 60)); } else if(currentBrush->style() == Qt::RadialGradientPattern) { QRadialGradient radial(width() / 2, 30, width() / 2, width() / 2, 30); radial.setColorAt(0, Qt::white); radial.setColorAt(1, Qt::black); currentBrush = new QBrush(radial); } else if(currentBrush->style() == Qt::ConicalGradientPattern) { currentBrush = new QBrush(QConicalGradient(width() / 2, 30, 90)); } painter.setBrush(*currentBrush); QPainterPath path; path.addRect(0, 0, parentWidget()->width(), 60); painter.drawPath(path); } ================================================ FILE: doc/codesnippets/doc/src/snippets/brushstyles/renderarea.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef RENDERAREA_H #define RENDERAREA_H #include class RenderArea : public QWidget { Q_OBJECT public: RenderArea(QBrush *brush, QWidget *parent = 0); QSize minimumSizeHint() const; protected: void paintEvent(QPaintEvent *event); private: QBrush *currentBrush; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/brushstyles/stylewidget.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "stylewidget.h" StyleWidget::StyleWidget(QWidget *parent) : QWidget(parent) { solid = new RenderArea(new QBrush(Qt::SolidPattern)); dense1 = new RenderArea(new QBrush(Qt::Dense1Pattern)); dense2 = new RenderArea(new QBrush(Qt::Dense2Pattern)); dense3 = new RenderArea(new QBrush(Qt::Dense3Pattern)); dense4 = new RenderArea(new QBrush(Qt::Dense4Pattern)); dense5 = new RenderArea(new QBrush(Qt::Dense5Pattern)); dense6 = new RenderArea(new QBrush(Qt::Dense6Pattern)); dense7 = new RenderArea(new QBrush(Qt::Dense7Pattern)); no = new RenderArea(new QBrush(Qt::NoBrush)); hor = new RenderArea(new QBrush(Qt::HorPattern)); ver = new RenderArea(new QBrush(Qt::VerPattern)); cross = new RenderArea(new QBrush(Qt::CrossPattern)); bdiag = new RenderArea(new QBrush(Qt::BDiagPattern)); fdiag = new RenderArea(new QBrush(Qt::FDiagPattern)); diagCross = new RenderArea(new QBrush(Qt::DiagCrossPattern)); linear = new RenderArea(new QBrush(QLinearGradient())); radial = new RenderArea(new QBrush(QRadialGradient())); conical = new RenderArea(new QBrush(QConicalGradient())); texture = new RenderArea(new QBrush(QPixmap("qt-logo.png"))); solidLabel = new QLabel("Qt::SolidPattern"); dense1Label = new QLabel("Qt::Dense1Pattern"); dense2Label = new QLabel("Qt::Dense2Pattern"); dense3Label = new QLabel("Qt::Dense3Pattern"); dense4Label = new QLabel("Qt::Dense4Pattern"); dense5Label = new QLabel("Qt::Dense5Pattern"); dense6Label = new QLabel("Qt::Dense6Pattern"); dense7Label = new QLabel("Qt::Dense7Pattern"); noLabel = new QLabel("Qt::NoPattern"); horLabel = new QLabel("Qt::HorPattern"); verLabel = new QLabel("Qt::VerPattern"); crossLabel = new QLabel("Qt::CrossPattern"); bdiagLabel = new QLabel("Qt::BDiagPattern"); fdiagLabel = new QLabel("Qt::FDiagPattern"); diagCrossLabel = new QLabel("Qt::DiagCrossPattern"); linearLabel = new QLabel("Qt::LinearGradientPattern"); radialLabel = new QLabel("Qt::RadialGradientPattern"); conicalLabel = new QLabel("Qt::ConicalGradientPattern"); textureLabel = new QLabel("Qt::TexturePattern"); QGridLayout *layout = new QGridLayout; layout->addWidget(solid, 0, 0); layout->addWidget(dense1, 0, 1); layout->addWidget(dense2, 0, 2); layout->addWidget(solidLabel, 1, 0); layout->addWidget(dense1Label, 1, 1); layout->addWidget(dense2Label, 1, 2); layout->addWidget(dense3, 2, 0 ); layout->addWidget(dense4, 2, 1); layout->addWidget(dense5, 2, 2); layout->addWidget(dense3Label, 3, 0); layout->addWidget(dense4Label, 3, 1); layout->addWidget(dense5Label, 3, 2); layout->addWidget(dense6, 4, 0); layout->addWidget(dense7, 4, 1); layout->addWidget(no, 4, 2); layout->addWidget(dense6Label, 5, 0); layout->addWidget(dense7Label, 5, 1); layout->addWidget(noLabel, 5, 2); layout->addWidget(hor, 6, 0); layout->addWidget(ver, 6, 1); layout->addWidget(cross, 6, 2); layout->addWidget(horLabel, 7, 0); layout->addWidget(verLabel, 7, 1); layout->addWidget(crossLabel, 7, 2); layout->addWidget(bdiag, 8, 0); layout->addWidget(fdiag, 8, 1); layout->addWidget(diagCross, 8, 2); layout->addWidget(bdiagLabel, 9, 0); layout->addWidget(fdiagLabel, 9, 1); layout->addWidget(diagCrossLabel, 9, 2); layout->addWidget(linear, 10, 0); layout->addWidget(radial, 10, 1); layout->addWidget(conical, 10, 2); layout->addWidget(linearLabel, 11, 0); layout->addWidget(radialLabel, 11, 1); layout->addWidget(conicalLabel, 11, 2); layout->addWidget(texture, 12, 0, 1, 3); layout->addWidget(textureLabel, 13, 0, 1, 3); setLayout(layout); QPalette newPalette = palette(); newPalette.setColor(QPalette::Window, Qt::white); setPalette(newPalette); setWindowTitle(tr("Brush Styles")); resize(430, 605); } ================================================ FILE: doc/codesnippets/doc/src/snippets/brushstyles/stylewidget.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef STYLEWIDGET_H #define STYLEWIDGET_H #include #include #include "renderarea.h" class QLabel; class StyleWidget : public QWidget { Q_OBJECT public: StyleWidget(QWidget *parent = 0); private: RenderArea *solid; RenderArea *dense1; RenderArea *dense2; RenderArea *dense3; RenderArea *dense4; RenderArea *dense5; RenderArea *dense6; RenderArea *dense7; RenderArea *no; RenderArea *hor; RenderArea *ver; RenderArea *cross; RenderArea *bdiag; RenderArea *fdiag; RenderArea *diagCross; RenderArea *linear; RenderArea *radial; RenderArea *conical; RenderArea *texture; QLabel *solidLabel; QLabel *dense1Label; QLabel *dense2Label; QLabel *dense3Label; QLabel *dense4Label; QLabel *dense5Label; QLabel *dense6Label; QLabel *dense7Label; QLabel *noLabel; QLabel *horLabel; QLabel *verLabel; QLabel *crossLabel; QLabel *bdiagLabel; QLabel *fdiagLabel; QLabel *diagCrossLabel; QLabel *linearLabel; QLabel *radialLabel; QLabel *conicalLabel; QLabel *textureLabel; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/buffer/buffer.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include static void main_snippet() { //! [0] buffer = QBuffer() buffer.open(QBuffer.ReadWrite) buffer.write("Qt rocks!") buffer.seek(0) ch = buffer.getChar() # ch == 'Q' ch = buffer.getChar() # ch == 't' ch = buffer.getChar() # ch == ' ' ch = buffer.getChar() # ch == 'r' //! [0] } static void write_datastream_snippets() { //! [1] byteArray = QByteArray() buffer = QBuffer(byteArray) buffer.open(QIODevice.WriteOnly) out = QDataStream(buffer) out << QApplication.palette() //! [1] } static void read_datastream_snippets() { QByteArray byteArray; //! [2] palette = QPalette() buffer = QBuffer(byteArray) buffer.open(QIODevice.ReadOnly) in = QDataStream(buffer) in >> palette //! [2] } static void bytearray_ptr_ctor_snippet() { //! [3] byteArray = QByteArray("abc") buffer = QBuffer(byteArray) buffer.open(QIODevice.WriteOnly) buffer.seek(3) buffer.write("def") buffer.close() # byteArray == "abcdef" //! [3] } static void setBuffer_snippet() { //! [4] byteArray = QByteArray("abc") buffer = QBuffer() buffer.setBuffer(byteArray) buffer.open(QIODevice.WriteOnly) buffer.seek(3) buffer.write("def") buffer.close() # byteArray == "abcdef" //! [4] } int main(int argc, char *argv[]) { QApplication app(argc, argv); main_snippet(); bytearray_ptr_ctor_snippet(); write_datastream_snippets(); read_datastream_snippets(); setBuffer_snippet(); return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/clipboard/clipwindow.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ form PySide.QtGui import * def __init__(self, parent): QMainWindow.__init__(self, parent) clipboard = QApplication.clipboard() centralWidget = QWidget(self) currentItem = QWidget(centralWidget) mimeTypeLabel = QLabel(tr("MIME types:"), currentItem) mimeTypeCombo = QComboBox(currentItem) dataLabel = QLabel(tr("Data:"), currentItem) dataInfoLabel = QLabel("", currentItem) previousItems = QListWidget(centralWidget) //! [0] connect(clipboard, SIGNAL("dataChanged()"), self, SLOT("updateClipboard()")) //! [0] connect(mimeTypeCombo, SIGNAL("activated(const QString &)"), self, SLOT("updateData(const QString &))") currentLayout = QVBoxLayout(currentItem) currentLayout.addWidget(mimeTypeLabel) currentLayout.addWidget(mimeTypeCombo) currentLayout.addWidget(dataLabel) currentLayout.addWidget(dataInfoLabel) currentLayout.addStretch(1) mainLayout = QHBoxLayout(centralWidget) mainLayout.addWidget(currentItem, 1) mainLayout.addWidget(previousItems) setCentralWidget(centralWidget) setWindowTitle(tr("Clipboard")) //! [1] def updateClipboard(self): formats = clipboard.mimeData().formats() data = clipboard.mimeData().data(format) //! [1] mimeTypeCombo.clear() mimeTypeCombo.insertStringList(formats) size = clipboard.mimeData().data(formats[0]).size() Item = QListWidgetItem(previousItems) Item.setText(tr("%1 (%2 bytes)").arg(formats[0]).arg(size)) updateData(formats[0]) //! [2] //! [2] def updateData(self, format) data = clipboard.mimeData().data(format) dataInfoLabel.setText(tr("%1 bytes").arg(data.size())) ================================================ FILE: doc/codesnippets/doc/src/snippets/clipboard/clipwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef CLIPWINDOW_H #define CLIPWINDOW_H #include class QClipboard; class QComboBox; class QLabel; class QListWidget; class QMimeData; class QWidget; class ClipWindow : public QMainWindow { Q_OBJECT public: ClipWindow(QWidget *parent = 0); public slots: void updateClipboard(); void updateData(const QString &format); private: int currentItem; QClipboard *clipboard; QComboBox *mimeTypeCombo; QLabel *dataInfoLabel; QListWidget *previousItems; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/clipboard/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "clipwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); ClipWindow *window = new ClipWindow; window->resize(640, 480); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/code/doc_src_phonon-api.qdoc ================================================ //! [0] class PushStream (AbstractMediaStream): def __init__(self, parent = None): AbstractMediaStream.__init(self, parent) self.timer = QTimer(self) self.setStreamSize(self.getMediaStreamSize()) self.timer.timeout.connect(self.moreData) self.timer.setInterval(0) @Slot() def moreData(self): data = self.getMediaData() if data.isEmpty(): self.endOfData() else: self.writeData(data) def needData(self): self.timer.start() self.moreData() def enoughData(self): self.timer.stop() //! [0] //! [1] class PushStream (AbstractMediaStream): def __init__(self, parent = None): AbstractMediaStream.__init(self, parent) self.setStreamSize(self.getMediaStreamSize()) @Slot() def needData(self): data = self.getMediaData() if data.isEmpty(): self.endOfData() else: self.writeData(data) //! [1] //! [2] self.seekStream(0) //! [2] //! [3] m = MediaObject() fileName = "/home/foo/bar.ogg" url = QUrl("http://www.example.com/stream.mp3") someBuffer = QBuffer() m.setCurrentSource(fileName) m.setCurrentSource(url) m.setCurrentSource(someBuffer) m.setCurrentSource(Phonon.Cd) //! [3] //! [4] player = VideoPlayer(Phonon.VideoCategory, parentWidget) player.finished.connect(player.deleteLater) player.play(url) //! [4] //! [5] audioPlayer.load(url) audioPlayer.play() //! [5] //! [6] media = MediaObject(self) media.finished.connect(self.slotFinished) media.setCurrentSource("/home/username/music/filename.ogg") # ... media.play() //! [6] //! [7] media.setCurrentSource(":/sounds/startsound.ogg") media.enqueue("/home/username/music/song.mp3") media.enqueue(":/sounds/endsound.ogg") //! [7] //! [8] media.setCurrentSource(":/sounds/startsound.ogg") media.aboutToFinish.connect(lambda : media.enqueue("/home/username/music/song.mp3")) //! [8] //! [9] x = 200 media.setTickInterval(x) assert(x == producer.tickInterval()) //! [9] //! [10] x = 200 media.setTickInterval(x) assert(x >= producer.tickInterval() and x <= * producer.tickInterval()) //! [10] //! [11] //! [12] self.media.hasVideoChanged[bool].connect(hasVideoChanged) self.media.setCurrentSource("somevideo.avi") self.media.hasVideo() # returns false @Slot(bool) def hasVideoChanged(self, b): # b == true media.hasVideo() # returns true //! [12] //! [11] //! [13] self.setMetaArtist(media.metaData("ARTIST")) self.setMetaAlbum(media.metaData("ALBUM")) self.setMetaTitle(media.metaData("TITLE")) self.setMetaDate(media.metaData("DATE")) self.setMetaGenre(media.metaData("GENRE")) self.setMetaTrack(media.metaData("TRACKNUMBER")) self.setMetaComment(media.metaData("DESCRIPTION")) //! [13] //! [14] url = QUrl("http://www.example.com/music.ogg") media.setCurrentSource(url) //! [14] //! [15] progressBar.setRange(0, 100) # this is the default self.media.bufferStatus[int].connect(progressBar.setValue) //! [15] //! [16] BackendCapabilities.notifier.capabilitiesChanged.connect(...) //! [16] //! [17] cb = QComboBox(parentWidget) model = ObjectDescriptionModel(cb) model.setModelData(BackendCapabilities.availableAudioOutputDevices()) cb.setModel(model) cb.setCurrentIndex(0) # select first entry //! [17] //! [18] cbIndex = cb.currentIndex() selectedDevice = model.modelData(cbIndex) //! [18] //! [19] path = Phonon.createPath(...) effect = Effect(this) path.insertEffect(effect) //! [19] //! [20] media = MediaObject() output = AudioOutput(Phonon.MusicCategory) path = Phonon.createPath(media, output) assert(path.isValid()) # for this simple case the path should always be # valid - there are unit tests to ensure it # insert an effect effectList = BackendCapabilities.availableAudioEffects() if effectList: effect = path.insertEffect(effectList[0]) //! [20] //! [21] media = MediaObject(parent) vwidget = VideoWidget(parent) Phonon.createPath(media, vwidget) //! [21] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/doc_src_qnamespace.qdoc ================================================ //! [0] QObject::connect: Cannot queue arguments of type 'MyType' //! [0] //! [1] # An important event ImportantEventPriority = Qt.HighEventPriority # A more important event MoreImportantEventPriority = ImportantEventPriority + 1 # A critical event CriticalEventPriority = 100 * MoreImportantEventPriority # Not that important StatusEventPriority = Qt.LowEventPriority # These are less important than Status events IdleProcessingDoneEventPriority = StatusEventPriority - 1 //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src.gui.text.qtextdocumentwriter.cpp ================================================ //! [0] writer = QTextDocumentWriter() writer.setFormat("odf") # same as writer.setFormat("ODF"); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src.qdbus.qdbuspendingcall.cpp ================================================ { //! [0] QDBusPendingCall async = iface->asyncCall("RemoteMethod", value1, value2); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(callFinishedSlot(QDBusPendingCallWatcher*))); //! [0] } //! [1] void MyClass::callFinishedSlot(QDBusPendingCallWatcher *call) { QDBusPendingReply reply = *call; if (reply.isError()) { showError(); } else { QString text = reply.argumentAt<0>(); QByteArray data = reply.argumentAt<1>(); showReply(text, data); } } //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src.qdbus.qdbuspendingreply.cpp ================================================ { //! [0] QDBusPendingReply reply = interface->asyncCall("RemoteMethod"); reply.waitForFinished(); if (reply.isError()) // call failed. Show an error condition. showError(reply.error()); else // use the returned value useValue(reply.value()); //! [0] //! [2] QDBusPendingReply reply = interface->asyncCall("RemoteMethod"); reply.waitForFinished(); if (!reply.isError()) { if (reply.argumentAt<0>()) showSuccess(reply.argumentAt<1>()); else showFailure(reply.argumentAt<1>()); } //! [2] } ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src.scripttools.qscriptenginedebugger.cpp ================================================ //! [0] engine = QScriptEngine() debugger = QScriptEngineDebugger() debugger.attachTo(engine) //! [0] //! [1] engine.evaluate("debugger") //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_codecs_qtextcodec.cpp ================================================ //! [0] encodedString = QByteArray("...") codec = QTextCodec.codecForName("KOI8-R") string = codec.toUnicode(encodedString) //! [0] //! [1] string = u"..." codec = QTextCodec.codecForName("KOI8-R") encodedString = codec.fromUnicode(string) //! [1] //! [2] codec = QTextCodec.codecForName("Shift-JIS") decoder = codec.makeDecoder() string = u'' while new_data_available(): chunk = get_new_data() string += decoder.toUnicode(chunk) //! [2] //! [3] def main(): app = QApplication([]) QTextCodec.setCodecForTr(QTextCodec.codecForName("eucKR")) ... //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_codecs_qtextcodecplugin.cpp ================================================ //! [0] def names(self): return list = ["IBM01140", "hp15-tw"] def createForName(name): if (name == "IBM01140"): return Ibm01140Codec() else if (name == "hp15-tw"): return Hp15TwCodec() return None //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_concurrent_qfuture.cpp ================================================ //! [0] QFuture future = ...; QFuture::const_iterator i; for (i = future.constBegin(); i != future.constEnd(); ++i) cout << *i << endl; //! [0] //! [1] QFuture future; ... QFutureIterator i(future); while (i.hasNext()) qDebug() << i.next(); //! [1] //! [2] QFutureIterator i(future); i.toBack(); while (i.hasPrevious()) qDebug() << i.previous(); //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_concurrent_qfuturesynchronizer.cpp ================================================ //! [0] void someFunction() { QFutureSynchronizer synchronizer; ... synchronizer.addFuture(QtConcurrent::run(anotherFunction)); synchronizer.addFuture(QtConcurrent::map(list, mapFunction)); return; // QFutureSynchronizer waits for all futures to finish } //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_concurrent_qfuturewatcher.cpp ================================================ //! [0] // Instantiate the objects and connect to the finished signal. MyClass myObject; QFutureWatcher watcher; connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished())); // Start the computation. QFuture future = QtConcurrent::run(...); watcher.setFuture(future); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_concurrent_qtconcurrentexception.cpp ================================================ //! [0] class MyException : public QtConcurrent::Exception { public: void raise() const { throw *this; } Exception *clone() const { return new MyException(*this); } }; //! [0] //! [1] try { QtConcurrent::blockingMap(list, throwFunction); // throwFunction throws MyException } catch (MyException &e) { // handle exception } //! [1] //! [2] void MyException::raise() const { throw *this; } //! [2] //! [3] MyException *MyException::clone() const { return new MyException(*this); } //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_concurrent_qtconcurrentfilter.cpp ================================================ //! [0] bool function(const T &t); //! [0] //! [1] bool allLowerCase(const QString &string) { return string.lowered() == string; } QStringList strings = ...; QFuture lowerCaseStrings = QtConcurrent::filtered(strings, allLowerCase); //! [1] //! [2] QStringList strings = ...; QFuture future = QtConcurrent::filter(strings, allLowerCase); //! [2] //! [3] V function(T &result, const U &intermediate) //! [3] //! [4] void addToDictionary(QSet &dictionary, const QString &string) { dictionary.insert(string); } QStringList strings = ...; QFuture > dictionary = QtConcurrent::filteredReduced(strings, allLowerCase, addToDictionary); //! [4] //! [5] QStringList strings = ...; QFuture lowerCaseStrings = QtConcurrent::filtered(strings.constBegin(), strings.constEnd(), allLowerCase); // filter in-place only works on non-const iterators QFuture future = QtConcurrent::filter(strings.begin(), strings.end(), allLowerCase); QFuture > dictionary = QtConcurrent::filteredReduced(strings.constBegin(), strings.constEnd(), allLowerCase, addToDictionary); //! [5] //! [6] QStringList strings = ...; // each call blocks until the entire operation is finished QStringList lowerCaseStrings = QtConcurrent::blockingFiltered(strings, allLowerCase); QtConcurrent::blockingFilter(strings, allLowerCase); QSet dictionary = QtConcurrent::blockingFilteredReduced(strings, allLowerCase, addToDictionary); //! [6] //! [7] // keep only images with an alpha channel QList images = ...; QFuture alphaImages = QtConcurrent::filter(strings, &QImage::hasAlphaChannel); // keep only gray scale images QList images = ...; QFuture grayscaleImages = QtConcurrent::filtered(images, &QImage::isGrayscale); // create a set of all printable characters QList characters = ...; QFuture > set = QtConcurrent::filteredReduced(characters, &QChar::isPrint, &QSet::insert); //! [7] //! [8] // can mix normal functions and member functions with QtConcurrent::filteredReduced() // create a dictionary of all lower cased strings extern bool allLowerCase(const QString &string); QStringList strings = ...; QFuture > averageWordLength = QtConcurrent::filteredReduced(strings, allLowerCase, QSet::insert); // create a collage of all gray scale images extern void addToCollage(QImage &collage, const QImage &grayscaleImage); QList images = ...; QFuture collage = QtConcurrent::filteredReduced(images, &QImage::isGrayscale, addToCollage); //! [8] //! [9] bool QString::contains(const QRegExp ®exp) const; //! [9] //! [10] boost::bind(&QString::contains, QRegExp("^\\S+$")); // matches strings without whitespace //! [10] //! [11] bool contains(const QString &string) //! [11] //! [12] QStringList strings = ...; boost::bind(static_cast( &QString::contains ), QRegExp("..." )); //! [12] //! [13] struct StartsWith { StartsWith(const QString &string) : m_string(string) { } typedef bool result_type; bool operator()(const QString &testString) { return testString.startsWith(m_string); } QString m_string; }; QList strings = ...; QFuture fooString = QtConcurrent::filtered(images, StartsWith(QLatin1String("Foo"))); //! [13] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_concurrent_qtconcurrentmap.cpp ================================================ //! [0] U function(const T &t); //! [0] //! [1] QImage scaled(const QImage &image) { return image.scaled(100, 100); } QList images = ...; QFuture thumbnails = QtConcurrent::mapped(images, scaled); //! [1] //! [2] U function(T &t); //! [2] //! [3] void scale(QImage &image) { image = image.scaled(100, 100); } QList images = ...; QFuture future = QtConcurrent::map(images, scale); //! [3] //! [4] V function(T &result, const U &intermediate) //! [4] //! [5] void addToCollage(QImage &collage, const QImage &thumbnail) { QPainter p(&collage); static QPoint offset = QPoint(0, 0); p.drawImage(offset, thumbnail); offset += ...; } QList images = ...; QFuture collage = QtConcurrent::mappedReduced(images, scaled, addToCollage); //! [5] //! [6] QList images = ...; QFuture thumbnails = QtConcurrent::mapped(images.constBegin(), images.constEnd(), scaled); // map in-place only works on non-const iterators QFuture future = QtConcurrent::map(images.begin(), images.end(), scale); QFuture collage = QtConcurrent::mappedReduced(images.constBegin(), images.constEnd(), scaled, addToCollage); //! [6] //! [7] QList images = ...; // each call blocks until the entire operation is finished QList future = QtConcurrent::blockingMapped(images, scaled); QtConcurrent::blockingMap(images, scale); QImage collage = QtConcurrent::blockingMappedReduced(images, scaled, addToCollage); //! [7] //! [8] // squeeze all strings in a QStringList QStringList strings = ...; QFuture squeezedStrings = QtConcurrent::map(strings, &QString::squeeze); // swap the rgb values of all pixels on a list of images QList images = ...; QFuture bgrImages = QtConcurrent::mapped(images, &QImage::rgbSwapped); // create a set of the lengths of all strings in a list QStringList strings = ...; QFuture > wordLengths = QtConcurrent::mappedReduced(string, &QString::length, &QSet::insert); //! [8] //! [9] // can mix normal functions and member functions with QtConcurrent::mappedReduced() // compute the average length of a list of strings extern void computeAverage(int &average, int length); QStringList strings = ...; QFuture averageWordLength = QtConcurrent::mappedReduced(strings, &QString::length, computeAverage); // create a set of the color distribution of all images in a list extern int colorDistribution(const QImage &string); QList images = ...; QFuture > totalColorDistribution = QtConcurrent::mappedReduced(images, colorDistribution, QSet::insert); //! [9] //! [10] QImage QImage::scaledToWidth(int width, Qt::TransformationMode) const; //! [10] //! [11] boost::bind(&QImage::scaledToWidth, 100, Qt::SmoothTransformation) //! [11] //! [12] QImage scaledToWith(const QImage &image) //! [12] //! [13] QList images = ...; QFuture thumbnails = QtConcurrent::mapped(images, boost::bind(&QImage::scaledToWidth, 100 Qt::SmoothTransformation)); //! [13] //! [14] struct Scaled { Scaled(int size) : m_size(size) { } typedef QImage result_type; QImage operator()(const QImage &image) { return image.scaled(m_size, m_size); } int m_size; }; QList images = ...; QFuture thumbnails = QtConcurrent::mapped(images, Scaled(100)); //! [14] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_concurrent_qtconcurrentrun.cpp ================================================ //! [0] extern void aFunction(); QFuture future = QtConcurrent::run(aFunction); //! [0] //! [1] extern void aFunctionWithArguments(int arg1, double arg2, const QString &string); int integer = ...; double floatingPoint = ...; QString string = ...; QFuture future = QtConcurrent::run(aFunctionWithArguments, integer, floatingPoint, string); //! [1] //! [2] extern QString functionReturningAString(); QFuture future = QtConcurrent::run(functionReturningAString); ... QString result = future.result(); //! [2] //! [3] extern QString someFunction(const QByteArray &input); QByteArray bytearray = ...; QFuture future = QtConcurrent::run(someFunction, bytearray); ... QString result = future.result(); //! [3] //! [4] // call 'QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const' in a separate thread QString string = ...; QFuture future = QtConcurrent::run(string, &QString::split, QString(", "), QString::KeepEmptyParts, Qt::CaseSensitive); ... QStringList result = future.result(); //! [4] //! [5] // call 'void QImage::invertPixels(InvertMode mode)' in a separate thread QImage image = ...; QFuture future = QtConcurrent::run(image, &QImage::invertPixels, QImage::InvertRgba); ... future.waitForFinished(); // At this point, the pixels in 'image' have been inverted //! [5] //! [6] void someFunction(int arg1, double arg2); QFuture future = QtConcurrent::run(boost::bind(someFunction, 1, 2.0)); ... //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_concurrent_qthreadpool.cpp ================================================ //! [0] class HelloWorldTask(QRunnable): def run(self): print "Hello world from thread", QThread.currentThread() hello = HelloWorldTask() # QThreadPool takes ownership and deletes 'hello' automatically QThreadPool.globalInstance().start(hello) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_global_qglobal.cpp ================================================ //! [0] label.setAlignment(Qt.AlignLeft | Qt.AlignTop) //! [0] //! [1] class MyClass { public: enum Option { NoOptions = 0x0, ShowTabs = 0x1, ShowAll = 0x2, SqueezeBlank = 0x4 }; Q_DECLARE_FLAGS(Options, Option) ... }; Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass::Options) //! [1] //! [meta-object flags] Q_FLAGS(Options) //! [meta-object flags] //! [2] typedef QFlags Flags; //! [2] //! [3] int myValue = 10; int minValue = 2; int maxValue = 6; int boundedValue = qBound(minValue, myValue, maxValue); // boundedValue == 6 //! [3] //! [4] if (!driver()->isOpen() || driver()->isOpenError()) { qWarning("QSqlQuery::exec: database not open"); return false; } //! [4] //! [5] qint64 value = Q_INT64_C(932838457459459); //! [5] //! [6] quint64 value = Q_UINT64_C(932838457459459); //! [6] //! [7] void myMsgHandler(QtMsgType, const char *); //! [7] //! [8] qint64 value = Q_INT64_C(932838457459459); //! [8] //! [9] quint64 value = Q_UINT64_C(932838457459459); //! [9] //! [10] myValue = -4 absoluteValue = qAbs(myValue) // absoluteValue == 4 //! [10] //! [11] valueA = 2.3 valueB = 2.7 roundedValueA = qRound(valueA) // roundedValueA = 2 roundedValueB = qRound(valueB) // roundedValueB = 3 //! [11] //! [12] valueA = 42949672960.3 valueB = 42949672960.7 roundedValueA = qRound(valueA) // roundedValueA = 42949672960 roundedValueB = qRound(valueB) // roundedValueB = 42949672961 //! [12] //! [13] myValue = 6 yourValue = 4 minValue = qMin(myValue, yourValue) // minValue == yourValue //! [13] //! [14] myValue = 6 yourValue = 4 maxValue = qMax(myValue, yourValue) // maxValue == myValue //! [14] //! [15] myValue = 10 minValue = 2 maxValue = 6 boundedValue = qBound(minValue, myValue, maxValue) // boundedValue == 6 //! [15] //! [16] #if QT_VERSION >= 0x040100 QIcon icon = style()->standardIcon(QStyle::SP_TrashIcon); #else QPixmap pixmap = style()->standardPixmap(QStyle::SP_TrashIcon); QIcon icon(pixmap); #endif //! [16] //! [17] // File: div.cpp #include int divide(int a, int b) { Q_ASSERT(b != 0); return a / b; } //! [17] //! [18] ASSERT: "b == 0" in file div.cpp, line 7 //! [18] //! [19] // File: div.cpp #include int divide(int a, int b) { Q_ASSERT_X(b != 0, "divide", "division by zero"); return a / b; } //! [19] //! [20] ASSERT failure in divide: "division by zero", file div.cpp, line 7 //! [20] //! [21] int *a; Q_CHECK_PTR(a = new int[80]); // WRONG! a = new (nothrow) int[80]; // Right Q_CHECK_PTR(a); //! [21] //! [22] template const TInputType &myMin(const TInputType &value1, const TInputType &value2) { qDebug() << Q_FUNC_INFO << "was called with value1:" << value1 << "value2:" << value2; if(value1 < value2) return value1; else return value2; } //! [22] //! [23] #include #include #include void myMessageOutput(QtMsgType type, const char *msg) { switch (type) { case QtDebugMsg: fprintf(stderr, "Debug: %s\n", msg); break; case QtWarningMsg: fprintf(stderr, "Warning: %s\n", msg); break; case QtCriticalMsg: fprintf(stderr, "Critical: %s\n", msg); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s\n", msg); abort(); } } int main(int argc, char **argv) { qInstallMsgHandler(myMessageOutput); QApplication app(argc, argv); ... return app.exec(); } //! [23] //! [24] qDebug("Items in list: %d", myList.size()); //! [24] //! [25] qDebug() << "Brush:" << myQBrush << "Other value:" << i; //! [25] //! [26] void f(int c) { if (c > 200) qWarning("f: bad argument, c == %d", c); } //! [26] //! [27] qWarning() << "Brush:" << myQBrush << "Other value:" << i; //! [27] //! [28] void load(const QString &fileName) { QFile file(fileName); if (!file.exists()) qCritical("File '%s' does not exist!", qPrintable(fileName)); } //! [28] //! [29] qCritical() << "Brush:" << myQBrush << "Other value:" << i; //! [29] //! [30] int divide(int a, int b) { if (b == 0) // program error qFatal("divide: cannot divide by zero"); return a / b; } //! [30] //! [31] forever { ... } //! [31] //! [32] CONFIG += no_keywords //! [32] //! [33] CONFIG += no_keywords //! [33] //! [34] QString FriendlyConversation::greeting(int type) { static const char *greeting_strings[] = { QT_TR_NOOP("Hello"), QT_TR_NOOP("Goodbye") }; return tr(greeting_strings[type]); } //! [34] //! [35] static const char *greeting_strings[] = { QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"), QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye") }; QString FriendlyConversation::greeting(int type) { return tr(greeting_strings[type]); } QString global_greeting(int type) { return qApp->translate("FriendlyConversation", greeting_strings[type]); } //! [35] //! [36] static { const char *source; const char *comment; } greeting_strings[] = { QT_TRANSLATE_NOOP3("FriendlyConversation", "Hello", "A really friendly hello"), QT_TRANSLATE_NOOP3("FriendlyConversation", "Goodbye", "A really friendly goodbye") }; QString FriendlyConversation::greeting(int type) { return tr(greeting_strings[type].source, greeting_strings[type].comment); } QString global_greeting(int type) { return qApp->translate("FriendlyConversation", greeting_strings[type].source, greeting_strings[type].comment); } //! [36] //! [37] qWarning("%s: %s", qPrintable(key), qPrintable(value)); //! [37] //! [38] struct Point2D { int x; int y; }; Q_DECLARE_TYPEINFO(Point2D, Q_PRIMITIVE_TYPE); //! [38] //! [39] class Point2D { public: Point2D() { data = new int[2]; } Point2D(const Point2D &other) { ... } ~Point2D() { delete[] data; } Point2D &operator=(const Point2D &other) { ... } int x() const { return data[0]; } int y() const { return data[1]; } private: int *data; }; Q_DECLARE_TYPEINFO(Point2D, Q_MOVABLE_TYPE); //! [39] //! [40] #if Q_BYTE_ORDER == Q_BIG_ENDIAN ... #endif or #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN ... #endif //! [40] //! [41] #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN ... #endif //! [41] //! [42] #if Q_BYTE_ORDER == Q_BIG_ENDIAN ... #endif //! [42] //! [begin namespace macro] namespace QT_NAMESPACE { //! [begin namespace macro] //! [end namespace macro] } //! [end namespace macro] //! [43] class MyClass : public QObject { private: Q_DISABLE_COPY(MyClass) }; //! [43] //! [44] class MyClass : public QObject { private: MyClass(const MyClass &); MyClass &operator=(const MyClass &); }; //! [44] //! [45] w = QWidget() //! [45] //! [46] // Instead of comparing with 0.0 qFuzzyCompare(0.0,1.0e-200); // This will return false // Compare adding 1 to both values will fix the problem qFuzzyCompare(1 + 0.0, 1 + 1.0e-200); // This will return true //! [46] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qabstractfileengine.cpp ================================================ //! [0] class ZipEngineHandler(QAbstractFileEngineHandler): def create(self, fileName): # ZipEngineHandler returns a ZipEngine for all .zip files if fileName.toLower().endsWith(".zip"): return ZipEngine(fileName) else return None def main(): app = QApplication(sys.argv) engine = ZipEngineHandler() window = MainWindow() window.show() return app.exec() //! [0] //! [1] def create(fileName): # ZipEngineHandler returns a ZipEngine for all .zip files if fileName.lower().endswith(".zip"): return ZipEngine(fileName) else return None //! [1] //! [2] # @arg filters QDir.Filters # @arg filterNames [str, ...] # @return QAbstractFileEngineIterator def beginEntryList(filters, filterNames): return CustomFileEngineIterator(filters, filterNames) //! [2] //! [3] class CustomIterator(QAbstractFileEngineIterator): def __init__(self, nameFilters, filters): QAbstractFileEngineIterator.__init__(self, nameFilters, filters) self.index = 0 # In a real iterator, these entries are fetched from the # file system based on the value of path(). self.entries << "entry1" << "entry2" << "entry3" def hasNext(self): return self.index < self.entries.size() - 1 def next(self): if not self.hasNext(): return None index += 1 return currentFilePath() def currentFileName(self): return self.entries.at(index) //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qdatastream.cpp ================================================ void wrapInFunction() { //! [0] file_ = QFile("file.dat") file_.open(QIODevice.WriteOnly) # we will serialize the data into the file out = QDataStream(file_) # serialize a string out.writeQString("the answer is") # serialize an integer out.writeInt32(42) //! [0] //! [1] file_ = QFile("file.dat") file_.open(QIODevice.ReadOnly) # read the data serialized from the file i = QDataStream(file_) string = '' a = 0 # extract "the answer is" and 42 string = i.readQString() a = i.readInt32() //! [1] //! [2] stream.setVersion(QDataStream.Qt_4_0) //! [2] //! [3] file_ = QFile("file.xxx") file_.open(QIODevice.WriteOnly) out = QDataStream(file_) # Write a header with a "magic number" and a version out.writeInt32(0xA0B0C0D0) out.writeInt32(123) out.setVersion(QDataStream.Qt_4_0) // Write the data out << lots_of_interesting_data //! [3] //! [4] file_ = QFile("file.xxx") file_.open(QIODevice.ReadOnly) i = QDataStream(file_) // Read and check the header magic = i.readInt32() if magic != 0xA0B0C0D0: return XXX_BAD_FILE_FORMAT // Read the version version = i.readInt32() if version < 100: return XXX_BAD_FILE_TOO_OLD if version > 123: return XXX_BAD_FILE_TOO_NEW if version <= 110: in_.setVersion(QDataStream.Qt_3_2) else: in_.setVersion(QDataStream.Qt_4_0) // Read the data in_ >> lots_of_interesting_data if version >= 120: in_ >> data_new_in_XXX_version_1_2 in_ >> other_interesting_data //! [4] //! [5] out = QDataStream(file_) out.setVersion(QDataStream.Qt_4_0) //! [5] } ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qdir.cpp ================================================ void wrapInFunction() { //! [0] QDir("/home/user/Documents") QDir("C:/Documents and Settings") //! [0] //! [1] QDir("images/landscape.png") //! [1] //! [2] QDir("Documents/Letters/Applications").dirName() # "Applications" QDir().dirName() # "." //! [2] //! [3] directory = QDir("Documents/Letters") path = directory.filePath("contents.txt") absolutePath = directory.absoluteFilePath("contents.txt") //! [3] //! [4] dir = QDir("example") if not dir.exists(): print "Cannot find the example directory" //! [4] //! [5] dir = QDir.root() # "/" if not dir.cd("tmp"): # "/tmp" print "Cannot find the \"/tmp\" directory" else: file = QFile(dir.filePath("ex1.txt")) # "/tmp/ex1.txt" if !file.open(QIODevice.ReadWrite): print "Cannot create the file %s" % (file.name()) //! [5] //! [6] bin = "/local/bin" # where /local/bin is a symlink to /usr/bin binDir = QDir(bin) canonicalBin = binDir.canonicalPath() # canonicalBin now equals "/usr/bin" ls = "/local/bin/ls" # where ls is the executable "ls" lsDir = QDir(ls) canonicalLs = lsDir.canonicalPath() # canonicalLS now equals "/usr/bin/ls". //! [6] //! [7] dir = QDir("/home/bob") s = dir.relativeFilePath("images/file.jpg") # s is "images/file.jpg" s = dir.relativeFilePath("/home/mary/file.txt") # s is "../mary/file.txt" //! [7] //! [8] QDir.setSearchPaths("icons", [QDir.homePath() + "/images"]) QDir.setSearchPaths("docs", [":/embeddedDocuments"]) ... pixmap = QPixmap("icons:undo.png") # will look for undo.png in QDir::homePath() + "/images" file = QFile("docs:design.odf") # will look in the :/embeddedDocuments resource path //! [8] //! [9] dir = QDir("/tmp/root_link") dir = dir.canonicalPath() if dir.isRoot(): print "It is a root link" //! [9] //! [10] # The current directory is "/usr/local" d1 = QDir("/usr/local/bin") d2 = QDir("bin") if d1 == d2: print "They're the same" //! [10] //! [11] // The current directory is "/usr/local" d1 = QDir("/usr/local/bin") d1.setFilter(QDir.Executable) d2 = QDir("bin") if d1 != d2: print "They differ" //! [11] //! [12] C:/Documents and Settings/Username //! [12] //! [13] Q_INIT_RESOURCE(myapp); //! [13] //! [14] def initMyResource(): Q_INIT_RESOURCE(myapp) class MyNamespace ... def myFunction(self): initMyResource() //! [14] //! [15] Q_CLEANUP_RESOURCE(myapp); //! [15] } ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qdiriterator.cpp ================================================ //! [0] it = QDirIterator("/etc", QDirIterator.Subdirectories) while it.hasNext(): print it.next() # /etc/. # /etc/.. # /etc/X11 # /etc/X11/fs # ... //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qfile.cpp ================================================ //! [0] file = QFile() QDir.setCurrent("/tmp") file.setFileName("readme.txt") QDir.setCurrent("/home") file.open(QIODevice.ReadOnly) # opens "/home/readme.txt" under Unix //! [0] //! [1] def myEncoderFunc(fileName): //! [1] //! [2] def myDecoderFunc(localFileName): //! [2] //! [3] def printError(msg): file = QFile() file.open(sys.stderr.fileno(), QIODevice.WriteOnly) file.write(msg, size(msg)) # write to stderr file.close() //! [3] //! [4] CONFIG += console //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qfileinfo.cpp ================================================ //![newstuff] fi = QFileInfo("c:/temp/foo") => fi.absoluteFilePath() => "C:/temp/foo" //![newstuff] //! [0] info1 = QFileInfo("/home/bob/bin/untabify") info1.isSymLink() # returns true info1.absoluteFilePath() # returns "/home/bob/bin/untabify" info1.size() # returns 56201 info1.symLinkTarget() # returns "/opt/pretty++/bin/untabify" info2 = QFileInfo(info1.symLinkTarget()) info1.isSymLink() # returns False info1.absoluteFilePath() # returns "/opt/pretty++/bin/untabify" info1.size() # returns 56201 //! [0] //! [1] info1 = QFileInfo("C:\\Documents and Settings\\Bob\\untabify.lnk") info1.isSymLink() # returns True info1.absoluteFilePath() # returns "C:/Documents and Settings/Bob/untabify.lnk" info1.size() # returns 743 info1.symLinkTarget() # returns "C:/Pretty++/untabify" info2 = QFileInfo(info1.symLinkTarget()) info1.isSymLink() # returns False info1.absoluteFilePath() # returns "C:/Pretty++/untabify" info1.size() # returns 63942 //! [1] //! [2] absolute = "/local/bin" relative = "local/bin" absFile = QFileInfo(absolute) relFile = QFileInfo(relative) QDir.setCurrent(QDir.rootPath()) # absFile and relFile now point to the same file QDir.setCurrent("/tmp") # absFile now points to "/local/bin", # while relFile points to "/tmp/local/bin" //! [2] //! [3] fi = QFileInfo("/tmp/archive.tar.gz") name = fi.fileName() # name = "archive.tar.gz" //! [3] //! [4] fi = QFileInfo("/Applications/Safari.app") bundle = fi.bundleName() # name = "Safari" //! [4] //! [5] fi = QFileInfo("/tmp/archive.tar.gz") base = fi.baseName() # base = "archive" //! [5] //! [6] fi = QFileInfo("/tmp/archive.tar.gz") base = fi.completeBaseName() # base = "archive.tar" //! [6] //! [7] fi = QFileInfo("/tmp/archive.tar.gz") ext = fi.completeSuffix() # ext = "tar.gz" //! [7] //! [8] fi = QFileInfo("/tmp/archive.tar.gz") ext = fi.suffix(); # ext = "gz" //! [8] //! [9] info = QFileInfo(fileName) if info.isSymLink(): fileName = info.symLinkTarget() //! [9] //! [10] fi = QFileInfo("/tmp/archive.tar.gz") if fi.permission(QFile.WriteUser | QFile.ReadGroup): print "I can change the file; my group can read the file" if fi.permission(QFile.WriteGroup | QFile.WriteOther): print "The group or others can change the file" //! [10] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qiodevice.cpp ================================================ //! [0] gzip = QProcess() gzip.start("gzip", ["-c"]) if not gzip.waitForStarted(): return False gzip.write("uncompressed data") compressed = QByteArray() while gzip.waitForReadyRead(): compressed += gzip.readAll() //! [0] //! [1] def bytesAvailable(self): return buffer.size() + QIODevice.bytesAvailable() //! [1] //! [2] file = QFile("box.txt") if file.open(QFile.ReadOnly): buf = file.readLine(1024) if buf.size(): # the line is available in buf //! [2] //! [3] def canReadLine(self): return buffer.contains('\n') or QIODevice.canReadLine() //! [3] //! [4] def isExeFile(file_): buf = file_.peek(2) if buf.size() == 2: return buf[0] == 'M' and buf[1] == 'Z' return False //! [4] //! [5] def isExeFile(file_): return file_.peek(2) == "MZ" //! [5] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qprocess.cpp ================================================ def wrapInFunction(): //! [0] builder = QProcess() builder.setProcessChannelMode(QProcess.MergedChannels) builder.start("make", ["-j2"]) import sys if not builder.waitForFinished(): sys.stderr.write("Make failed:" + builder.errorString()) else sys.stderr.write("Make output:" + builder.readAll()) //! [0] //! [1] more = QProcess() more.start("more") more.write("Text to display") more.closeWriteChannel() #QProcess will emit readyRead() once "more" starts printing //! [1] //! [2] command1 | command2 //! [2] //! [3] process1 = QProcess() process2 = QProcess() process1.setStandardOutputProcess(process2) process1.start("command1") process2.start("command2") //! [3] //! [4] class SandboxProcess(QProcess): def setupChildProcess(self) # Drop all privileges in the child process, and enter # a chroot jail. os.setgroups(0, 0) os.chroot("/etc/safe") os.chdir("/") os.setgid(safeGid) os.setuid(safeUid) os.umask(0) //! [4] //! [5] process = QProcess() process.start("del /s *.txt") # same as process.start("del", ["/s", "*.txt"]) ... //! [5] //! [6] process = QProcess() process.start("dir \"My Documents\"") //! [6] //! [7] process = QProcess() process.start("dir \"\"\"My Documents\"\"\"") //! [7] //! [8] environment = QProcess.systemEnvironment() # environment = [PATH=/usr/bin:/usr/local/bin", # "USER=greg", "HOME=/home/greg"] //! [8] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qsettings.cpp ================================================ //! [0] settings = QSettings("MySoft", "Star Runner") color = QColor(settings.value("DataPump/bgcolor")) //! [0] //! [1] settings = QSettings("MySoft", "Star Runner") color = palette().background().color() settings.setValue("DataPump/bgcolor", color) //! [1] //! [2] settings = QSettings("/home/petra/misc/myapp.ini", QSettings.IniFormat) //! [2] //! [3] settings = QSettings("/Users/petra/misc/myapp.plist", QSettings.NativeFormat) //! [3] //! [4] settings = QSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\Office", QSettings.NativeFormat) //! [4] //! [5] settings.setValue("11.0/Outlook/Security/DontTrustInstalledFiles", 0) //! [5] //! [6] settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy", "Milkyway") settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Sun", "OurStar") settings.value("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Default") # returns "Milkyway" //! [6] //! [7] #ifdef Q_WS_MAC settings = QSettings("grenoullelogique.fr", "Squash") #else settings = QSettings("Grenoulle Logique", "Squash") #endif //! [7] //! [8] pos = @Point(100 100) //! [8] //! [9] windir = C:\Windows //! [9] //! [10] settings = QSettings("Moose Tech", "Facturo-Pro") //! [10] //! [11] settings = QSettings("Moose Soft", "Facturo-Pro") //! [11] //! [12] QCoreApplication.setOrganizationName("Moose Soft") QCoreApplication.setApplicationName("Facturo-Pro") settings = QSettings() //! [12] //! [13] settings.beginGroup("mainwindow") settings.setValue("size", win.size()) settings.setValue("fullScreen", win.isFullScreen()) settings.endGroup() settings.beginGroup("outputpanel") settings.setValue("visible", panel.isVisible()) settings.endGroup() //! [13] //! [14] settings.beginGroup("alpha") # settings.group() == "alpha" settings.beginGroup("beta") # settings.group() == "alpha/beta" settings.endGroup() # settings.group() == "alpha" settings.endGroup() # settings.group() == "" //! [14] //! [15] class Login: userName = '' password = '' logins = [] ... settings = QSettings() size = settings.beginReadArray("logins") for i in range(size): settings.setArrayIndex(i) login = Login() login.userName = settings.value("userName") login.password = settings.value("password") logins.append(login) settings.endArray() //! [15] //! [16] class Login: userName = '' password = '' logins = [] ... settings = QSettings() settings.beginWriteArray("logins") for i in range(logins.size()): settings.setArrayIndex(i) settings.setValue("userName", list.at(i).userName) settings.setValue("password", list.at(i).password) settings.endArray() //! [16] //! [17] settings = QSettings() settings.setValue("fridge/color", Qt.white) settings.setValue("fridge/size", QSize(32, 96)) settings.setValue("sofa", True) settings.setValue("tv", False) keys = settings.allKeys(); # keys: ["fridge/color", "fridge/size", "sofa", "tv"] //! [17] //! [18] settings.beginGroup("fridge") keys = settings.allKeys() # keys: ["color", "size"] //! [18] //! [19] settings = QSettings() settings.setValue("fridge/color", Qt.white) settings.setValue("fridge/size", QSize(32, 96)) settings.setValue("sofa", True) settings.setValue("tv", False) keys = settings.childKeys() # keys: ["sofa", "tv"] //! [19] //! [20] settings.beginGroup("fridge") keys = settings.childKeys() # keys: ["color", "size"] //! [20] //! [21] settings = QSettings() settings.setValue("fridge/color", Qt.white) settings.setValue("fridge/size", QSize(32, 96)); settings.setValue("sofa", True) settings.setValue("tv", False) groups = settings.childGroups() # group: ["fridge"] //! [21] //! [22] settings.beginGroup("fridge") groups = settings.childGroups() # groups: [] //! [22] //! [23] settings = QSettings() settings.setValue("interval", 30) settings.value("interval") # returns 30 settings.setValue("interval", 6.55) settings.value("interval") # returns 6.55 //! [23] //! [24] settings = QSettings() settings.setValue("ape") settings.setValue("monkey", 1) settings.setValue("monkey/sea", 2) settings.setValue("monkey/doe", 4) settings.remove("monkey") keys = settings.allKeys() # keys: ["ape"] //! [24] //! [25] settings = QSettings() settings.setValue("ape") settings.setValue("monkey", 1) settings.setValue("monkey/sea", 2) settings.setValue("monkey/doe", 4) settings.beginGroup("monkey") settings.remove("") settings.endGroup() keys = settings.allKeys() # keys: ["ape"] //! [25] //! [26] settings = QSettings() settings.setValue("animal/snake", 58) settings.value("animal/snake", 1024) # returns 58 settings.value("animal/zebra", 1024) # returns 1024 settings.value("animal/zebra") # returns 0 //! [26] //! [27] # @arg device QIODevice # @arg map QSettings.SettingsMap # @return bool def myReadFunc(device, map): //! [27] //! [28] # @arg device QIODevice # @arg map QSettings.SettingsMap # @return bool def myWriteFunc(device, map) //! [28] //! [29] # @arg device QIODevice # @arg map QSettings.SettingsMap # @return bool def readXmlFile(device, map): def writeXmlFile(device, map): def main(): XmlFormat = QSettings::registerFormat("xml", readXmlFile, writeXmlFile) settings = QSettings(XmlFormat, QSettings.UserSettings, "MySoft", "Star Runner") ... //! [29] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qtemporaryfile.cpp ================================================ { //! [0] # Within a function/method... file_ = QTemporaryFile() if file_.open(): # file_.fileName() returns the unique file name # The QTemporaryFile destructor removes the temporary file # as it goes out of scope. //! [0] } ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qtextstream.cpp ================================================ //! [0] data = QFile("output.txt") if data.open(QFile.WriteOnly | QFile.Truncate): out = QTextStream(&data) out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7 # writes "Result: 3.14 2.7 " //! [0] //! [1] stream = QTextStream(sys.stdin.fileno()) while(True): line = stream.readLine() if line.isNull(): break; //! [1] //! [2] in_ = QTextStream("0x50 0x20") firstNumber = 0 secondNumber = 0 in_ >> firstNumber # firstNumber == 80 in_ >> dec >> secondNumber # secondNumber == 0 ch = None in_ >> ch # ch == 'x' //! [2] //! [3] def main(): # read numeric arguments (123, 0x20, 4.5...) for i in sys.argv(): number = None QTextStream in_(i) in_ >> number ... //! [3] //! [4] str = QString() in_ = QTextStream(sys.stdin.fileno()) in_ >> str //! [4] //! [5] s = QString() out = QTextStream(s) out.setFieldWidth(10) out.setFieldAlignment(QTextStream::AlignCenter) out.setPadChar('-') out << "Qt" << "rocks!" //! [5] //! [6] ----Qt------rocks!-- //! [6] //! [7] in_ = QTextStream(file) ch1 = QChar() ch2 = QChar() ch3 = QChar() in_ >> ch1 >> ch2 >> ch3; //! [7] //! [8] out = QTextStream(sys.stdout.fileno()) out << "Qt rocks!" << endl //! [8] //! [9] stream << '\n' << flush //! [9] //! [10] out = QTextStream(file) out.setCodec("UTF-8") //! [10] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_io_qurl.cpp ================================================ //! [0] url = QUrl("http://www.example.com/List of holidays.xml") # url.toEncoded() == "http://www.example.com/List%20of%20holidays.xml" //! [0] //! [1] url = QUrl.fromEncoded("http://qtsoftware.com/List%20of%20holidays.xml") //! [1] //! [2] def checkUrl(url): if !url.isValid(): print "Invalid URL: %s" % url.toString() return False return True //! [2] //! [3] ftp = QFtp() ftp.connectToHost(url.host(), url.port(21)) //! [3] //! [4] http://www.example.com/cgi-bin/drawgraph.cgi?type-pie/color-green //! [4] //! [5] baseUrl = QUrl("http://qtsoftware.com/support") relativeUrl = QUrl("../products/solutions") print baseUrl.resolved(relativeUrl).toString() # prints "http://qtsoftware.com/products/solutions" //! [5] //! [6] ba = QUrl.toPercentEncoding("{a fishy string?}", "{}", "s") print ba # prints "{a fi%73hy %73tring%3F}" //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_kernel_qabstracteventdispatcher.cpp ================================================ //! [0] bool myEventFilter(void *message); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp ================================================ //! [0] beginInsertRows(parent, 2, 4) //! [0] //! [1] beginInsertRows(parent, 4, 5) //! [1] //! [2] beginRemoveRows(parent, 2, 3) //! [2] //! [3] beginInsertColumns(parent, 4, 6) //! [3] //! [4] beginInsertColumns(parent, 6, 8) //! [4] //! [5] beginRemoveColumns(parent, 4, 6) //! [5] //! [6] beginMoveRows(sourceParent, 2, 4, destinationParent, 2) //! [6] //! [7] beginMoveRows(sourceParent, 2, 4, destinationParent, 6) //! [7] //! [8] beginMoveRows(parent, 2, 2, parent, 0) //! [8] //! [9] beginMoveRows(parent, 2, 2, parent, 4) //! [9] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_kernel_qcoreapplication.cpp ================================================ //! [0] event = QMouseEvent(QEvent.MouseButtonPress, pos, 0, 0, 0) QApplication.sendEvent(mainWindow, event) //! [0] //! [1] quitButton = QPushButton("Quit") quitButton.clicked.connect(app.quit) //! [1] //! [2] for path in app.libraryPaths(): do_something(path) //! [2] //! [3] myEventFilter(message, result) //! [3] //! [4] def cleanup_stuff(): # do the cleanup stuff def init_stuff(): qAddPostRoutine(cleanup_stuff) //! [4] //! [5] class MyPrivateInitStuff : public QObject { public: static MyPrivateInitStuff *initStuff(QObject *parent) { if (!p) p = new MyPrivateInitStuff(parent); return p; } ~MyPrivateInitStuff() { // cleanup goes here } private: MyPrivateInitStuff(QObject *parent) : QObject(parent) { // initialization goes here } MyPrivateInitStuff *p; }; //! [5] //! [6] static inline QString tr(const char *sourceText, const char *comment = 0); static inline QString trUtf8(const char *sourceText, const char *comment = 0); //! [6] //! [7] class MyMfcView : public CView { Q_DECLARE_TR_FUNCTIONS(MyMfcView) public: MyMfcView(); ... }; //! [7] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_kernel_qmetaobject.cpp ================================================ void wrapInFunction() { //! [0] class MyClass: Q_CLASSINFO("author", "Sabrina Schweinsteiger") Q_CLASSINFO("url", "http://doc.moosesoft.co.uk/1.0/") ... //! [0] //! [1] normType = QMetaObject.normalizedType(" int const *") # normType is now "const int*" //! [1] //! [2] QMetaObject.invokeMethod(pushButton, "animateClick", Qt.QueuedConnection) //! [2] //! [3] QMetaObject.invokeMethod: Unable to handle unregistered datatype 'MyType' //! [3] //! [4] retVal = QString() QMetaObject.invokeMethod(obj, "compute", Qt::DirectConnection, Q_RETURN_ARG(QString, retVal), Q_ARG(QString, "sqrt"), Q_ARG(int, 42), Q_ARG(double, 9.7)); //! [4] //! [5] class MyClass: Q_CLASSINFO("author", "Sabrina Schweinsteiger") Q_CLASSINFO("url", "http://doc.moosesoft.co.uk/1.0/") //! [5] //! [propertyCount] metaObject = obj.metaObject() properties = [metaObject.property(i).name() for i in range(metaObject.propertyOffset(), metaObject.propertyCount())] //! [propertyCount] //! [methodCount] metaObject = obj.metaObject() methods = [metaObject.method(i).signature() for i in range(metaObject.methodOffset(), metaObject.methodCount())] //! [methodCount] //! [6] methodIndex = pushButton.metaObject().indexOfMethod("animateClick()") method = metaObject.method(methodIndex) method.invoke(pushButton, Qt.QueuedConnection) //! [6] //! [7] QMetaMethod.invoke: Unable to handle unregistered datatype 'MyType' //! [7] //! [8] retVal = QString() normalizedSignature = QMetaObject.normalizedSignature("compute(QString, int, double)") methodIndex = obj.metaObject().indexOfMethod(normalizedSignature) method = metaObject.method(methodIndex) method.invoke(obj, Qt.DirectConnection, Q_RETURN_ARG(QString, retVal), Q_ARG(QString, "sqrt"), Q_ARG(int, 42), Q_ARG(double, 9.7)); //! [8] } ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_kernel_qmetatype.cpp ================================================ //! [0] struct MyStruct { int i; ... }; Q_DECLARE_METATYPE(MyStruct) //! [0] //! [1] namespace MyNamespace { ... } Q_DECLARE_METATYPE(MyNamespace::MyStruct) //! [1] //! [2] MyStruct s; QVariant var; var.setValue(s); // copy s into the variant ... // retrieve the value MyStruct s2 = var.value(); //! [2] //! [3] int id = QMetaType::type("MyClass"); if (id == 0) { void *myClassPtr = QMetaType::construct(id); ... QMetaType::destroy(id, myClassPtr); myClassPtr = 0; } //! [3] //! [4] qRegisterMetaType("MyClass"); //! [4] //! [5] qRegisterMetaTypeStreamOperators("MyClass"); //! [5] //! [6] QDataStream &operator<<(QDataStream &out, const MyClass &myObj); QDataStream &operator>>(QDataStream &in, MyClass &myObj); //! [6] //! [7] int id = qRegisterMetaType(); //! [7] //! [8] int id = qMetaTypeId(); // id is now QMetaType::QString id = qMetaTypeId(); // compile error if MyStruct not declared //! [8] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_kernel_qmimedata.cpp ================================================ //! [0] def dragEnterEvent(self, event): if event.mimeData().hasUrls(): event.acceptProposedAction() def dropEvent(self, event): if event->mimeData().hasUrls(): for url in event.mimeData().urls(): ... //! [0] //! [1] csvData = QByteArray(...) mimeData = QMimeData() mimeData.setData("text/csv", csvData) //! [1] //! [2] def dropEvent(self, event): myData = event->mimeData() if myData: # access myData's data directly (not through QMimeData's API) } //! [2] //! [3] application/x-qt-windows-mime;value="" //! [3] //! [4] application/x-qt-windows-mime;value="FileGroupDescriptor" application/x-qt-windows-mime;value="FileContents" //! [4] //! [5] if event.mimeData().hasImage(): image = QImage(event.mimeData().imageData()) ... //! [5] //! [6] mimeData.setImageData(QImage("beautifulfjord.png")) //! [6] //! [7] if event.mimeData().hasColor(): color = QColor(event.mimeData().colorData()) ... //! [7] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_kernel_qobject.cpp ================================================ //! [0] lineEdit = qt_find_obj_child(myWidget, "QLineEdit", "my line edit") if lineEdit: lineEdit.setText("Default") //! [0] //! [1] obj = QPushButton() obj.metaObject().className() # returns "QPushButton" QPushButton.staticMetaObject.className() # returns "QPushButton" //! [1] //! [2] QPushButton.staticMetaObject.className() # returns "QPushButton" obj = QPushButton() obj.metaObject().className() # returns "QPushButton" //! [2] //! [3] obj = QTimer() # QTimer inherits QObject timer = obj # timer == (QObject *)obj button = obj # button == 0 //! [3] //! [4] timer = QTimer() # QTimer inherits QObject timer.inherits("QTimer") # returns true timer.inherits("QObject") # returns true timer.inherits("QAbstractButton") # returns false # QLayout inherits QObject and QLayoutItem layout = QLayout() layout.inherits("QObject") # returns true layout.inherits("QLayoutItem") # returns false //! [4] //! [5] print "MyClass::setPrecision(): (%s) invalid precision %f" % \ (qPrintable(objectName()), newPrecision) //! [5] //! [6] class MainWindow(QMainWindow): def __init__(self): self.textEdit = QTextEdit() setCentralWidget(self.textEdit) textEdit.installEventFilter(self) def eventFilter(self, obj, event): if obj == textEdit: if event.type() == QEvent.KeyPress: keyEvent = event print "Ate key press", keyEvent.key() return true else: return false else: # pass the event on to the parent class return QMainWindow.eventFilter(self, obj, event) //! [6] //! [7] myObject.moveToThread(QApplication.instance().thread()) //! [7] //! [8] class MyObject(QObject): def __init__(self, parent): QObject.__init__(self, parent) self.startTimer(50) # 50-millisecond timer self.startTimer(1000) # 1-second timer self.startTimer(60000) # 1-minute timer def timerEvent(self, event): print "Timer ID:", event.timerId() //! [8] //! [9] list = window().queryList("QAbstractButton") for obj in list: obj.setEnabled(false) //! [9] //! [10] button = parentWidget.findChild(QPushButton, "button1") //! [10] //! [11] list = parentWidget.findChild(QListWidget) //! [11] //! [12] widgets = parentWidget.findChildren(QWidget, "widgetname") //! [12] //! [13] allPButtons = parentWidget.findChildren(QPushButton) //! [13] //! [14] monitoredObj.installEventFilter(filterObj) //! [14] //! [15] class KeyPressEater(QObject): def eventFilter(self, obj, event): if event.type() == QEvent.KeyPress: print "Ate key press", event.key() return True else: # standard event processing return QObject.eventFilter(self, obj, event) //! [15] //! [16] keyPressEater = KeyPressEater(self) pushButton = QPushButton(self) listView = QListView(self) pushButton.installEventFilter(keyPressEater) listView.installEventFilter(keyPressEater) //! [16] //! [17] def __init__(self): senderLabel = QLabel(self.tr("Name:")) recipientLabel = QLabel(self.tr("Name:", "recipient")) # ... //! [17] //! [18] n = messages.count(); showMessage(self.tr("%n message(s) saved", "", n)); //! [18] //! [19] if n == 1: self.tr("%n message saved") else: self.tr("%n messages saved") //! [19] //! [20] label.setText(self.tr("F\374r \310lise")) //! [20] //! [21] if receivers(SIGNAL('valueChanged()')) > 0: data = get_the_value() # expensive operation self.valueChanged(data) //! [21] //! [22] label = QLabel() scrollBar = QScrollBar() QObject.connect(scrollBar, SIGNAL('valueChanged()'), label, SLOT('setNum()')) //! [22] //! [23] // WRONG QObject.connect(scrollBar, SIGNAL('valueChanged()'), label, SLOT('setNum()')); //! [23] //! [24] class MyWidget(QWidget): def __init__(self): myButton = QPushButton(self) connect(myButton, SIGNAL('clicked()'), self, SIGNAL('buttonClicked()')) //! [24] //! [25] QObject.connect: Cannot queue arguments of type 'MyType' (Make sure 'MyType' is registered using qRegisterMetaType().) //! [25] //! [26] disconnect(myObject, 0, 0, 0) //! [26] //! [27] myObject.disconnect() //! [27] //! [28] disconnect(myObject, SIGNAL('mySignal()'), 0, 0) //! [28] //! [29] myObject.disconnect(SIGNAL('mySignal()')) //! [29] //! [30] disconnect(myObject, 0, myReceiver, 0) //! [30] //! [31] myObject.disconnect(myReceiver) //! [31] //! [32] if QLatin1String(signal) == SIGNAL('valueChanged()'): # signal is valueChanged() //! [32] //! [33] def on__() //! [33] //! [34] def on_button1_clicked() //! [34] //! [35] class MyClass(QObject): Q_CLASSINFO("Author", "Pierre Gendron") Q_CLASSINFO("URL", "http://www.my-organization.qc.ca") //! [35] //! [36] Q_PROPERTY(type name READ getFunction [WRITE setFunction] [RESET resetFunction] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] [USER bool]) //! [36] //! [37] Q_PROPERTY(QString title READ title WRITE setTitle USER true) //! [37] //! [38] #this not apply for Python class MyClass(QObject): Q_OBJECT Q_ENUMS(Priority) public: MyClass(QObject *parent = 0); ~MyClass(); enum Priority { High, Low, VeryHigh, VeryLow }; void setPriority(Priority priority); Priority priority() const; }; //! [38] //! [39] #this not apply for Python Q_FLAGS(Options Alignment) //! [39] //! [40] //: This name refers to a host name. hostNameLabel.setText(self.tr("Name:")) #: This text refers to a C++ code example. example = self.tr("Example") //! [40] //! [explicit tr context] text = QScrollBar.tr("Page up") //! [explicit tr context] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_kernel_qsystemsemaphore.cpp ================================================ //! [0] sem = QSystemSemaphore("market", 3, QSystemSemaphore.Create) # resources available == 3 sem.acquire() # resources available == 2 sem.acquire() # resources available == 1 sem.acquire() # resources available == 0 sem.release() # resources available == 1 sem.release(2) # resources available == 3 //! [0] //! [1] sem = QSystemSemaphore("market", 5, QSystemSemaphore.Create) sem.acquire(5) # acquire all 5 resources sem.release(5) # release the 5 resources //! [1] //! [2] sem.release(10) # "create" 10 new resources //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_kernel_qtimer.cpp ================================================ //! [0] from PySide.QtCore import QApplication, QTimer def main(): app = QApplication([]) QTimer.singleShot(600000, app, SLOT('quit()')) ... return app.exec_() //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_plugin_qlibrary.cpp ================================================ //! [0] QLibrary myLib("mylib"); typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol"); if (myFunction) myFunction(); //! [0] //! [1] typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) QLibrary::resolve("mylib", "mysymbol"); if (myFunction) myFunction(); //! [1] //! [2] typedef int (*AvgFunction)(int, int); AvgFunction avg = (AvgFunction) library->resolve("avg"); if (avg) return avg(5, 8); else return -1; //! [2] //! [3] extern "C" MY_EXPORT int avg(int a, int b) { return (a + b) / 2; } //! [3] //! [4] #ifdef Q_WS_WIN #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_plugin_quuid.cpp ================================================ //! [0] # {67C8770B-44F1-410A-AB9A-F9B5446F13EE} IID_MyInterface = QUuid(0x67c8770b, 0x44f1, 0x410a, 0xab, 0x9a, 0xf9, 0xb5, 0x44, 0x6f, 0x13, 0xee) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_statemachine_qstatemachine.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [simple state machine] button = QPushButton() machine = QStateMachine() s1 = QState() s1.assignProperty(button, "text", "Click me") s2 = QFinalState() s1.addTransition(button, SIGNAL('clicked()'), s2) machine.addState(s1) machine.addState(s2) machine.setInitialState(s1) machine.start() //! [simple state machine] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_thread_qatomic.cpp ================================================ //! [0] MySharedType &MySharedType::operator=(const MySharedType &other) { (void) other.data->atomicInt.ref(); if (!data->atomicInt.deref()) { // The last reference has been released delete d; } d = other.d; return *this; } //! [0] //! [1] if (currentValue == expectedValue) { currentValue = newValue; return true; } return false; //! [1] //! [2] int originalValue = currentValue; currentValue = newValue; return originalValue; //! [2] //! [3] int originalValue = currentValue; currentValue += valueToAdd; return originalValue; //! [3] //! [4] if (currentValue == expectedValue) { currentValue = newValue; return true; } return false; //! [4] //! [5] T *originalValue = currentValue; currentValue = newValue; return originalValue; //! [5] //! [6] T *originalValue = currentValue; currentValue += valueToAdd; return originalValue; //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_thread_qmutex.cpp ================================================ //! [0] number = 6 def method1(): number *= 5 number /= 4 def method2(): number *= 3 number /= 2 //! [0] //! [1] # method1() number *= 5 # number is now 30 number /= 4 # number is now 7 # method2() number *= 3 # number is now 21 number /= 2 # number is now 10 //! [1] //! [2] # Thread 1 calls method1() number *= 5 # number is now 30 # Thread 2 calls method2(). # # Most likely Thread 1 has been put to sleep by the operating # system to allow Thread 2 to run. number *= 3 # number is now 90 number /= 2 # number is now 45 # Thread 1 finishes executing. number /= 4 # number is now 11, instead of 10 //! [2] //! [3] mutex = QMutex() number = 6 def method1(): mutex.lock() number *= 5 number /= 4 mutex.unlock() def method2(): mutex.lock() number *= 3 number /= 2 mutex.unlock() //! [3] //! [4] def complexFunction(flag): mutex.lock() retVal = 0 if flag == 0 or flag == 1: mutex.unlock() return moreComplexFunction(flag) elif flag == 2: status = anotherFunction() if status < 0: mutex.unlock() return -2 retVal = status + flag else: if flag > 10: mutex.unlock() return -1 mutex.unlock() return retVal //! [4] //! [5] def complexFunction(flag): locker = QMutexLocker(mutex) retVal = 0 if flag == 0 or flag == 1: return moreComplexFunction(flag) elif flag == 2: status = anotherFunction() if status < 0: return -2 retVal = status + flag else: if flag > 10: return -1 return retVal //! [5] //! [6] class SignalWaiter: def __init__(mutex): self.locker = mutex def waitForSignal(): # ... while not signalled: waitCondition.wait(self.locker.mutex()) # ... //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_thread_qmutexpool.cpp ================================================ //! [0] class Number: def __init__(n): self.num = n //! [0] //! [1] def calcSquare(number): locker = QMutexLocker(mutexpool.get(number)) number.num = number.num * number.num //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_thread_qreadwritelock.cpp ================================================ //! [0] lock = QReadWriteLock() class ReaderThread: # ... def run(): # ... lock.lockForRead() read_file() lock.unlock() # ... class WriterThread: #... def run(): # ... lock.lockForWrite() write_file() lock.unlock() # ... //! [0] //! [1] lock = QReadWriteLock() def readData(): locker = QReadLocker(lock) # ... return data //! [1] //! [2] lock = QReadWriteLock() def readData(): locker.lockForRead() # ... locker.unlock() return data //! [2] //! [3] lock = QReadWriteLock() def writeData(data): locker = QWriteLocker(lock) # ... //! [3] //! [4] lock = QReadWriteLock() def writeData(data): locker.lockForWrite() # ... locker.unlock() //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_thread_qsemaphore.cpp ================================================ //! [0] sem = QSemaphore(5) # sem.available() == 5 sem.acquire(3) # sem.available() == 2 sem.acquire(2) # sem.available() == 0 sem.release(5) # sem.available() == 5 sem.release(5) # sem.available() == 10 sem.tryAcquire(1) # sem.available() == 9, returns true sem.tryAcquire(250) # sem.available() == 9, returns false //! [0] //! [1] sem = QSemaphore(5) # a semaphore that guards 5 resources sem.acquire(5) # acquire all 5 resources sem.release(5) # release the 5 resources sem.release(10) # "create" 10 new resources //! [1] //! [2] sem = QSemaphore(5) # sem.available() == 5 sem.tryAcquire(250) # sem.available() == 5, returns false sem.tryAcquire(3) # sem.available() == 2, returns true //! [2] //! [3] sem = QSemaphore(5) # sem.available() == 5 sem.tryAcquire(250, 1000) # sem.available() == 5, waits 1000 milliseconds and returns false sem.tryAcquire(3, 30000) # sem.available() == 2, returns true without waiting //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_thread_qthread.cpp ================================================ //! [0] class MyThread (QThread): def run(): socket = QTcpSocket() # connect QTcpSocket's signals somewhere meaningful # ... socket.connectToHost(hostName, portNumber) self.exec_() //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_thread_qwaitcondition_unix.cpp ================================================ //! [0] while True: mutex.lock() keyPressed.wait(mutex) do_something() mutex.unlock() //! [0] //! [1] while True: getchar() keyPressed.wakeAll() //! [1] //! [2] while True: mutex.lock() keyPressed.wait(&mutex) count += 1 mutex.unlock() do_something() mutex.lock() count -= 1 mutex.unlock() //! [2] //! [3] while True: getchar() mutex.lock() # Sleep until there are no busy worker threads while count > 0: mutex.unlock() sleep(1) mutex.lock() keyPressed.wakeAll() mutex.unlock() //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qbitarray.cpp ================================================ //! [0] ba = QBitArray(200) //! [0] //! [1] ba = QBitArray() ba.resize(3) ba[0] = True ba[1] = False ba[2] = True //! [1] //! [2] ba = QBitArray(3) ba.setBit(0, True) ba.setBit(1, False) ba.setBit(2, True) //! [2] //! [3] x = QBitArray(5) x.setBit(3, True) # x: [ 0, 0, 0, 1, 0 ] y = QBitArray(5) y.setBit(4, True) # y: [ 0, 0, 0, 0, 1 ] x |= y # x: [ 0, 0, 0, 1, 1 ] //! [3] //! [4] QBitArray().isNull() # returns True QBitArray().isEmpty() # returns True QBitArray(0).isNull() # returns False QBitArray(0).isEmpty() # returns True QBitArray(3).isNull() # returns False QBitArray(3).isEmpty() # returns False //! [4] //! [5] QBitArray().isNull() # returns True QBitArray(0).isNull() # returns False QBitArray(3).isNull() # returns False //! [5] //! [6] ba = QBitArray(8) ba.fill(True) # ba: [ 1, 1, 1, 1, 1, 1, 1, 1 ] ba.fill(False, 2) # ba: [ 0, 0 ] //! [6] //! [7] a = QBitArray(3) a[0] = False a[1] = True a[2] = a[0] ^ a[1] //! [7] //! [8] a = QBitArray(3) b = QBitArray(2) a[0] = 1 a[1] = 0 a[2] = 1 # a: [ 1, 0, 1 ] b[0] = 1 b[1] = 0 # b: [ 1, 1 ] a &= b # a: [ 1, 0, 0 ] //! [8] //! [9] a = QBitArray(3) b = QBitArray(2) a[0] = 1 a[1] = 0 a[2] = 1 # a: [ 1, 0, 1 ] b[0] = 1 b[1] = 0 # b: [ 1, 1 ] a |= b # a: [ 1, 1, 1 ] //! [9] //! [10] a = QBitArray(3) b = QBitArray(2) a[0] = 1 a[1] = 0 a[2] = 1 # a: [ 1, 0, 1 ] b[0] = 1 b[1] = 0 # b: [ 1, 1 ] a ^= b # a: [ 0, 1, 1 ] //! [10] //! [11] a = QBitArray(3) b = QBitArray() a[0] = 1 a[1] = 0 a[2] = 1 # a: [ 1, 0, 1 ] b = ~a # b: [ 0, 1, 0 ] //! [11] //! [12] a = QBitArray(3) b = QBitArray(2) c = QBitArray() a[0] = 1 a[1] = 0 a[2] = 1 # a: [ 1, 0, 1 ] b[0] = 1 b[1] = 0 # b: [ 1, 1 ] c = a & b # c: [ 1, 0, 0 ] //! [12] //! [13] a = QBitArray(3) QBitArray b(2) QBitArray c a[0] = 1 a[1] = 0 a[2] = 1 # a: [ 1, 0, 1 ] b[0] = 1 b[1] = 0 # b: [ 1, 1 ] c = a | b # c: [ 1, 1, 1 ] //! [13] //! [14] a = QBitArray(3) b = QBitArray(2) c = QBitArray() a[0] = 1 a[1] = 0 a[2] = 1 # a: [ 1, 0, 1 ] b[0] = 1 b[1] = 0 # b: [ 1, 1 ] c = a ^ b # c: [ 0, 1, 1 ] //! [14] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qbytearray.cpp ================================================ void wrapInFunction() { //! [0] ba = QByteArray("Hello") //! [0] //! [1] ba = QByteArray() ba.resize(5) ba[0] = 'H' ba[1] = 'e' ba[2] = 'l' ba[3] = 'l' ba[4] = 'o' //! [1] //! [2] for i in range(0, ba.size()): if ba.at(i) >= 'a' and ba.at(i) <= 'f': print "Found character in range [a-f]" //! [2] //! [3] x = QByteArray("and") x.prepend("rock ") # x == "rock and" x.append(" roll") # x == "rock and roll" x.replace(5, 3, "&") # x == "rock & roll" //! [3] //! [4] ba = QByteArray("We must be bold, very bold") j = 0 while (j = ba.indexOf("", j)) != -1: print "Found tag at index position %d" % j ++j //! [4] //! [5] QByteArray().isNull() # returns true QByteArray().isEmpty() # returns true QByteArray("").isNull() # returns false QByteArray("").isEmpty() # returns true QByteArray("abc").isNull() # returns false QByteArray("abc").isEmpty() # returns false //! [5] //! [6] ba = QByteArray("Hello") n = ba.size() # n == 5 ba.data()[0] # returns 'H' ba.data()[4] # returns 'o' //! [6] //! [7] QByteArray().isEmpty() # returns true QByteArray("").isEmpty() # returns true QByteArray("abc").isEmpty() # returns false //! [7] //! [8] ba = QByteArray("Hello world"); print ba.data(); //! [8] //! [9] ba = QByteArray() for i in range(0, 10): ba[i] = 'A' + str(i) # ba == "ABCDEFGHIJ" //! [9] //! [10] ba = QByteArray("Stockholm") ba.truncate(5) # ba == "Stock" //! [10] //! [11] ba = QByteArray("STARTTLS\r\n") ba.chop(2) # ba == "STARTTLS" //! [11] //! [12] x = QByteArray("free") y = QByteArray("dom"); x += y # x == "freedom" //! [12] //! [13] QByteArray().isNull() # returns true QByteArray("").isNull() # returns false QByteArray("abc").isNull() # returns false //! [13] //! [14] ba = QByteArray("Istambul") ba.fill('o') # ba == "oooooooo" ba.fill('X', 2) # ba == "XX" //! [14] //! [15] x = QByteArray("ship") y = QByteArray("air") x.prepend(y) # x == "airship" //! [15] //! [16] x = QByteArray("free") y = QByteArray("dom") x.append(y) # x == "freedom" //! [16] //! [17] ba = QByteArray("Meal") ba.insert(1, QByteArray("ontr")) # ba == "Montreal" //! [17] //! [18] ba = QByteArray("Montreal") ba.remove(1, 4) # ba == "Meal" //! [18] //! [19] x = QByteArray("Say yes!") y = QByteArray("no") x.replace(4, 3, y) # x == "Say no!" //! [19] //! [20] ba = QByteArray("colour behaviour flavour neighbour") ba.replace(QByteArray("ou"), QByteArray("o")) # ba == "color behavior flavor neighbor" //! [20] //! [21] x = QByteArray("sticky question") y = QByteArray("sti") x.indexOf(y) # returns 0 x.indexOf(y, 1) # returns 10 x.indexOf(y, 10) # returns 10 x.indexOf(y, 11) # returns -1 //! [21] //! [22] ba = QByteArray("ABCBA") ba.indexOf("B") # returns 1 ba.indexOf("B", 1) # returns 1 ba.indexOf("B", 2) # returns 3 ba.indexOf("X") # returns -1 //! [22] //! [23] x = QByteArray("crazy azimuths") y = QByteArray("azy") x.lastIndexOf(y) # returns 6 x.lastIndexOf(y, 6) # returns 6 x.lastIndexOf(y, 5) # returns 2 x.lastIndexOf(y, 1) # returns -1 //! [23] //! [24] ba = QByteArray("ABCBA") ba.lastIndexOf("B") # returns 3 ba.lastIndexOf("B", 3) # returns 3 ba.lastIndexOf("B", 2) # returns 1 ba.lastIndexOf("X") # returns -1 //! [24] //! [25] url = QByteArray("ftp://ftp.trolltech.com/") if url.startsWith("ftp:"): ... //! [25] //! [26] url = QByteArray("http://qtsoftware.com/index.html") if url.endsWith(".html"): ... //! [26] //! [27] x = QByteArray("Pineapple") y = x.left(4) # y == "Pine" //! [27] //! [28] x = QByteArray("Pineapple") y = x.right(5) # y == "apple" //! [28] //! [29] x = QByteArray("Five pineapples") y = x.mid(5, 4) # y == "pine" z = x.mid(5) # z == "pineapples" //! [29] //! [30] x = QByteArray("TROlltECH") y = x.toLower() # y == "trolltech" //! [30] //! [31] x = QByteArray("TROlltECH") y = x.toUpper() # y == "TROLLTECH" //! [31] //! [32] ba = QByteArray(" lots\t of\nwhitespace\r\n ") ba = ba.simplified() # ba == "lots of whitespace"; //! [32] //! [33] ba = QByteArray(" lots\t of\nwhitespace\r\n "); ba = ba.trimmed(); # ba == "lots\t of\nwhitespace"; //! [33] //! [34] x = QByteArray("apple") y = x.leftJustified(8, '.') # y == "apple..." //! [34] //! [35] x = QByteArray("apple") y = x.rightJustified(8, '.') # y == "...apple" //! [35] //! [36] string = QByteArray("FF") (hex, ok) = string.toInt(16) # hex == 255, ok == true (dec, ok) = string.toInt(10) # dec == 0, ok == false //! [36] //! [37] string = QByteArray("FF") (hex, ok) = str.toLong(16); # hex == 255, ok == true (dec, ok) = str.toLong(10); # dec == 0, ok == false //! [37] //! [38] string = QByteArray("1234.56") (a, ok) = string.toDouble() # a == 1234.56, ok == true //! [38] //! [39] text = QByteArray("Qt is great!") text.toBase64() # returns "UXQgaXMgZ3JlYXQh" //! [39] //! [40] ba = QByteArray() n = 63 ba.setNum(n) # ba == "63" ba.setNum(n, 16) # ba == "3f" //! [40] //! [41] n = 63; QByteArray.number(n) # returns "63" QByteArray.number(n, 16) # returns "3f" QByteArray.number(n, 16).toUpper() # returns "3F" //! [41] //! [42] ba = QByteArray.number(12.3456, 'E', 3) # ba == 1.235E+01 //! [42] //! [43] mydata = '\x00\x00\x03\x84\x78\x9c\x3b\x76'\ '\xec\x18\xc3\x31\x0a\xf1\xcc\x99'\ ... '\x6d\x5b' data = QByteArray.fromRawData(mydata) in_ = QDataStream(data, QIODevice.ReadOnly) ... //! [43] //! [44] text = QByteArray.fromBase64("UXQgaXMgZ3JlYXQh") text.data() # returns "Qt is great!" //! [44] //! [45] text = QByteArray.fromHex("517420697320677265617421") text.data() # returns "Qt is great!" //! [45] } ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qdatetime.cpp ================================================ //! [0] d1 = QDate(1995, 5, 17) # May 17, 1995 d2 = QDate(1995, 5, 20) # May 20, 1995 d1.daysTo(d2) # returns 3 d2.daysTo(d1) # returns -3 //! [0] //! [1] date = QDate.fromString("1MM12car2003", "d'MM'MMcaryyyy") # date is 1 December 2003 //! [1] //! [2] date = QDate.fromString("130", "Md") # invalid //! [2] //! [3] QDate.fromString("1.30", "M.d") # January 30 1900 QDate.fromString("20000110", "yyyyMMdd") # January 10, 2000 QDate.fromString("20000110", "yyyyMd") # January 10, 2000 //! [3] //! [4] QDate.isValid(2002, 5, 17) # True QDate.isValid(2002, 2, 30) # False (Feb 30 does not exist) QDate.isValid(2004, 2, 29) # True (2004 is a leap year) QDate.isValid(2000, 2, 29) # True (2000 is a leap year) QDate.isValid(2006, 2, 29) # False (2006 is not a leap year) QDate.isValid(2100, 2, 29) # False (2100 is not a leap year) QDate.isValid(1202, 6, 6) # True (even though 1202 is pre-Gregorian) //! [4] //! [5] n = QTime(14, 0, 0) # n == 14:00:00 t = QTime() t = n.addSecs(70) # t == 14:01:10 t = n.addSecs(-70) # t == 13:58:50 t = n.addSecs(10 * 60 * 60 + 5) # t == 00:00:05 t = n.addSecs(-15 * 60 * 60) # t == 23:00:00 //! [5] //! [6] time = QTime.fromString("1mm12car00", "m'mm'hcarss") # time is 12:01.00 //! [6] //! [7] time = QTime.fromString("00:710", "hh:ms") # invalid //! [7] //! [8] time = QTime.fromString("1.30", "m.s") # time is 00:01:30.000 //! [8] //! [9] QTime.isValid(21, 10, 30) # returns True QTime.isValid(22, 5, 62) # returns False //! [9] //! [10] t = QTime() t.start() some_lengthy_task() print ("Time elapsed: %d ms" % t.elapsed()) //! [10] //! [11] now = QDateTime.currentDateTime() xmas(QDate(now.date().year(), 12, 25), QTime(0, 0)) print("There are %d seconds to Christmas" % now.secsTo(xmas)) //! [11] //! [12] time1 = QTime.fromString("131", "HHh") # time1 is 13:00:00 time1 = QTime.fromString("1apA", "1amAM") # time1 is 01:00:00 dateTime2 = QDateTime.fromString("M1d1y9800:01:02", "'M'M'd'd'y'yyhh:mm:ss") # dateTime is 1 January 1998 00:01:02 //! [12] //! [13] dateTime = QDateTime.fromString("130", "Mm") # invalid //! [13] //! [14] dateTime = QDateTime.fromString("1.30.1", "M.d.s") # dateTime is January 30 in 1900 at 00:00:01. //! [14] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qhash.cpp ================================================ //! [0] QHash hash; //! [0] //! [1] hash["one"] = 1; hash["three"] = 3; hash["seven"] = 7; //! [1] //! [2] hash.insert("twelve", 12); //! [2] //! [3] int num1 = hash["thirteen"]; int num2 = hash.value("thirteen"); //! [3] //! [4] int timeout = 30; if (hash.contains("TIMEOUT")) timeout = hash.value("TIMEOUT"); //! [4] //! [5] int timeout = hash.value("TIMEOUT", 30); //! [5] //! [6] // WRONG QHash hash; ... for (int i = 0; i < 1000; ++i) { if (hash[i] == okButton) cout << "Found button at index " << i << endl; } //! [6] //! [7] QHashIterator i(hash); while (i.hasNext()) { i.next(); cout << i.key() << ": " << i.value() << endl; } //! [7] //! [8] QHash::const_iterator i = hash.constBegin(); while (i != hash.constEnd()) { cout << i.key() << ": " << i.value() << endl; ++i; } //! [8] //! [9] hash.insert("plenty", 100); hash.insert("plenty", 2000); // hash.value("plenty") == 2000 //! [9] //! [10] QList values = hash.values("plenty"); for (int i = 0; i < values.size(); ++i) cout << values.at(i) << endl; //! [10] //! [11] QHash::iterator i = hash.find("plenty"); while (i != hash.end() && i.key() == "plenty") { cout << i.value() << endl; ++i; } //! [11] //! [12] QHash hash; ... foreach (int value, hash) cout << value << endl; //! [12] //! [13] #ifndef EMPLOYEE_H #define EMPLOYEE_H class Employee { public: Employee() {} Employee(const QString &name, const QDate &dateOfBirth); ... private: QString myName; QDate myDateOfBirth; }; inline bool operator==(const Employee &e1, const Employee &e2) { return e1.name() == e2.name() && e1.dateOfBirth() == e2.dateOfBirth(); } inline uint qHash(const Employee &key) { return qHash(key.name()) ^ key.dateOfBirth().day(); } #endif // EMPLOYEE_H //! [13] //! [14] QHash hash; hash.reserve(20000); for (int i = 0; i < 20000; ++i) hash.insert(keys[i], values[i]); //! [14] //! [15] QHash objectHash; ... QHash::iterator i = objectHash.find(obj); while (i != objectHash.end() && i.key() == obj) { if (i.value() == 0) { i = objectHash.erase(i); } else { ++i; } } //! [15] //! [16] QHash hash; ... QHash::const_iterator i = hash.find("HDR"); while (i != hash.end() && i.key() == "HDR") { cout << i.value() << endl; ++i; } //! [16] //! [17] QHash hash; hash.insert("January", 1); hash.insert("February", 2); ... hash.insert("December", 12); QHash::iterator i; for (i = hash.begin(); i != hash.end(); ++i) cout << i.key() << ": " << i.value() << endl; //! [17] //! [18] QHash::iterator i; for (i = hash.begin(); i != hash.end(); ++i) i.value() += 2; //! [18] //! [19] QHash::iterator i = hash.begin(); while (i != hash.end()) { if (i.key().startsWith("_")) i = hash.erase(i); else ++i; } //! [19] //! [20] QHash::iterator i = hash.begin(); while (i != hash.end()) { QHash::iterator prev = i; ++i; if (prev.key().startsWith("_")) hash.erase(prev); } //! [20] //! [21] // WRONG while (i != hash.end()) { if (i.key().startsWith("_")) hash.erase(i); ++i; } //! [21] //! [22] if (i.key() == "Hello") i.value() = "Bonjour"; //! [22] //! [23] QHash hash; hash.insert("January", 1); hash.insert("February", 2); ... hash.insert("December", 12); QHash::const_iterator i; for (i = hash.constBegin(); i != hash.constEnd(); ++i) cout << i.key() << ": " << i.value() << endl; //! [23] //! [24] QMultiHash hash1, hash2, hash3; hash1.insert("plenty", 100); hash1.insert("plenty", 2000); // hash1.size() == 2 hash2.insert("plenty", 5000); // hash2.size() == 1 hash3 = hash1 + hash2; // hash3.size() == 3 //! [24] //! [25] QList values = hash.values("plenty"); for (int i = 0; i < values.size(); ++i) cout << values.at(i) << endl; //! [25] //! [26] QMultiHash::iterator i = hash.find("plenty"); while (i != hash.end() && i.key() == "plenty") { cout << i.value() << endl; ++i; } //! [26] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qlinkedlist.cpp ================================================ //! [0] QLinkedList integerList; QLinkedList timeList; //! [0] //! [1] QLinkedList list; list << "one" << "two" << "three"; // list: ["one", "two", "three"] //! [1] //! [2] QLinkedList list; ... while (!list.isEmpty()) delete list.takeFirst(); //! [2] //! [3] QLinkedList list; list.append("one"); list.append("two"); list.append("three"); // list: ["one", "two", "three"] //! [3] //! [4] QLinkedList list; list.prepend("one"); list.prepend("two"); list.prepend("three"); // list: ["three", "two", "one"] //! [4] //! [5] QList list; list << "sun" << "cloud" << "sun" << "rain"; list.removeAll("sun"); // list: ["cloud", "rain"] //! [5] //! [6] QList list; list << "sun" << "cloud" << "sun" << "rain"; list.removeOne("sun"); // list: ["cloud", "sun", "rain"] //! [6] //! [7] QLinkedList list; list.append("January"); list.append("February"); ... list.append("December"); QLinkedList::iterator i; for (i = list.begin(); i != list.end(); ++i) cout << *i << endl; //! [7] //! [8] QLinkedList list; ... QLinkedList::iterator it = qFind(list.begin(), list.end(), "Joel"); if (it != list.end()) cout << "Found Joel" << endl; //! [8] //! [9] QLinkedList::iterator i; for (i = list.begin(); i != list.end(); ++i) *i += 2; //! [9] //! [10] QLinkedList list; ... QLinkedList::iterator i = list.begin(); while (i != list.end()) { if ((*i).startsWith("_")) i = list.erase(i); else ++i; } //! [10] //! [11] QLinkedList::iterator i = list.begin(); while (i != list.end()) { QLinkedList::iterator previous = i; ++i; if ((*previous).startsWith("_")) list.erase(previous); } //! [11] //! [12] // WRONG while (i != list.end()) { if ((*i).startsWith("_")) list.erase(i); ++i; } //! [12] //! [13] if (*it == "Hello") *it = "Bonjour"; //! [13] //! [14] QLinkedList list; list.append("January"); list.append("February"); ... list.append("December"); QLinkedList::const_iterator i; for (i = list.constBegin(); i != list.constEnd(); ++i) cout << *i << endl; //! [14] //! [15] QLinkedList list; ... QLinkedList::iterator it = qFind(list.constBegin(), list.constEnd(), "Joel"); if (it != list.constEnd()) cout << "Found Joel" << endl; //! [15] //! [16] std::list stdlist; list.push_back(1.2); list.push_back(0.5); list.push_back(3.14); QLinkedList list = QLinkedList::fromStdList(stdlist); //! [16] //! [17] QLinkedList list; list << 1.2 << 0.5 << 3.14; std::list stdlist = list.toStdList(); //! [17] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qlistdata.cpp ================================================ //! [0] QList integerList; QList dateList; //! [0] //! [1] QList list; list << "one" << "two" << "three"; // list: ["one", "two", "three"] //! [1] //! [2] if (list[0] == "Bob") list[0] = "Robert"; //! [2] //! [3] for (int i = 0; i < list.size(); ++i) { if (list.at(i) == "Jane") cout << "Found Jane at position " << i << endl; } //! [3] //! [4] QList list; ... while (!list.isEmpty()) delete list.takeFirst(); //! [4] //! [5] int i = list.indexOf("Jane"); if (i != -1) cout << "First occurrence of Jane is at position " << i << endl; //! [5] //! [6] QList list; list.append("one"); list.append("two"); list.append("three"); // list: ["one", "two", "three"] //! [6] //! [7] QList list; list.prepend("one"); list.prepend("two"); list.prepend("three"); // list: ["three", "two", "one"] //! [7] //! [8] QList list; list << "alpha" << "beta" << "delta"; list.insert(2, "gamma"); // list: ["alpha", "beta", "gamma", "delta"] //! [8] //! [9] QList list; list << "sun" << "cloud" << "sun" << "rain"; list.removeAll("sun"); // list: ["cloud", "rain"] //! [9] //! [10] QList list; list << "sun" << "cloud" << "sun" << "rain"; list.removeOne("sun"); // list: ["cloud", ,"sun", "rain"] //! [10] //! [11] QList list; list << "A" << "B" << "C" << "D" << "E" << "F"; list.move(1, 4); // list: ["A", "C", "D", "E", "B", "F"] //! [11] //! [12] QList list; list << "A" << "B" << "C" << "D" << "E" << "F"; list.swap(1, 4); // list: ["A", "E", "C", "D", "B", "F"] //! [12] //! [13] QList list; list << "A" << "B" << "C" << "B" << "A"; list.indexOf("B"); // returns 1 list.indexOf("B", 1); // returns 1 list.indexOf("B", 2); // returns 3 list.indexOf("X"); // returns -1 //! [13] //! [14] QList list; list << "A" << "B" << "C" << "B" << "A"; list.lastIndexOf("B"); // returns 3 list.lastIndexOf("B", 3); // returns 3 list.lastIndexOf("B", 2); // returns 1 list.lastIndexOf("X"); // returns -1 //! [14] //! [15] QList list; list.append("January"); list.append("February"); ... list.append("December"); QList::iterator i; for (i = list.begin(); i != list.end(); ++i) cout << *i << endl; //! [15] //! [16] QList::iterator i; for (i = list.begin(); i != list.end(); ++i) *i += 2; //! [16] //! [17] QList list; ... qDeleteAll(list.begin(), list.end()); //! [17] //! [18] if (*it == "Hello") *it = "Bonjour"; //! [18] //! [19] QList list; list.append("January"); list.append("February"); ... list.append("December"); QList::const_iterator i; for (i = list.constBegin(); i != list.constEnd(); ++i) cout << *i << endl; //! [19] //! [20] QList list; ... qDeleteAll(list.constBegin(), list.constEnd()); //! [20] //! [21] QVector vect; vect << 20.0 << 30.0 << 40.0 << 50.0; QList list = QVector::fromVector(vect); // list: [20.0, 30.0, 40.0, 50.0] //! [21] //! [22] QStringList list; list << "Sven" << "Kim" << "Ola"; QVector vect = list.toVector(); // vect: ["Sven", "Kim", "Ola"] //! [22] //! [23] QSet set; set << 20.0 << 30.0 << 40.0 << ... << 70.0; QList list = QList::fromSet(set); qSort(list); //! [23] //! [24] QStringList list; list << "Julia" << "Mike" << "Mike" << "Julia" << "Julia"; QSet set = list.toSet(); set.contains("Julia"); // returns true set.contains("Mike"); // returns true set.size(); // returns 2 //! [24] //! [25] std::list stdlist; list.push_back(1.2); list.push_back(0.5); list.push_back(3.14); QList list = QList::fromStdList(stdlist); //! [25] //! [26] QList list; list << 1.2 << 0.5 << 3.14; std::list stdlist = list.toStdList(); //! [26] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qlocale.cpp ================================================ //! [0] egyptian = QLocale(QLocale.Arabic, QLocale.Egypt) s1 = egyptian.toString(1.571429E+07, 'e') s2 = egyptian.toString(10) (d, ok) = egyptian.toDouble(s1) (i, ok) = egyptian.toInt(s2) //! [0] //! [1] QLocale.setDefault(QLocale(QLocale.Hebrew, QLocale.Israel)) hebrew = QLocale() # Constructs a default QLocale s1 = hebrew.toString(15714.3, 'e') QLocale.setDefault(QLocale(QLocale.C)) c = QLocale() (d, ok) = c.toDouble("1234,56") # ok == false (d, ok) = c.toDouble("1234.56") # ok == true, d == 1234.56 QLocale.setDefault(QLocale(QLocale.German)) german = QLocale() (d, ok) = german.toDouble("1234,56") # ok == true, d == 1234.56 (d, ok) = german.toDouble("1234.56") # ok == true, d == 1234.56 QLocale.setDefault(QLocale(QLocale.English, QLocale.UnitedStates)) english = QLocale() string = '%s %s %10x' % (12345, english.toString(12345), 12345) # string == "12345 12,345 3039" //! [1] //! [2] korean = QLocale("ko") swiss = QLocale("de_CH") //! [2] //! [3] c = QLocale(QLocale.C) (d, ok) = c.toDouble( "1234.56" ) # ok == true, d == 1234.56 (d, ok) = c.toDouble( "1,234.56" ) # ok == true, d == 1234.56 (d, ok) = c.toDouble( "1234,56" ) # ok == false german = QLocale(QLocale.German) (d, ok) = german.toDouble( "1234,56" ) # ok == true, d == 1234.56 (d, ok) = german.toDouble( "1.234,56" ) # ok == true, d == 1234.56 (d, ok) = german.toDouble( "1234.56" ) # ok == false (d, ok) = german.toDouble( "1.234" ) # ok == true, d == 1234.0 //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qmap.cpp ================================================ //! [0] QMap map; //! [0] //! [1] map["one"] = 1; map["three"] = 3; map["seven"] = 7; //! [1] //! [2] map.insert("twelve", 12); //! [2] //! [3] int num1 = map["thirteen"]; int num2 = map.value("thirteen"); //! [3] //! [4] int timeout = 30; if (map.contains("TIMEOUT")) timeout = map.value("TIMEOUT"); //! [4] //! [5] int timeout = map.value("TIMEOUT", 30); //! [5] //! [6] // WRONG QMap map; ... for (int i = 0; i < 1000; ++i) { if (map[i] == okButton) cout << "Found button at index " << i << endl; } //! [6] //! [7] QMapIterator i(map); while (i.hasNext()) { i.next(); cout << i.key() << ": " << i.value() << endl; } //! [7] //! [8] QMap::const_iterator i = map.constBegin(); while (i != map.constEnd()) { cout << i.key() << ": " << i.value() << endl; ++i; } //! [8] //! [9] map.insert("plenty", 100); map.insert("plenty", 2000); // map.value("plenty") == 2000 //! [9] //! [10] QList values = map.values("plenty"); for (int i = 0; i < values.size(); ++i) cout << values.at(i) << endl; //! [10] //! [11] QMap::iterator i = map.find("plenty"); while (i != map.end() && i.key() == "plenty") { cout << i.value() << endl; ++i; } //! [11] //! [12] QMap map; ... foreach (int value, map) cout << value << endl; //! [12] //! [13] #ifndef EMPLOYEE_H #define EMPLOYEE_H class Employee { public: Employee() {} Employee(const QString &name, const QDate &dateOfBirth); ... private: QString myName; QDate myDateOfBirth; }; inline bool operator<(const Employee &e1, const Employee &e2) { if (e1.name() != e2.name()) return e1.name() < e2.name(); return e1.dateOfBirth() < e2.dateOfBirth(); } #endif // EMPLOYEE_H //! [13] //! [14] QMap map; ... QMap::const_iterator i = map.find("HDR"); while (i != map.end() && i.key() == "HDR") { cout << i.value() << endl; ++i; } //! [14] //! [15] QMap map; map.insert(1, "one"); map.insert(5, "five"); map.insert(10, "ten"); map.lowerBound(0); // returns iterator to (1, "one") map.lowerBound(1); // returns iterator to (1, "one") map.lowerBound(2); // returns iterator to (5, "five") map.lowerBound(10); // returns iterator to (10, "ten") map.lowerBound(999); // returns end() //! [15] //! [16] QMap map; ... QMap::const_iterator i = map.lowerBound("HDR"); QMap::const_iterator upperBound = map.upperBound("HDR"); while (i != upperBound) { cout << i.value() << endl; ++i; } //! [16] //! [17] QMap map; map.insert(1, "one"); map.insert(5, "five"); map.insert(10, "ten"); map.upperBound(0); // returns iterator to (1, "one") map.upperBound(1); // returns iterator to (5, "five") map.upperBound(2); // returns iterator to (5, "five") map.upperBound(10); // returns end() map.upperBound(999); // returns end() //! [17] //! [18] QMap map; map.insert("January", 1); map.insert("February", 2); ... map.insert("December", 12); QMap::iterator i; for (i = map.begin(); i != map.end(); ++i) cout << i.key() << ": " << i.value() << endl; //! [18] //! [19] QMap::iterator i; for (i = map.begin(); i != map.end(); ++i) i.value() += 2; //! [19] //! [20] QMap::iterator i = map.begin(); while (i != map.end()) { if (i.key().startsWith("_")) i = map.erase(i); else ++i; } //! [20] //! [21] QMap::iterator i = map.begin(); while (i != map.end()) { QMap::iterator prev = i; ++i; if (prev.key().startsWith("_")) map.erase(prev); } //! [21] //! [22] // WRONG while (i != map.end()) { if (i.key().startsWith("_")) map.erase(i); ++i; } //! [22] //! [23] if (i.key() == "Hello") i.value() = "Bonjour"; //! [23] //! [24] QMap map; map.insert("January", 1); map.insert("February", 2); ... map.insert("December", 12); QMap::const_iterator i; for (i = map.constBegin(); i != map.constEnd(); ++i) cout << i.key() << ": " << i.value() << endl; //! [24] //! [25] QMultiMap map1, map2, map3; map1.insert("plenty", 100); map1.insert("plenty", 2000); // map1.size() == 2 map2.insert("plenty", 5000); // map2.size() == 1 map3 = map1 + map2; // map3.size() == 3 //! [25] //! [26] QList values = map.values("plenty"); for (int i = 0; i < values.size(); ++i) cout << values.at(i) << endl; //! [26] //! [27] QMultiMap::iterator i = map.find("plenty"); while (i != map.end() && i.key() == "plenty") { cout << i.value() << endl; ++i; } //! [27] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qpoint.cpp ================================================ //! [0] p = QPoint() p.setX(p.x() + 1) p += QPoint(1, 0) //! [0] //! [1] p = QPoint(1, 2) #p.rx()--; // p becomes (0, 2) //! [1] //! [2] p = QPoint(1, 2) #p.ry()++; // p becomes (1, 3) //! [2] //! [3] p = QPoint( 3, 7) q = QPoint(-1, 4) p += q # p becomes (2, 11) //! [3] //! [4] p = QPoint( 3, 7) q = QPoint(-1, 4) p -= q # p becomes (4, 3) //! [4] //! [5] p = QPoint(-1, 4) p *= 2.5 # p becomes (-3, 10) //! [5] //! [6] p = QPoint(-3, 10) p /= 2.5 # p becomes (-1, 4) //! [6] //! [7] class MyWidget(QWidget): self.oldPosition = QPointer() # event : QMouseEvent def mouseMoveEvent(QMouseEvent event): point = event.pos() - self.oldPosition if (point.manhattanLength() > 3): # the mouse has moved more than 3 pixels since the oldPosition pass //! [7] //! [8] trueLength = sqrt(pow(x(), 2) + pow(y(), 2)) //! [8] //! [9] p = QPointF() p.setX(p.x() + 1.0) p += QPointF(1.0, 0.0) #p.rx()++; //! [9] //! [10] p = QPointF(1.1, 2.5) #p.rx()--; // p becomes (0.1, 2.5) //! [10] //! [11] p = QPointF(1.1, 2.5) #p.ry()++; // p becomes (1.1, 3.5) //! [11] //! [12] p = QPointF( 3.1, 7.1) q = QPointF(-1.0, 4.1) p += q # p becomes (2.1, 11.2) //! [12] //! [13] p = QPointF( 3.1, 7.1) q = QPointF(-1.0, 4.1) p -= q # p becomes (4.1, 3.0) //! [13] //! [14] p = QPointF(-1.1, 4.1) p *= 2.5 # p becomes (-2.75, 10.25) //! [14] //! [15] p = QPointF(-2.75, 10.25) p /= 2.5 # p becomes (-1.1, 4.1) //! [15] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qqueue.cpp ================================================ //! [0] QQueue queue; queue.enqueue(1); queue.enqueue(2); queue.enqueue(3); while (!queue.isEmpty()) cout << queue.dequeue() << endl; //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qrect.cpp ================================================ //! [0] r1 = QRect(100, 200, 11, 16) r2 = QRect(QPoint(100, 200), QSize(11, 16)) //! [0] //! [1] r1 = QRectF(100, 200, 11, 16) r2 = QRectF(QPoint(100, 200), QSize(11, 16)) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qregexp.cpp ================================================ //! [0] rx = QRegExp("(\\d+)") txt = "Offsets: 12 14 99 231 7" lst = [] pos = rx.indexIn(txt, 0) while pos != -1: lst.append(rx.cap(1)) pos += rx.matchedLength() pos = rx.indexIn(txt, pos) # lst: ["12", "14", "99", "231", "7"] //! [0] //! [1] rx = QRegExp("*.txt") rx.setPatternSyntax(QRegExp.Wildcard) rx.exactMatch("README.txt") # returns True rx.exactMatch("welcome.txt.bak") # returns False //! [1] //! [2] rx = QRegExp("ro+m") rx.setMinimal(True) //! [2] //! [3] mark = QRegExp("\\b" # word boundary "[Mm]ark" # the word we want to match ) //! [3] //! [4] rx = QRegExp("^\\d\\d?$") # match integers 0 to 99 rx.indexIn("123") # returns -1 (no match) rx.indexIn("-6") # returns -1 (no match) rx.indexIn("6") # returns 0 (matched as position 0) //! [4] //! [5] rx = QRegExp("^\\S+$") # match strings without whitespace rx.indexIn("Hello world") # returns -1 (no match) rx.indexIn("This_is-OK") # returns 0 (matched at position 0) //! [5] //! [6] rx = QRegExp("\\b(mail|letter|correspondence)\\b") rx.indexIn("I sent you an email") # returns -1 (no match) rx.indexIn("Please write the letter") # returns 17 //! [6] //! [7] captured = rx.cap(1) # captured == "letter" //! [7] //! [8] rx = QRegExp("&(?!amp;)") # match ampersands but not & line1 = QString("This & that") line1.replace(rx, "&") # line1 == "This & that" line2 = QString("His & hers & theirs") line2.replace(rx, "&") # line2 == "His & hers & theirs" //! [8] //! [9] txt = QString("One Eric another Eirik, and an Ericsson. How many Eiriks, Eric?") rx = QRegExp("\\b(Eric|Eirik)\\b") # match Eric or Eirik pos = 0 # where we are in the string count = 0 # how many Eric and Eirik's we've counted while pos >= 0: pos = rx.indexIn(txt, pos) if pos >= 0: pos += 1 # move along in str count += 1 # count our Eric or Eirik //! [9] //! [10] txt = "Nokia Corporation and/or its subsidiary(-ies)\tqtsoftware.com\tNorway" rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$"); if rx.indexIn(txt) != -1: company = rx.cap(1) web = rx.cap(2) country = rx.cap(3) //! [10] //! [11] field = txt.split("\t") //! [11] //! [12] rx = QRegExp("*.html") rx.setPatternSyntax(QRegExp.Wildcard) rx.exactMatch("index.html") # returns True rx.exactMatch("default.htm") # returns False rx.exactMatch("readme.txt") # returns False //! [12] //! [13] txt = QString("offsets: 1.23 .50 71.00 6.00") rx = QRegExp("\\d*\\.\\d+") # primitive floating point matching count = 0 pos = rx.indexIn(txt, 0) while pos != -1: count += 1 pos += rx.matchedLength() pos = rx.indexIn(txt, pos) # pos will be 9, 14, 18 and finally 24; count will end up as 4 //! [13] //! [14] rx = QRegExp("(\\d+)(\\s*)(cm|inch(es)?)") pos = rx.indexIn("Length: 36 inches") lst = rx.capturedTexts() # lst is now ("36 inches", "36", " ", "inches", "es") //! [14] //! [15] rx = QRegExp("(\\d+)(?:\\s*)(cm|inch(?:es)?)") pos = rx.indexIn("Length: 36 inches") lst = rx.capturedTexts() # lst is now ("36 inches", "36", "inches") //! [15] //! [16] for a in rx.capturedTexts(): myProcessing(a) //! [16] //! [17] rxlen = QRegExp("(\\d+)(?:\\s*)(cm|inch)") pos = rxlen.indexIn("Length: 189cm") if pos > -1: value = rxlen.cap(1) # "189" unit = rxlen.cap(2) # "cm" //! [17] //! [18] rx = QRegExp("/([a-z]+)/([a-z]+)") rx.indexIn("Output /dev/null") # returns 7 (position of /dev/null) rx.pos(0) # returns 7 (position of /dev/null) rx.pos(1) # returns 8 (position of dev) rx.pos(2) # returns 12 (position of null) //! [18] //! [19] s1 = QRegExp.escape("bingo") # s1 == "bingo" s2 = QRegExp.escape("f(x)") # s2 == "f\\(x\\)" //! [19] //! [20] rx = QRegExp("(" + QRegExp.escape(name) + "|" + QRegExp.escape(alias) + ")") //! [20] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qsize.cpp ================================================ //! [0] t1 = QSize(10, 12) t1.scale(60, 60, Qt.IgnoreAspectRatio) # t1 is (60, 60) t2 = QSize(10, 12) t2.scale(60, 60, Qt.KeepAspectRatio) # t2 is (50, 60) t3 = QSize(10, 12) t3.scale(60, 60, Qt.KeepAspectRatioByExpanding) # t3 is (60, 72) //! [0] //! [1] size = QSize(100, 10) size.rwidth() += 20 #size becomes (120,10) //! [1] //! [2] size = QSize(100, 10) size.rheight() += 5 # size becomes (100,15) //! [2] //! [3] s = QSize( 3, 7) r = QSize(-1, 4) s += r # s becomes (2,11) //! [3] //! [4] s = QSize( 3, 7) r = QSize(-1, 4) s -= r # s becomes (4,3) //! [4] //! [5] t1 = QSizeF(10, 12) t1.scale(60, 60, Qt.IgnoreAspectRatio) # t1 is (60, 60) t2 = QSizeF(10, 12) t2.scale(60, 60, Qt.KeepAspectRatio) # t2 is (50, 60) t3 = QSizeF(10, 12) t3.scale(60, 60, Qt.KeepAspectRatioByExpanding) # t3 is (60, 72) //! [5] //! [6] size = QSizeF(100.3, 10) size.rwidth() += 20.5 # size becomes (120.8,10) //! [6] //! [7] size = QSizeF(100, 10.2) size.rheight() += 5.5 # size becomes (100,15.7) //! [7] //! [8] s = QSizeF( 3, 7) r = QSizeF(-1, 4) s += r # s becomes (2,11) //! [8] //! [9] s = QSizeF( 3, 7) r = QSizeF(-1, 4) s -= r # s becomes (4,3) //! [9] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qstring.cpp ================================================ //! [0] DEFINES += QT_NO_CAST_FROM_ASCII \ QT_NO_CAST_TO_ASCII //! [0] //! [1] url = QLatin1String("http://www.unicode.org/") //! [1] //! [2] d = 12.34; str = QString("delta: %1").arg(d, 0, 'E', 3) # str == "delta: 1.234E+01" //! [2] //! [3] if str == "auto" || str == "extern" || str == "static" || str == "register": ... //! [3] //! [4] if str == QString("auto") || str == QString("extern") || str == QString("static") || str == QString("register"): ... //! [4] //! [5] if str == QLatin1String("auto") || str == QLatin1String("extern") || str == QLatin1String("static") || str == QLatin1String("register"): ... //! [5] //! [6] label = QLabel(QLatin1String("MOD"), self) //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qtimeline.cpp ================================================ //! [0] ... progressBar = QProgressBar(self) progressBar.setRange(0, 100) # Construct a 1-second timeline with a frame range of 0 - 100 timeLine = QTimeLine(1000, self) timeLine.setFrameRange(0, 100) timeLine.frameChanged[int].connect(progressBar.setValue) # Clicking the push button will start the progress bar animation pushButton = QPushButton(QObject.tr("Start animation"), self) pushButton.clicked.connect(timeLine.start) ... //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qvector.cpp ================================================ //! [0] QVector integerVector; QVector stringVector; //! [0] //! [1] QVector vector(200); //! [1] //! [2] QVector vector(200, "Pass"); //! [2] //! [3] if (vector[0] == "Liz") vector[0] = "Elizabeth"; //! [3] //! [4] for (int i = 0; i < vector.size(); ++i) { if (vector.at(i) == "Alfonso") cout << "Found Alfonso at position " << i << endl; } //! [4] //! [5] int i = vector.indexOf("Harumi"); if (i != -1) cout << "First occurrence of Harumi is at position " << i << endl; //! [5] //! [6] QVector vector(10); int *data = vector.data(); for (int i = 0; i < 10; ++i) data[i] = 2 * i; //! [6] //! [7] QVector vector(0); vector.append("one"); vector.append("two"); vector.append("three"); // vector: ["one", "two", "three"] //! [7] //! [8] QVector vector; vector.prepend("one"); vector.prepend("two"); vector.prepend("three"); // vector: ["three", "two", "one"] //! [8] //! [9] QVector vector; vector << "alpha" << "beta" << "delta"; vector.insert(2, "gamma"); // vector: ["alpha", "beta", "gamma", "delta"] //! [9] //! [10] QVector vector; vector << 2.718 << 1.442 << 0.4342; vector.insert(1, 3, 9.9); // vector: [2.718, 9.9, 9.9, 9.9, 1.442, 0.4342] //! [10] //! [11] QVector vector(3); vector.fill("Yes"); // vector: ["Yes", "Yes", "Yes"] vector.fill("oh", 5); // vector: ["oh", "oh", "oh", "oh", "oh"] //! [11] //! [12] QVector vector; vector << "A" << "B" << "C" << "B" << "A"; vector.indexOf("B"); // returns 1 vector.indexOf("B", 1); // returns 1 vector.indexOf("B", 2); // returns 3 vector.indexOf("X"); // returns -1 //! [12] //! [13] QList vector; vector << "A" << "B" << "C" << "B" << "A"; vector.lastIndexOf("B"); // returns 3 vector.lastIndexOf("B", 3); // returns 3 vector.lastIndexOf("B", 2); // returns 1 vector.lastIndexOf("X"); // returns -1 //! [13] //! [14] QVector vect; vect << "red" << "green" << "blue" << "black"; QList list = vect.toList(); // list: ["red", "green", "blue", "black"] //! [14] //! [15] QStringList list; list << "Sven" << "Kim" << "Ola"; QVector vect = QVector::fromList(list); // vect: ["Sven", "Kim", "Ola"] //! [15] //! [16] std::vector stdvector; vector.push_back(1.2); vector.push_back(0.5); vector.push_back(3.14); QVector vector = QVector::fromStdVector(stdvector); //! [16] //! [17] QVector vector; vector << 1.2 << 0.5 << 3.14; std::vector stdvector = vector.toStdVector(); //! [17] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_corelib_xml_qxmlstream.cpp ================================================ //! [0] xml = QXmlStreamReader() ... while not xml.atEnd(): xml.readNext(); ... # do processing if xml.hasError(): ... # do error handling //! [0] //! [1] writeStartElement(qualifiedName) writeCharacters(text) writeEndElement() //! [1] //! [2] writeStartElement(namespaceUri, name) writeCharacters(text) writeEndElement() //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_accessible_qaccessible.cpp ================================================ //! [0] child = QAccessibleInterface() targetChild = object.navigate(Accessible.Child, 1, child) if child: # ... del child //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_dialogs_qabstractprintdialog.cpp ================================================ //! [0] printDialog = QPrintDialog(printer, parent) if printDialog.exec_() == QDialog.Accepted: # print ... //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp ================================================ //! [0] fileName = QFileDialog.getOpenFileName(self, tr("Open Image"), "/home/jana", tr("Image Files (*.png *.jpg *.bmp)")) //! [0] //! [1] "Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)" //! [1] //! [2] dialog = QFileDialog(self) dialog.setFileMode(QFileDialog.AnyFile) //! [2] //! [3] dialog.setNameFilter(tr("Images (*.png *.xpm *.jpg)")) //! [3] //! [4] dialog.setViewMode(QFileDialog.Detail) //! [4] //! [5] if dialog.exec_(): fileNames = dialog.selectedFiles() //! [5] //! [6] dialog.setNameFilter("All C++ files (*.cpp *.cc *.C *.cxx *.c++)") dialog.setNameFilter("*.cpp *.cc *.C *.cxx *.c++") //! [6] //! [7] filters = QStringList() filters << "Image files (*.png *.xpm *.jpg)" << "Text files (*.txt)" << "Any files (*)" dialog = QFileDialog(this) dialog.setNameFilters(filters) dialog.exec_() //! [7] //! [8] fileName = QFileDialog.getOpenFileName(self, tr("Open File"), "/home", tr("Images (*.png *.xpm *.jpg)")) //! [8] //! [9] files = QFileDialog.getOpenFileNames(self, "Select one or more files to open", "/home", "Images (*.png *.xpm *.jpg)") //! [9] //! [10] for it in list: myProcessing(it) it++ //! [10] //! [11] fileName = QFileDialog.getSaveFileName(self, tr("Save F:xile"), "/home/jana/untitled.png", tr("Images (*.png *.xpm *.jpg)")) //! [11] //! [12] dir = QFileDialog.getExistingDirectory(self, tr("Open Directory"), "/home", QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks) //! [12] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_dialogs_qfontdialog.cpp ================================================ //! [0] (ok, font) = QFontDialog.getFont(QFont("Helvetica [Cronyx]", 10), self) if ok: # the user clicked OK and font is set to the font the user selected else: # the user canceled the dialog; font is set to the initial # value, in this case Helvetica [Cronyx], 10 //! [0] //! [1] myWidget.setFont(QFontDialog.getFont(0, myWidget.font())) //! [1] //! [2] (ok, font) = QFontDialog.getFont(QFont("Times", 12), self) if ok: # font is set to the font the user selected else: # the user canceled the dialog; font is set to the initial # value, in this case Times, 12. //! [2] //! [3] myWidget.setFont(QFontDialog.getFont(0, myWidget.font())) //! [3] //! [4] (ok, font) = QFontDialog.getFont(self) if ok: # font is set to the font the user selected else: # the user canceled the dialog; font is set to the default # application font, QApplication.font() //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp ================================================ //! [0] ret = QMessageBox.warning(self, self.tr("My Application"), self.tr("The document has been modified.\n" + \ "Do you want to save your changes?"), QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel, QMessageBox.Save) //! [0] //! [1] msgBox = QMessageBox() msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No) result = msgBox.exec_() if result == QMessageBox.Yes: # yes was clicked elif result == QMessageBox.No: # no was clicked else: # should never be reached //! [1] //! [2] msgBox = QMessageBox() connectButton = msgBox.addButton(self.tr("Connect"), QMessageBox.ActionRole) abortButton = msgBox.addButton(QMessageBox.Abort) msgBox.exec_() if msgBox.clickedButton() == connectButton: # connect elif msgBox.clickedButton() == abortButton: # abort } //! [2] //! [3] messageBox = QMessageBox(self) disconnectButton = messageBox.addButton(self.tr("Disconnect"), QMessageBox.ActionRole) ... messageBox.exec_() if messageBox.clickedButton() == disconnectButton: ... //! [3] //! [4] #include #include int main(int argc, char *argv[]) { # Not Supported by PySide QT_REQUIRE_VERSION(argc, argv, "4.0.2") QApplication app(argc, argv); ... return app.exec(); } //! [4] //! [5] msgBox = QMessageBox() msgBox.setText("The document has been modified.") msgBox.exec_() //! [5] //! [6] msgBox = QMessageBox() msgBox.setText("The document has been modified.") msgBox.setInformativeText("Do you want to save your changes?") msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel) msgBox.setDefaultButton(QMessageBox.Save) ret = msgBox.exec_() //! [6] //! [7] if ret == QMessageBox.Save: # Save was clicked elif ret == QMessageBox.Discard: # Don't save was clicked elif ret == QMessageBox.Cancel: # cancel was clicked else: # should never be reached //! [7] //! [9] msgBox = QMessageBox(self) msgBox.setText(tr("The document has been modified.\n" + \ "Do you want to save your changes?")) msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel) msgBox.setDefaultButton(QMessageBox.Save) //! [9] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_dialogs_qwizard.cpp ================================================ //! [0] def nextId(self): id = self.currentId() if id == Page_Intro: if field("intro.evaluate").toBool(): return Page_Evaluate else: return Page_Register elif id == Page_Evaluate: return Page_Conclusion elif id == Page_Register: if field("register.upgradeKey").toString().isEmpty(): return Page_Details else: return Page_Conclusion elif id == Page_Details: return Page_Conclusion else: return -1 //! [0] //! [1] class MyWizard(QWizard): def __init__(self, parent): QWizard.__ini__(self, parent) ... layout = [QWizard.Stretch, QWizard.BackButton, QWizard.CancelButton, QWizard.NextButton, QWizard.FinishButton] setButtonLayout(layout); ... //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_effects_qgraphicseffect.cpp ================================================ //! [0] def draw(self, painter): # Fully opaque draw directly without going through a pixmap. if qFuzzyCompare(self.opacity, 1): drawSource(painter) return # ... //! [0] //! [1] def draw(self, painter): # ... offset = QPoint() if self.sourceIsPixmap(): # No point in drawing in device coordinates (pixmap will be scaled anyways). pixmap = sourcePixmap(Qt.LogicalCoordinates, offset) ... painter.drawPixmap(offset, pixmap) else: # Draw pixmap in device coordinates to avoid pixmap scaling pixmap = sourcePixmap(Qt.DeviceCoordinates, offset) painter.setWorldTransform(QTransform()) # ... painter.drawPixmap(offset, pixmap) # ... //! [1] //! [2] # ... alphaGradient = QLinearGradient(rect.topLeft(), rect.bottomLeft()) alphaGradient.setColorAt(0.0, Qt.transparent) alphaGradient.setColorAt(0.5, Qt.black) alphaGradient.setColorAt(1.0, Qt.transparent) effect = QGraphicsOpacityEffect() effect.setOpacityMask(alphaGradient) # ... //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_graphicsview_qgraphicsgridlayout.cpp ================================================ //! [0] scene = QGraphicsScene() textEdit = scene.addWidget(QTextEdit()) pushButton = scene.addWidget(QPushButton()) layout = QGraphicsGridLayout() layout.addItem(textEdit, 0, 0) layout.addItem(pushButton, 0, 1) form = QGraphicsWidget() form.setLayout(layout) scene.addItem(form) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_graphicsview_qgraphicsitem.cpp ================================================ //! [0] class SimpleItem(QGraphicsItem): def boundingRect(self): penWidth = 1.0 return QRectF(-10 - penWidth / 2, -10 - penWidth / 2, 20 + penWidth, 20 + penWidth) def paint(self, painter, option, widget): painter.drawRoundedRect(-10, -10, 20, 20, 5, 5) //! [0] //! [1] class CustomItem(QGraphicsItem): ... self.Type = QGraphicsItem.UserType + 1 def type(self): # Enable the use of qgraphicsitem_cast with this item. return self.Type ... //! [1] //! [2] item.setCursor(Qt.IBeamCursor) //! [2] //! [3] item.setCursor(Qt.IBeamCursor) //! [3] //! [4] rect = QGraphicsRectItem() rect.setPos(100, 100) rect.sceneTransform().map(QPointF(0, 0)) # returns QPointF(100, 100) rect.sceneTransform().inverted().map(QPointF(100, 100)) # returns QPointF(0, 0); //! [4] //! [5] rect = QGraphicsRectItem() rect.setPos(100, 100) rect.deviceTransform(view.viewportTransform()).map(QPointF(0, 0)) # returns the item's (0, 0) point in view's viewport coordinates rect.deviceTransform(view.viewportTransform()).inverted().map(QPointF(100, 100)) # returns view's viewport's (100, 100) coordinate in item coordinates //! [5] //! [6] # Rotate an item 45 degrees around (0, 0) item.rotate(45) # Rotate an item 45 degrees around (x, y) item.setTransform(QTransform().translate(x, y).rotate(45).translate(-x, -y)) //! [6] //! [7] # Scale an item by 3x2 from its origin item.scale(3, 2) # Scale an item by 3x2 from (x, y) item.setTransform(QTransform().translate(x, y).scale(3, 2).translate(-x, -y)) //! [7] //! [8] def boundingRect(self): penWidth = 1.0 return QRectF(-radius - penWidth / 2, -radius - penWidth / 2, diameter + penWidth, diameter + penWidth) //! [8] //! [9] def shape(self): path = QPainterPath() path.addEllipse(boundingRect()) return path //! [9] //! [10] def paint(self, painter, option, widget): painter.drawRoundedRect(-10, -10, 20, 20, 5, 5) //! [10] //! [11] ObjectName = 0; item = scene.itemAt(100, 50) if len(item.data(ObjectName)) == 0: if isinstance(ButtonItem, item): item.setData(ObjectName, "Button") //! [11] //! [12] scene = QGraphicsScene() ellipse = scene.addEllipse(QRectF(-10, -10, 20, 20)) line = scene.addLine(QLineF(-10, -10, 20, 20)) line.installSceneEventFilter(ellipse) # line's events are filtered by ellipse's sceneEventFilter() function. ellipse.installSceneEventFilter(line) # ellipse's events are filtered by line's sceneEventFilter() function. //! [12] //! [13] def contextMenuEvent(self, event): menu = QMenu() removeAction = menu.addAction("Remove") markAction = menu.addAction("Mark") selectedAction = menu.exec(event.screenPos()) // ... //! [13] //! [14] def __init__(self): self.setAcceptDrops(true) ... def dragEnterEvent(self, event): event.setAccepted(event.mimeData().hasFormat("text/plain")) //! [14] //! [15] def itemChange(self, change, value): if change == ItemPositionChange && scene(): # value is the new position. rect = scene().sceneRect() if !rect.contains(value): # Keep the item inside the scene rect. value.setX(qMin(rect.right(), qMax(value.x(), rect.left()))) value.setY(qMin(rect.bottom(), qMax(value.y(), rect.top()))) return value return QGraphicsItem.itemChange(self, change, value) //! [15] //! [16] def setRadius(self, newRadius): if radius != newRadius: prepareGeometryChange() radius = newRadius //! [16] //! [17] # Group all selected items together group = scene.createItemGroup(scene.selecteditems()) # Destroy the group, and delete the group item scene.destroyItemGroup(group) //! [17] //! [QGraphicsItem type] class CustomItem(QGraphicsItem): ... self.Type = QGraphicsItem.UserType + 1 def type(self): # Enable the use of qgraphicsitem_cast with this item. return self.Type ... //! [QGraphicsItem type] //! [18] class QGraphicsPathItem (QAbstractGraphicsShapeItem): Type = 2 def type(self): return QGraphicsPathItem.Type # ... //! [18] //! [19] xform = item.deviceTransform(view.viewportTransform()) deviceRect = xform.mapRect(rect).toAlignedRect() view.viewport().scroll(dx, dy, deviceRect) //! [19] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_graphicsview_qgraphicslinearlayout.cpp ================================================ //! [0] scene = QGraphicsScene() textEdit = scene.addWidget(QTextEdit()) pushButton = scene.addWidget(QPushButton()) layout = QGraphicsLinearLayout() layout.addItem(textEdit) layout.addItem(pushButton) form = QGraphicsWidget() form.setLayout(layout) scene.addItem(form) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_graphicsview_qgraphicsproxywidget.cpp ================================================ //! [0] import sys QApplication app(sys.argv) tabWidget = QTabWidget() scene = QGraphicsScene() proxy = scene.addWidget(tabWidget) view = QGraphicsView(scene) view.show() return app.exec_() //! [0] //! [1] groupBox = QGroupBox("Contact Details") numberLabel = QLabel("Telephone number") numberEdit = QLineEdit() layout = QFormLayout() layout.addRow(numberLabel, numberEdit) groupBox.setLayout(layout) scene = QGraphicsScene() proxy = scene.addWidget(groupBox) view = QGraphicsView(scene) view.show() //! [1] //! [2] scene = QGraphicsScene() edit = QLineEdit() proxy = scene.addWidget(edit) edit.isVisible() // returns true proxy.isVisible() // also returns true edit.hide() edit.isVisible() // returns false proxy.isVisible() // also returns false //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_graphicsview_qgraphicsscene.cpp ================================================ //! [0] scene = QGraphicsScene() scene.addText("Hello, world!") view = QGraphicsView(&scene) view.show() //! [0] //! [1] scene = QGraphicsScene scene.addItem(... ... printer = QPrinter(QPrinter.HighResolution) printer.setPaperSize(QPrinter.A4) painter = QPainter(printer) scene.render(&painter) //! [1] //! [2] segmentSize = sceneRect().size() / math.pow(2, depth - 1) //! [2] //! [3] scene = QGraphicsScene() view = QGraphicsView(scene) view.show() # a blue background scene.setBackgroundBrush(Qt.blue) # a gradient background gradient = QRadialGradient(0, 0, 10) gradient.setSpread(QGradient.RepeatSpread) scene.setBackgroundBrush(gradient) //! [3] //! [4] scene = QGraphicsScene() view = QGraphicsView(scene) view.show() # a white semi-transparent foreground scene.setForegroundBrush(QColor(255, 255, 255, 127)) # a grid foreground scene.setForegroundBrush(QBrush(Qt.lightGray, Qt.CrossPattern)) //! [4] //! [5] class TileScene (QGraphicsScene): # ... def rectForTile(x, y): # Return the rectangle for the tile at position (x, y). return QRectF(x * self.tileWidth, y * self.tileHeight, self.tileWidth, self.tileHeight) def setTile(x, y, pixmap): # Sets or replaces the tile at position (x, y) with pixmap. if x >= 0 && x < self.numTilesH && y >= 0 && y < self.numTilesV: self.tiles[y][x] = pixmap invalidate(rectForTile(x, y), BackgroundLayer) def drawBackground(painter, exposed): # Draws all tiles that intersect the exposed area. for y in range(0, self.numTilesV: for x in range(0, self.numTilesH: rect = rectForTile(x, y) if exposed.intersects(rect): painter.drawPixmap(rect.topLeft(), tiles[y][x]) //! [5] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_graphicsview_qgraphicssceneevent.cpp ================================================ //! [0] setDropAction(proposedAction()) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_graphicsview_qgraphicsview.cpp ================================================ //! [0] scene = QGraphicsScene() scene.addText("Hello, world!") view = QGraphicsView(scene) view.show() //! [0] //! [1] scene = QGraphicsScene() scene.addRect(QRectF(-10, -10, 20, 20)) view = QGraphicsView(scene) view.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform) view.show() //! [1] //! [2] view = QGraphicsView() view.setBackgroundBrush(QImage(":/images/backgroundtile.png")) view.setCacheMode(QGraphicsView.CacheBackground) //! [2] //! [3] scene = QGraphicsScene() scene.addText("GraphicsView rotated clockwise") view = QGraphicsView(scene) view.rotate(90) # the text is rendered with a 90 degree clockwise rotation view.show() //! [3] //! [4] scene = QGraphicsScene() scene.addItem(... ... view = QGraphicsView(scene) view.show() ... printer = QPrinter(QPrinter.HighResolution) printer.setPageSize(QPrinter.A4) painter = QPainter(printer) # print, fitting the viewport contents into a full page view.render(painter) # print the upper half of the viewport into the lower. # half of the page. viewport = view.viewport()->rect() view.render(painter, QRectF(0, printer.height() / 2, printer.width(), printer.height() / 2), viewport.adjusted(0, 0, 0, -viewport.height() / 2)) //! [4] //! [5] def mousePressEvent(self, event): print "There are", items(event->pos()).size(), "items at position", mapToScene(event->pos()) //! [5] //! [6] def mousePressEvent(self, event): if (item = itemAt(event.pos()): print "You clicked on item", item else: print "You didn't click on an item." //! [6] //! [7] scene = QGraphicsScene() scene.addText("GraphicsView rotated clockwise") view = QGraphicsView(scene) view.rotate(90) # the text is rendered with a 90 degree clockwise rotation view.show() //! [7] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_graphicsview_qgraphicswidget.cpp ================================================ //! [0] class MyGroupBoxWidget (QStyleOptionGroupBox): # ... def initStyleOption(option): QGraphicsWidget.initStyleOption(self, option) if isinstance(option, QStyleOptionGroupBox): # Add group box specific state. box.flat = isFlat() # ... //! [0] //! [1] setTabOrder(a, b) # a to b setTabOrder(b, c) # a to b to c setTabOrder(c, d) # a to b to c to d //! [1] //! [2] # WRONG setTabOrder(c, d) # c to d setTabOrder(a, b) # a to b AND c to d setTabOrder(b, c) # a to b to c, but not c to d //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_image_qbitmap.cpp ================================================ //! [0] uchar arrow_bits[] = { 0x3f, 0x1f, 0x0f, 0x1f, 0x3b, 0x71, 0xe0, 0xc0 }; QBitmap bm(8, 8, arrow_bits, true); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_image_qicon.cpp ================================================ //! [0] button = QToolButton() button.setIcon(QIcon("open.xpm")) //! [0] //! [1] button.setIcon(QIcon()) //! [1] //! [2] def drawIcon(self, painter, pos): enabledStatus = QIcon.Normal if not isEnabled(): enabledStatus = QIcon::Disabled onOff = QIcon.On if not isOn(): onOff = QIcon.Off pixmap = self.icon.pixmap(QSize(22, 22), enabledStatus, onOff) painter.drawPixmap(pos, pixmap) //! [2] //! [3] undoicon = QIcon.fromTheme("edit-undo") //! [3] //! [4] undoicon = QIcon.fromTheme("edit-undo", QIcon(":/undo.png")) //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_image_qimage.cpp ================================================ //! [0] image = QImage(3, 3, QImage.Format_RGB32) value = qRgb(189, 149, 39) # 0xffbd9527 image.setPixel(1, 1, value) value = qRgb(122, 163, 39) # 0xff7aa327 image.setPixel(0, 1, value) image.setPixel(1, 0, value) value = qRgb(237, 187, 51) # 0xffedba31 image.setPixel(2, 1, value) //! [0] //! [1] image = QImage(3, 3, QImage.Format_Indexed8) value = qRgb(122, 163, 39) # 0xff7aa327 image.setColor(0, value) value = qRgb(237, 187, 51) # 0xffedba31 image.setColor(1, value) value = qRgb(189, 149, 39) # 0xffbd9527 image.setColor(2, value) image.setPixel(0, 1, 0) image.setPixel(1, 0, 0) image.setPixel(1, 1, 2) image.setPixel(2, 1, 1) //! [1] //! [2] start_xpm = ["16 15 8 1", "a c #cec6bd", .... //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_image_qimagereader.cpp ================================================ //! [0] reader = QImageReader() reader.setFormat("png") # same as reader.setFormat("PNG") //! [0] //! [1] reader = QImageReader("image.png") # reader.format() == "png" //! [1] //! [2] icon = QImage(64, 64, QImage.Format_RGB32) reader = QImageReader("icon_64x64.bmp") if reader.read(icon): # Display icon //! [2] //! [3] reader = QImageReader(":/image.png") if reader.supportsOption(QImageIOHandler.Size): print "Size:", str(reader.size()) //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_image_qimagewriter.cpp ================================================ //! [0] writer = QImageWriter() writer.setFormat("png") # same as writer.setFormat("PNG") //! [0] //! [1] image = QImage("some/image.jpeg") writer = QImageWriter("images/outimage.png", "png") writer.setText("Author", "John Smith") writer.write(image) //! [1] //! [2] writer = QImageWriter(fileName) if writer.supportsOption(QImageIOHandler.Description): writer.setText("Author", "John Smith") //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_image_qmovie.cpp ================================================ //! [0] label = QLabel() movie = QMovie("animations/fire.gif") label.setMovie(movie) movie.start() //! [0] //! [1] movie = QMovie("racecar.gif") movie.setSpeed(200) // 2x speed //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_image_qpixmap.cpp ================================================ //! [0] static const char * const start_xpm[]={ "16 15 8 1", "a c #cec6bd", .... //! [0] //! [1] myPixmap = QPixmap() myPixmap.setMask(myPixmap.createHeuristicMask()) //! [1] //! [2] pixmap = QPixmap("background.png") exposed = QRegion() pixmap.scroll(10, 10, pixmap.rect(), exposed) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_image_qpixmapcache.cpp ================================================ //! [0] pm = QPixmap() if not QPixmapCache.find("my_big_image", pm): pm.load("bigimage.png") QPixmapCache.insert("my_big_image", pm) painter.drawPixmap(0, 0, pm) //! [0] //! [1] pm = QPixmap() if not QPixmapCache.find("my_big_image", pm): pm.load("bigimage.png") QPixmapCache.insert("my_big_image", pm) painter.drawPixmap(0, 0, pm) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_image_qpixmapfilter.cpp ================================================ //! [0] myFilter = QPixmapColorFilter() myFilter.setColor(QColor(128, 0, 0)) myFilter.draw(painter, QPoint(0, 0), originalPixmap) //! [0] //! [1] myFilter = QPixmapConvolutionFilter() kernel = [ 0.0,-1.0, 0.0, -1.0, 5.0,-1.0, 0.0,-1.0, 0.0 ] myFilter.setConvolutionKernel(kernel, 3, 3) myFilter.sdraw(painter, QPoint(0, 0), originalPixmap) //! [1] //! [2] myFilter = QPixmapDropShadowFilter() myFilter.draw(painter, QPoint(0, 0), originalPixmap) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_itemviews_qabstractitemview.cpp ================================================ //! [0] def resizeEvent(self, event): horizontalScrollBar().setRange(0, realWidth - width()) ... //! [0] //! [1] setIndexWidget(index, QLineEdit()) ... setIndexWidget(index, QTextEdit()) //! [1] //! [2] m = view->selectionModel() view->setModel(model()) del m //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_itemviews_qdatawidgetmapper.cpp ================================================ //! [0] mapper = QDataWidgetMapper mapper.setModel(model) mapper.addMapping(mySpinBox, 0) mapper.addMapping(myLineEdit, 1) mapper.addMapping(myCountryChooser, 2) mapper.toFirst() //! [0] //! [1] mapper = QDataWidgetMapper() mapper.setModel(myModel) mapper.addMapping(nameLineEdit, 0) mapper.addMapping(ageSpinBox, 1) //! [1] //! [2] mapper = QDataWidgetMapper() connect(myTableView.selectionModel(), SIGNAL("currentRowChanged(QModelIndex,QModelIndex)"), mapper, SLOT(setCurrentModelIndex(QModelIndex))) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_itemviews_qitemeditorfactory.cpp ================================================ //! [0] Q_PROPERTY(QColor color READ color WRITE setColor USER true) //! [0] //! [1] QItemEditorCreator *itemCreator = new QItemEditorCreator("myProperty"); QItemEditorFactory *factory = new QItemEditorFactory; //! [1] //! [2] QItemEditorFactory *editorFactory = new QItemEditorFactory; QItemEditorCreatorBase *creator = new QStandardItemEditorCreator(); editorFactory->registerEditor(QVariant::DateType, creator); //! [2] //! [3] Q_PROPERTY(QColor color READ color WRITE setColor USER true) //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_itemviews_qitemselectionmodel.cpp ================================================ //! [0] selection = QItemSelection(topLeft, bottomRight) //! [0] //! [1] selection = QItemSelection() ... selection.select(topLeft, bottomRight) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_itemviews_qstandarditemmodel.cpp ================================================ //! [0] model = QStandardItemModel (4, 4) for row in range(4): for column in range(4): item = QStandardItem("row %d, column %d" % (row, column)) model.setItem(row, column, item) //! [0] //! [1] model = QStandardItemModel() parentItem = model.invisibleRootItem() for i in range(4): item = QStandardItem("item %d" % i) parentItem.appendRow(item) parentItem = item //! [1] //! [2] treeView = QTreeView(self) treeView.setModel(myStandardItemModel) treeView.clicked[QModelIndex].connect(self.clicked) //! [2] //! [3] def clicked(self, index): item = myStandardItemModel.itemFromIndex(index) # Do stuff with the item ... //! [3] //! [4] treeView.scrollTo(item.index()) //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_itemviews_qtablewidget.cpp ================================================ //! [0] setCellWidget(index, QLineEdit()) ... setCellWidget(index, QTextEdit()) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_itemviews_qtreewidget.cpp ================================================ //! [0] treeWidget = QTreeWidget() treeWidget.setColumnCount(1) items = [] for i in range(10): items.append(QTreeWidgetItem(None, QStringList(QString("item: %1").arg(i)))) treeWidget.insertTopLevelItems(None, items) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qaction.cpp ================================================ //! [0] app = QApplication(argv) app.setAttribute(Qt.AA_DontShowIconsInMenus) # Icons are *no longer shown* in menus // ... myAction = QAction() // ... myAction.setIcon(SomeIcon) myAction.setIconVisibleInMenu(True) # Icon *will* be shown in menus for *this* action. //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qapplication.cpp ================================================ //! [0] def main(): if Qt.Q_WS_X11 useGUI = getenv("DISPLAY") != 0 else: useGUI = True app = QApplication(sys.argv, useGUI) if useGUI: # start GUI version ... else: # start non-GUI version ... return app.exec_() //! [0] //! [1] QApplication.setStyle(QWindowsStyle()) //! [1] //! [2] def main(): QApplication.setColorSpec(QApplication.ManyColor) QApplication app(sys.argv) ... return app.exec_() //! [2] //! [3] class MyWidget (QWidget): # ... def sizeHint(self): return QSize(80, 25).expandedTo(QApplication.globalStrut()) //! [3] //! [4] def showAllHiddenTopLevelWidgets(): for widget in QApplication.topLevelWidgets(): if widget.isHidden(): widget.show() //! [4] //! [5] def updateAllWidgets(): for widget in QApplication.allWidgets() widget.update() //! [5] //! [6] if __name__ == '__main__': QApplication.setDesktopSettingsAware(False) app = QApplication(sys.argv) # ... return app.exec_() //! [6] //! [7] if (startPos - currentPos).manhattanLength() >= QApplication.startDragDistance(): startTheDrag() //! [7] //! [8] class MyApplication (QApplication): # ... def commitData(QSessionManager& manager) if manager.allowsInteraction(): ret = QMessageBox.warning( mainWindow, QObject.tr("My Application"), QObject.tr("Save changes to document?"), QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel) if ret == QMessageBox.Save: manager.release() if not saveDocument(): manager.cancel() elif ret == QMessageBox.Discard: pass else: manager.cancel() else: # we did not get permission to interact, then # do something reasonable instead pass //! [8] //! [9] appname -session id //! [9] //! [10] for command in mySession.restartCommand(): do_something(command) //! [10] //! [11] for command in mySession.discardCommand(): do_something(command) //! [11] //! [12] widget = qApp.widgetAt(x, y) if widget: widget = widget.window() //! [12] //! [13] widget = qApp.widgetAt(point) if widget: widget = widget.window() //! [13] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qapplication_x11.cpp ================================================ //! [0] QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) calculateHugeMandelbrot() # lunch time... QApplication.restoreOverrideCursor() //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qclipboard.cpp ================================================ //! [0] clipboard = QApplication.clipboard() originalText = clipboard.text() ... clipboard.setText(newText) //! [0] //! [1] data = QMimeData() data.setImageData(image) clipboard.setMimeData(data, mode) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qevent.cpp ================================================ //! [0] def wheelEvent(self, event): numDegrees = event.delta() / 8 numSteps = numDegrees / 15 if event->orientation() == Qt.Horizontal: scrollHorizontally(numSteps) else: scrollVertically(numSteps) event.accept() //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qformlayout.cpp ================================================ //! [0] formLayout = QFormLayout() formLayout.addRow(self.tr("&Name:"), nameLineEdit) formLayout.addRow(self.tr("&Email:"), emailLineEdit) formLayout.addRow(self.tr("&Age:"), ageSpinBox) setLayout(formLayout) //! [0] //! [1] nameLabel = QLabel(self.tr("&Name:")) nameLabel.setBuddy(nameLineEdit) emailLabel = QLabel(self.tr("&Name:")) emailLabel.setBuddy(emailLineEdit) ageLabel = QLabel(self.tr("&Name:")) ageLabel.setBuddy(ageSpinBox) gridLayout = QGridLayout() gridLayout.addWidget(nameLabel, 0, 0) gridLayout.addWidget(nameLineEdit, 0, 1) gridLayout.addWidget(emailLabel, 1, 0) gridLayout.addWidget(emailLineEdit, 1, 1) gridLayout.addWidget(ageLabel, 2, 0) gridLayout.addWidget(ageSpinBox, 2, 1) setLayout(gridLayout) //! [1] //! [2] formLayout.trowWrapPolicy(QFormLayout.DontWrapRows) formLayout.setFieldGrowthPolicy(QFormLayout.FieldsStayAtSizeHint) formLayout.setFormAlignment(Qt.AlignHCenter | Qt.AlignTop) formLayout.setLabelAlignment(Qt.AlignLeft) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qkeysequence.cpp ================================================ //! [0] QKeySequence(QKeySequence.Print) QKeySequence(tr("Ctrl+P")) QKeySequence(tr("Ctrl+p")) QKeySequence(Qt.CTRL + Qt.Key_P) //! [0] //! [1] QKeySequence(tr("Ctrl+X, Ctrl+C")) QKeySequence(Qt.CTRL + Qt.Key_X, Qt.CTRL + Qt.Key_C) //! [1] //! [2] file = QMenu(self) file.addAction(tr("&Open..."), self, SLOT("open()"), QKeySequence(tr("Ctrl+O", "File|Open"))) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qlayout.cpp ================================================ //! [0] def paintLayout(self, painter, item): layout = item.layout() if layout: for layout_item in layout: self.paintLayout(painter, layout_item) painter.drawRect(item.geometry()) def paintEvent(self, event): painter = QPainter(self) if self.layout(): self.paintLayout(painter, self.layout()) //! [0] //! [1] child = layout.takeAt(0) while child: ... del child //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qlayoutitem.cpp ================================================ //! [0] def heightForWidth(self, w): if cache_dirty or cached_width != w: h = calculateHeightForWidth(w) self.cached_hfw = h return h return cached_hfw //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qshortcut.cpp ================================================ //! [0] shortcut = QShortcut(QKeySequence(self.tr("Ctrl+O", "File|Open")), parent) //! [0] //! [1] setKey(0) # no signal emitted setKey(QKeySequence()) # no signal emitted setKey(0x3b1) # Greek letter alpha setKey(Qt.Key_D) # 'd', e.g. to delete setKey('q') # 'q', e.g. to quit setKey(Qt.CTRL + Qt.Key_P) # Ctrl+P, e.g. to print document setKey("Ctrl+P") # Ctrl+P, e.g. to print document //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qshortcutmap.cpp ================================================ //! [0] key = QKeySequence() //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qsound.cpp ================================================ //! [0] QSound.play("mysounds/bells.wav") //! [0] //! [1] bells = QSound("mysounds/bells.wav") bells.play() //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qwidget.cpp ================================================ //! [0] w.setWindowState(w.windowState() ^ Qt.WindowFullScreen) //! [0] //! [1] w.setWindowState(w.windowState() & ~Qt.WindowMinimized | Qt.WindowActive) //! [1] //! [2] width = widget.baseSize().width() + i * widget.sizeIncrement().width() height = widget.baseSize().height() + j * widget.sizeIncrement().height() //! [2] //! [3] aWidget.window().setWindowTitle("New Window Title") //! [3] //! [4] font = QFont("Helvetica", 12, QFont.Bold) widget.setFont(font) //! [4] //! [5] font = QFont() font.setBold(false) widget.setFont(font) //! [5] //! [6] widget.setCursor(Qt.IBeamCursor) //! [6] //! [7] pixmap = QPixmap(widget.size()) widget.render(&pixmap) //! [7] //! [8] painter = QPainter(self) ... painter.end() myWidget.render(self) //! [8] //! [9] widget.setTabOrder(a, b) # a to b widget.setTabOrder(b, c) # a to b to c widge.tsetTabOrder(c, d) # a to b to c to d //! [9] //! [10] # WRONG widget.setTabOrder(c, d) # c to d widget.setTabOrder(a, b) # a to b AND c to d widget.setTabOrder(b, c) # a to b to c, but not c to d //! [10] //! [11] class MyWidget(QWidget): self.settings = None def closeEvent(event): # event is a QCloseEvent self.settings = QSettings("MyCompany", "MyApp") self.settings.setValue("geometry", self.saveGeometry()) QWidget.closeEvent(self, event) //! [11] //! [12] settings = QSettings("MyCompany", "MyApp") myWidget.restoreGeometry(settings.value("myWidget/geometry").toByteArray()) //! [12] //! [13] widget.setUpdatesEnabled(False) widget.bigVisualChanges() widget.setUpdatesEnabled(True) //! [13] //! [14] ... extern void qt_x11_set_global_double_buffer(bool); qt_x11_set_global_double_buffer(false); ... //! [14] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_painting_qbrush.cpp ================================================ //! [0] painter = QPainter(self) painter.setBrush(Qt.cyan) painter.setPen(Qt.darkCyan) painter.drawRect(0, 0, 100,100) painter.setBrush(Qt.NoBrush) painter.setPen(Qt.darkGreen) painter.drawRect(40, 40, 100, 100) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_painting_qcolor.cpp ================================================ //! [0] # Specify semi-transparent red painter.setBrush(QColor(255, 0, 0, 127)) painter.drawRect(0, 0, self.width()/2, self.height()) # Specify semi-transparent blue painter.setBrush(QColor(0, 0, 255, 127)) painter.drawRect(0, 0, self.width(), self.height()/2) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_painting_qdrawutil.cpp ================================================ //! [0] frame = QFrame() frame.setFrameStyle(QFrame.HLine | QFrame.Sunken) //! [0] //! [1] frame = QFrame() frame.setFrameStyle(QFrame.Box | QFrame.Raised) //! [1] //! [2] frame = QFrame() frame.setFrameStyle( QFrame.Panel | QFrame.Sunken) //! [2] //! [3] frame = QFrame() frame.setFrameStyle(QFrame.WinPanel | QFrame.Raised) //! [3] //! [4] frame = QFrame() frame.setFrameStyle(QFrame.Box | QFrame.Plain) //! [4] //! [5] frame = QFrame() frame.setFrameStyle(QFrame.HLine | QFrame.Sunken) //! [5] //! [6] frame = QFrame() frame.setFrameStyle(QFrame.Box | QFrame.Raised) //! [6] //! [7] frame = QFrame() frame.setFrameStyle( QFrame.Panel | QFrame.Sunken) //! [7] //! [8] frame = QFrame() frame.setFrameStyle(QFrame.WinPanel | QFrame.Raised) //! [8] //! [9] frame = QFrame() frame.setFrameStyle(QFrame.Box | QFrame.Plain) //! [9] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_painting_qmatrix.cpp ================================================ //! [0] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy //! [0] //! [1] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy //! [1] //! [2] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy //! [2] //! [3] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_painting_qpainter.cpp ================================================ //! [0] def paintEvent(self, paintEvent): painter = QPainter(self) painter.setPen(Qt.blue) painter.setFont(QFont("Arial", 30)) painter.drawText(rect(), Qt.AlignCenter, "Qt") //! [0] //! [1] def paintEvent(self, paintEvent): p = QPainter() p.begin(self) p.drawLine(...) # drawing code p.end() //! [1] //! [2] self paintEvent(self, paintEvent): p = QPainter(self) p.drawLine(...) # drawing code //! [2] //! [3] painter.begin(0) # impossible - paint device cannot be 0 image = QPixmap(0, 0) painter.begin(&image) # impossible - image.isNull() == true painter.begin(myWidget) painter2.begin(myWidget) # impossible - only one painter at a time //! [3] //! [4] def rotate(self, angle): matrix = QMatrix() matrix.rotate(angle) setWorldMatrix(matrix, true) //! [4] //! [5] path = QPainterPath() path.moveTo(20, 80) path.lineTo(20, 30) path.cubicTo(80, 0, 50, 50, 80, 80) painter = QPainter(self) painter.drawPath(path) //! [5] //! [6] line = QLineF(10.0, 80.0, 90.0, 20.0) painter = QPainter(self) painter.drawLine(line) //! [6] //! [7] rectangle = QRectF(10.0, 20.0, 80.0, 60.0) painter = QPainter(self) painter.drawRect(rectangle) //! [7] //! [8] rectangle = QRectF(10.0, 20.0, 80.0, 60.0) painter = QPainter(self) painter.drawRoundedRect(rectangle, 20.0, 15.0) //! [8] //! [9] rectangle = QRectF(10.0, 20.0, 80.0, 60.0) painter = QPainter(self) painter.drawEllipse(rectangle) //! [9] //! [10] rectangle = QRectF(10.0, 20.0, 80.0, 60.0) startAngle = 30 * 16 spanAngle = 120 * 16 painter = QPainter(self) painter.drawArc(rectangle, startAngle, spanAngle) //! [10] //! [11] rectangle = QRectF(10.0, 20.0, 80.0, 60.0) startAngle = 30 * 16 spanAngle = 120 * 16 painter = QPainter(self) painter.drawPie(rectangle, startAngle, spanAngle) //! [11] //! [12] rectangle = QRectF(10.0, 20.0, 80.0, 60.0) startAngle = 30 * 16 spanAngle = 120 * 16 painter = QPainter(self) painter.drawChord(rect, startAngle, spanAngle) //! [12] //! [13] points = [ QPointF(10.0, 80.0), QPointF(20.0, 10.0), QPointF(80.0, 30.0), ] painter = QPainter(self) painter.drawPolyline(points, 3) //! [13] //! [14] points = [ QPointF(10.0, 80.0), QPointF(20.0, 10.0), QPointF(80.0, 30.0), QPointF(90.0, 70.0) ] painter = QPainter(self) painter.drawPolygon(points, 4) //! [14] //! [15] points = [ QPointF(10.0, 80.0), QPointF(20.0, 10.0), QPointF(80.0, 30.0), QPointF(90.0, 70.0) ] painter = QPainter(self) painter.drawConvexPolygon(points, 4) //! [15] //! [16] target = QRectF(10.0, 20.0, 80.0, 60.0) source = QRectF(0.0, 0.0, 70.0, 40.0) pixmap = QPixmap(":myPixmap.png") painter = QPainter(self) painter.drawPixmap(target, image, source) //! [16] //! [17] painter = QPainter(self) painter.drawText(rect, Qt.AlignCenter, tr("Qt by\nTrolltech")) //! [17] //! [18] picture = QPicture() point = QPointF(10.0, 20.0) picture.load("drawing.pic") painter = QPainter(self) painter.drawPicture(0, 0, picture) //! [18] //! [19] fillRect(rectangle, background()) //! [19] //! [20] target = QRectF(10.0, 20.0, 80.0, 60.0) source = QRectF(0.0, 0.0, 70.0, 40.0) image = QImage(":/images/myImage.png") painter = QPainter(self) painter.drawImage(target, image, source) //! [20] //! [21] painter = QPainter(self) painter.fillRect(0, 0, 128, 128, Qt.green) painter.beginNativePainting() glEnable(GL_SCISSOR_TEST) glScissor(0, 0, 64, 64) glClearColor(1, 0, 0, 1) glClear(GL_COLOR_BUFFER_BIT) glDisable(GL_SCISSOR_TEST) painter.endNativePainting() //! [21] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_painting_qpainterpath.cpp ================================================ //! [0] path = QPainterPath() path.addRect(20, 20, 60, 60) path.moveTo(0, 0) path.cubicTo(99, 0, 50, 50, 99, 99) path.cubicTo(0, 99, 50, 50, 0, 0) QPainter painter(self) painter.fillRect(0, 0, 100, 100, Qt.white) painter.setPen(QPen(QColor(79, 106, 25), 1, Qt.SolidLine, Qt.FlatCap, Qt.MiterJoin)) painter.setBrush(QColor(122, 163, 39)) painter.drawPath(path) //! [0] //! [1] myGradient = QLinearGradient() myPen = QPen() myPath = QPainterPath() myPath.cubicTo(c1, c2, endPoint) painter = QPainter(self) painter.setBrush(myGradient) painter.setPen(myPen) painter.drawPath(myPath) //! [1] //! [2] myGradient = QLinearGradient() myPen = QPen() startPoint = QPointF() center = QPointF() myPath = QPainterPath() myPath.moveTo(center) myPath.arcTo(boundingRect, startAngle, sweepLength) painter = QPainter(self) painter.setBrush(myGradient) painter.setPen(myPen) painter.drawPath(myPath) //! [2] //! [3] myGradient = QLinearGradient() myPen = QPen() myRectangle = QRectF() myPath = QPainterPath() myPath.addRect(myRectangle) painter = QPainter(self) painter.setBrush(myGradient) painter.setPen(myPen) painter.drawPath(myPath) //! [3] //! [4] myGradient = QLinearGradient() myPen = QPen() myPolygon = QPolygonF() myPath = QPainterPath() myPath.addPolygon(myPolygon) QPainter painter(self) painter.setBrush(myGradient) painter.setPen(myPen) painter.drawPath(myPath) //! [4] //! [5] myGradient = QLinearGradient() myPen = QPen() boundingRectangle = QRectF() myPath = QPainterPath() myPath.addEllipse(boundingRectangle) QPainter painter(self) painter.setBrush(myGradient) painter.setPen(myPen) painter.drawPath(myPath) //! [5] //! [6] myGradient = QLinearGradient() myPen = QPen() myFont = QFont() QPointF baseline(x, y) myPath = QPainterPath() myPath.addText(baseline, myFont, tr("Qt")) painter QPainter(self) painter.setBrush(myGradient) painter.setPen(myPen) painter.drawPath(myPath) //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_painting_qpen.cpp ================================================ //! [0] painter = QPainter(self) pen = QPen(Qt.green, 3, Qt.DashDotLine, Qt.RoundCap, Qt.RoundJoin) painter.setPen(pen) //! [0] //! [1] painter = QPainter(self) pen = QPen() # creates a default pen pen.setStyle(Qt.DashDotLine) pen.setWidth(3) pen.setBrush(Qt.green) pen.setCapStyle(Qt.RoundCap) pen.setJoinStyle(Qt.RoundJoin) painter.setPen(pen) //! [1] //! [2] pen = QPen() space = 4; dashes = [1, space, 3, space, 9, space, 27, space, 9, space] pen.setDashPattern(dashes) //! [2] //! [3] pen = QPen() space = 4; dashes = [1, space, 3, space, 9, space, 27, space, 9, space] pen.setDashPattern(dashes) //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_painting_qregion.cpp ================================================ //! [0] class MyWidget (QWidget): # ... def paintEvent(self): r1 = QRegion(QRect(100, 100, 200, 80), QRegion.Ellipse) # r1: elliptic region ) r2 = QRect(100, 120, 90, 30) # r2: rectangular region r3 = r1.intersected(r2) # r3: intersection painter = QPainter(self) painter.setClipRegion(r3) ... # paint clipped graphics //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_painting_qregion_unix.cpp ================================================ //! [0] r1 = QRegion(10, 10, 20, 20) r1.isNull() // false r1.isEmpty() // false r2 = QRegion(40, 40, 20, 20) r3 = QRegion() r3.isNull() // true r3.isEmpty() // true r3 = r1.intersected(r2) // r3: intersection of r1 and r2 r3.isNull() // false r3.isEmpty() // true r3 = r1.united(r2) // r3: union of r1 and r2 r3.isNull() // false r3.isEmpty() // false //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_painting_qtransform.cpp ================================================ //! [0] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy if is not affine: w' = m13*x + m23*y + m33 x' /= w' y' /= w' //! [0] //! [1] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy if is not affine: w' = m13*x + m23*y + m33 x' /= w' y' /= w' //! [1] //! [2] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy if is not affine: w' = m13*x + m23*y + m33 x' /= w' y' /= w' //! [2] //! [3] x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy if is not affine: w' = m13*x + m23*y + m33 x' /= w' y' /= w' //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_styles_qstyle.cpp ================================================ //! [0] python myapplication.py -style motif //! [0] //! [1] python myapplication.py -style custom //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_styles_qstyleoption.cpp ================================================ //! [0] def styleHint(self, stylehint, opt, widget, returnData): if stylehint == SH_RubberBand_Mask: if isinstance(QStyleHintReturnMask, hint): ... ... //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_text_qfont.cpp ================================================ //! [0] serifFont = QFont("Times", 10, QFont.Bold) sansFont = QFont("Helvetica [Cronyx]", 12) //! [0] //! [1] f = QFont("Helvetica") //! [1] //! [2] f = QFont("Helvetica [Cronyx]") //! [2] //! [3] info = QFontInfo(f1) family = info.family() //! [3] //! [4] fm = QFontMetrics(f1) textWidthInPixels = fm.width("How many pixels wide is this text?") textHeightInPixels = fm.height() //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_text_qfontmetrics.cpp ================================================ //! [0] font = QFont("times", 24) fm = QFontMetrics(font) pixelsWide = fm.width("What's the width of this text?") pixelsHigh = fm.height() //! [0] //! [1] font = QFont("times", 24) fm = QFontMetricsF(font) pixelsWide = fm.width("What's the width of this text?") pixelsHigh = fm.height() //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_text_qsyntaxhighlighter.cpp ================================================ //! [0] editor = QTextEdit() highlighter = MyHighlighter(editor.document()) //! [0] //! [1] class MyHighlighter(QSyntaxHighlighter): def highlightBlock(self, text): myClassFormat = QTextCharFormat() myClassFormat.setFontWeight(QFont.Bold) myClassFormat.setForeground(Qt.darkMagenta) pattern = QString("\\bMy[A-Za-z]+\\b") expression = QRegExp(pattern) index = text.indexOf(expression) while index >= 0: length = expression.matchedLength() setFormat(index, length, myClassFormat) index = text.indexOf(expression, index + length) //! [1] //! [2] multiLineCommentFormat = QTextCharFormat() multiLineCommentFormat.setForeground(Qt.red) startExpression = QRegExp("/\\*") endExpression = QRegExp("\\*/") setCurrentBlockState(0) startIndex = 0 if previousBlockState() != 1: startIndex = text.indexOf(startExpression) while startIndex >= 0: endIndex = text.indexOf(endExpression, startIndex) if endIndex == -1: setCurrentBlockState(1) commentLength = text.length() - startIndex else: commentLength = endIndex - startIndex + endExpression.matchedLength() setFormat(startIndex, commentLength, multiLineCommentFormat) startIndex = text.indexOf(startExpression, startIndex + commentLength) //! [2] //! [3] class MyHighlighter(QSyntaxHighlighter): def highlightBlock(self, text): myClassFormat = QTextCharFormat() myClassFormat.setFontWeight(QFont.Bold) myClassFormat.setForeground(Qt.darkMagenta) pattern = QString("\\bMy[A-Za-z]+\\b") expression = QRegExp(pattern) index = text.indexOf(expression) while index >= 0: length = expression.matchedLength() setFormat(index, length, myClassFormat) index = text.indexOf(expression, index + length) //! [3] //! [4] class BlockData(QTextBlockUserData): def __init__(self): # ... self.parentheses = [] //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_text_qtextcursor.cpp ================================================ //! [0] cursor.clearSelection() cursor.movePosition(QTextCursor.NextWord, QTextCursor.KeepAnchor) cursor.insertText("Hello World") //! [0] //! [1] img = ... # A QImage textDocument.addResource(QTextDocument.ImageResource, QUrl("myimage"), img) cursor.insertImage("myimage") //! [1] //! [2] cursor = QTextCursor(textDocument) cursor.beginEditBlock() cursor.insertText("Hello") cursor.insertText("World") cursor.endEditBlock() textDocument.undo() //! [2] //! [3] cursor = QTextCursor(textDocument) cursor.beginEditBlock() cursor.insertText("Hello") cursor.insertText("World") cursor.endEditBlock() ... cursor.joinPreviousEditBlock() cursor.insertText("Hey") cursor.endEditBlock() textDocument.undo() //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_text_qtextdocument.cpp ================================================ //! [0] plain = QString("#include ") html = Qt::escape(plain) # html == "#include <QtCore>" //! [0] //! [1] ... //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_text_qtextlayout.cpp ================================================ //! [0] leading = fontMetrics.leading() height = 0 widthUsed = 0 textLayout.beginLayout() while True: line = textLayout.createLine() if not line.isValid(): break line.setLineWidth(lineWidth) height += leading line.setPosition(QPointF(0, height)) height += line.height() widthUsed = qMax(widthUsed, line.naturalTextWidth()) textLayout.endLayout() //! [0] //! [1] painter = QPainter(self) textLayout.draw(painter, QPoint(0, 0)) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_util_qcompleter.cpp ================================================ //! [0] wordList = ["alpha", "omega", "omicron", "zeta"] lineEdit = QLineEdit(self) completer = QCompleter(wordList, self) completer.setCaseSensitivity(Qt.CaseInsensitive) lineEdit.setCompleter(completer) //! [0] //! [1] completer = QCompleter(self) completer.setModel(QDirModel(completer)) lineEdit.setCompleter(completer) //! [1] //! [2] i = 0 while completer.setCurrentRow(i): print "%s is match number %d" % (completer.currentCompletion(), i) i += 1 //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_util_qdesktopservices.cpp ================================================ //! [0] def showHelp(url): # ... pass QDesktopServices.setUrlHandler("help", showHelp); //! [0] //! [1] mailto:user@foo.com?subject=Test&body=Just a test //! [1] //! [2] QDesktopServices.openUrl(QUrl("file:///C:/Documents and Settings/All Users/Desktop", QUrl.TolerantMode)) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_util_qundostack.cpp ================================================ //! [0] class AppendText(QUndoCommand): self.m_document = '' self.m_text = '' def AppendText(self, doc, text): self.m_document = doc self.m_text = text self.setText("append text") def undo(self): self.m_document.chop(self.m_text.length()) def redo(self): self.m_document->append(self.m_text) //! [0] //! [1] command1 = MyCommand() stack.push(command1) command2 = MyCommand() stack.push(command2) stack.undo() command3 = MyCommand() stack.push(command3) # command2 gets deleted //! [1] //! [2] insertRed = QUndoCommand() # an empty command insertRed.setText("insert red text") InsertText(document, idx, text, insertRed) # becomes child of insertRed SetColor(document, idx, text.length(), Qt.red, insertRed) stack.push(insertRed) //! [2] //! [3] class AppendText(QUndoCommand): ... def mergeWith(self, other): if other.id() != self.id(): # make sure other is also an AppendText command return False m_text += other.m_text return True //! [3] //! [4] stack.beginMacro("insert red text") stack.push(InsertText(document, idx, text)) stack.push(SetColor(document, idx, text.length(), Qt.red)) stack.endMacro() # indexChanged() is emitted //! [4] //! [5] insertRed = QUndoCommand() # an empty command insertRed.setText("insert red text") InsertText(document, idx, text, insertRed) # becomes child of insertRed SetColor(document, idx, text.length(), Qt.red, insertRed) stack.push(insertRed) //! [5] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qabstractbutton.cpp ================================================ //! [0] button = QPushButton(QObject.tr("Ro&ck && Roll"), self) //! [0] //! [1] button.setIcon(QIcon(":/images/print.png")) button.setShortcut(tr("Alt+F7")) //! [1] //! [2] class MyWidget (QWidget): #... def reactToToggle(checked): if checked: // Examine the button states. ... //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qabstractspinbox.cpp ================================================ //! [0] spinBox = QSpinBox(self) spinBox.setRange(0, 100) spinBox.setWrapping(True) spinBox.setValue(100) spinBox.stepBy(1) // value is 0 //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qcalendarwidget.cpp ================================================ //! [0] calendar.setGridVisible(True) //! [0] //! [1] calendar.setGridVisible(True) calendar.setMinimumDate(QDate(2006, 6, 19)) //! [1] //! [2] calendar.setGridVisible(True) calendar.setMaximumDate(QDate(2006, 7, 3)) //! [2] //! [3] calendar.setDateRange(min, max) //! [3] //! [4] calendar.setMinimumDate(min) calendar.setMaximumDate(max) //! [4] //! [5] calendar.setGridVisible(True) //! [5] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qcheckbox.cpp ================================================ //! [0] checkbox = QCheckBox("C&ase sensitive", self) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qdatetimeedit.cpp ================================================ //! [0] dateEdit = QDateTimeEdit(QDate.currentDate()) dateEdit.setMinimumDate(QDate.currentDate().addDays(-365)) dateEdit.setMaximumDate(QDate.currentDate().addDays(365)) dateEdit.setDisplayFormat("yyyy.MM.dd") //! [0] //! [1] setDateTimeRange(min, max) //! [1] //! [2] setMinimumDateTime(min) setMaximumDateTime(max) //! [2] //! [3] setDateRange(min, max) //! [3] //! [4] setMinimumDate(min) setMaximumDate(max) //! [4] //! [5] setTimeRange(min, max) //! [5] //! [6] setMinimumTime(min) setMaximumTime(max) //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qdockwidget.cpp ================================================ //! [0] dockWidget = parentWidget() if dockWidget.features() & QDockWidget.DockWidgetVerticalTitleBar: # I need to be vertical else: # I need to be horizontal //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qframe.cpp ================================================ //! [0] label = QLabel() label.setFrameStyle(QFrame.Panel | QFrame.Raised) label.setLineWidth(2) pbar = QProgressBar() label.setFrameStyle(QFrame.NoFrame) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qgroupbox.cpp ================================================ //! [0] g.setTitle("&User information") //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qlabel.cpp ================================================ //! [0] label = QLabel(self) label.setFrameStyle(QFrame.Panel | QFrame.Sunken) label.setText("first line\nsecond line") label.setAlignment(Qt.AlignBottom | Qt.AlignRight) //! [0] //! [1] phoneEdit = QLineEdit(self) phoneLabel = QLabel("&Phone:", self) phoneLabel.setBuddy(phoneEdit) //! [1] //! [2] nameEd = QLineEdit(self) nameLb = QLabel("&Name:", self) nameLb.setBuddy(nameEd) phoneEd = QLineEdit(self) phoneLb = QLabel("&Phone:", self) phoneLb.setBuddy(phoneEd) # (layout setup not shown) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qlineedit.cpp ================================================ //! [0] def contextMenuEvent(event): menu = createStandardContextMenu() menu.addAction(QObject.tr("My Menu Item")) #... menu.exec_(event.globalPos()) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qmainwindow.cpp ================================================ //! [0] def closeEvent(self, event): settings = QSettings("MyCompany", "MyApp") settings.setValue("geometry", self.saveGeometry()) settings.setValue("windowState", self.saveState()) QMainWindow.closeEvent(self, event) //! [0] //! [1] def readSettings(self): settings = QSettings("MyCompany", "MyApp") restoreGeometry(settings.value("myWidget/geometry")) restoreState(settings.value("myWidget/windowState")) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qmenu.cpp ================================================ //! [0] exec_(QCursor.pos()) //! [0] //! [1] exec_(somewidget.mapToGlobal(QPoint(0,0))) //! [1] //! [2] exec_(e.globalPos()) //! [2] //! [3] exec_(QCursor.pos()) //! [3] //! [4] exec_(somewidget.mapToGlobal(QPoint(0, 0))) //! [4] //! [5] exec_(e.globalPos()) //! [5] //! [6] menu = QMenu() at = actions[0] // Assumes actions is not empty for a in actions: menu.addAction(a) menu.exec_(pos, at) //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qmenubar.cpp ================================================ //! [0] menubar.addMenu(fileMenu) //! [0] //! [1] menuBar = QMenuBar() //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qplaintextedit.cpp ================================================ //! [0] class MyQPlainTextEdit(QPlainTextEdit): def contextMenuEvent(self, event): menu = createStandardContextMenu() menu.addAction(tr("My Menu Item")) # ... menu.exec_(event.globalPos()) del menu //! [0] //! [1] edit.textCursor().insertText(text) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qpushbutton.cpp ================================================ //! [0] button = QPushButton("&Download", self) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qradiobutton.cpp ================================================ //! [0] button = QRadioButton("Search from the &cursor", self) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qrubberband.cpp ================================================ //! [0] class Widget: def mousePressEvent(self, event): origin = event.pos() if not self.rubberBand: self.rubberBand = QRubberBand(QRubberBand.Rectangle, self) rubberBand.setGeometry(QRect(origin, QSize())) rubberBand.show() def mouseMoveEvent(self, event): rubberBand.setGeometry(QRect(origin, event.pos()).normalized()) def mouseReleaseEvent(self, event): rubberBand.hide() # determine selection, for example using QRect.intersects() # and QRect.contains(). //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qscrollarea.cpp ================================================ //! [0] imageLabel = QLabel() image = QImage("happyguy.png") imageLabel.setPixmap(QPixmap.fromImage(image)) scrollArea = QScrollArea() scrollArea.setBackgroundRole(QPalette.Dark) scrollArea.setWidget(imageLabel) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qspinbox.cpp ================================================ //! [0] sb.setPrefix("$") //! [0] //! [1] sb.setSuffix(" km") //! [1] //! [2] setRange(minimum, maximum) //! [2] //! [3] setMinimum(minimum) setMaximum(maximum) //! [3] //! [4] spinbox.setPrefix("$") //! [4] //! [5] spinbox.setSuffix(" km") //! [5] //! [6] setRange(minimum, maximum) //! [6] //! [7] setMinimum(minimum) setMaximum(maximum) //! [7] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qsplashscreen.cpp ================================================ //! [0] pixmap = QPixmap(":/splash.png") splash = QSplashScreen(pixmap) splash.show() ... # Loading some items splash.showMessage("Loaded modules") qApp.processEvents() ... # Establishing connections splash.showMessage("Established connections") qApp.processEvents() //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qsplitter.cpp ================================================ //! [0] widget = splitter.widget(index) policy = widget.sizePolicy() policy.setHorizontalStretch(stretch) policy.setVerticalStretch(stretch) widget.setSizePolicy(policy) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qstatusbar.cpp ================================================ //! [0] statusBar().addWidget(MyReadWriteIndication()) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qtextbrowser.cpp ================================================ //! [0] backaction.setToolTip(browser.historyTitle(-1)) forwardaction.setToolTip(browser.historyTitle(+1)) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qtextedit.cpp ================================================ //! [0] class MyTextEdit(QTextEdit): def contextMenuEvent(self, event): menu = createStandardContextMenu() menu.addAction(tr("My Menu Item")) #... menu.exec_(event->globalPos()) del menu //! [0] //! [1] edit.textCursor().insertText(text) //! [1] //! [2] edit.textCursor().insertHtml(fragment) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qvalidator.cpp ================================================ //! [0] validator = QIntValidator(100, 999, self) edit = QLineEdit(self) # the edit lineedit will only accept integers between 100 and 999 edit.setValidator(validator) //! [0] //! [1] pos = 0 v = QIntValidator(100, 900, self) str = "1" v.validate(str, pos) # returns Intermediate str = "012" v.validate(str, pos) # returns Intermediate str = "123" v.validate(str, pos) # returns Acceptable str = "678" v.validate(str, pos) # returns Acceptable str = "999" v.validate(str, pos) # returns Intermediate str = "1234" v.validate(str, pos) # returns Invalid str = "-123" v.validate(str, pos) # returns Invalid str = "abc" v.validate(str, pos) # returns Invalid str = "12cm" v.validate(str, pos) # returns Invalid //! [1] //! [2] pos = 0 s = "abc" v.validate(s, pos) # returns Invalid s = "5" v.validate(s, pos) # returns Intermediate s = "50" v.validate(s, pos) # returns Acceptable //! [2] //! [3] # regexp: optional '-' followed by between 1 and 3 digits rx = QRegExp("-?\\d{1,3}") validator = QRegExpValidator(rx, self) edit = QLineEdit(self) edit.setValidator(validator) //! [3] //! [4] # integers 1 to 9999 rx = QRegExp("[1-9]\\d{0,3}") # the validator treats the regexp as "^[1-9]\\d{0,3}$" v = QRegExpValidator(rx, 0) pos = 0 s = "0" v.validate(s, pos) # returns Invalid s = "12345" v.validate(s, pos) # returns Invalid s = "1" v.validate(s, pos) # returns Acceptable rx.setPattern("\\S+") # one or more non-whitespace characters v.setRegExp(rx) s = "myfile.txt" v.validate(s, pos) # Returns Acceptable s = "my file.txt" v.validate(s, pos) # Returns Invalid # A, B or C followed by exactly five digits followed by W, X, Y or Z rx.setPattern("[A-C]\\d{5}[W-Z]") v.setRegExp(rx) s = "a12345Z" v.validate(s, pos) # Returns Invalid s = "A12345Z" v.validate(s, pos) # Returns Acceptable s = "B12" v.validate(s, pos) # Returns Intermediate # match most 'readme' files rx.setPattern("read\\S?me(\.(txt|asc|1st))?") rx.setCaseSensitive(false) v.setRegExp(rx) s = "readme" v.validate(s, pos) # Returns Acceptable s = "README.1ST" v.validate(s, pos) # Returns Acceptable s = "read me.txt" v.validate(s, pos) # Returns Invalid s = "readm" v.validate(s, pos) # Returns Intermediate //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qworkspace.cpp ================================================ //! [0] class MainWindow(...): def __init__(self): self.workspace = QWorkspace() self.setCentralWidget(workspace) ... //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_access_qftp.cpp ================================================ //! [0] ftp = QFtp(parent) ftp.connectToHost("ftp.trolltech.com") ftp.login() //! [0] //! [1] ftp.connectToHost("ftp.trolltech.com") # id == 1 ftp.login() # id == 2 ftp.cd("qt") # id == 3 ftp.get("INSTALL") # id == 4 ftp.close() # id == 5 //! [1] //! [2] start(1) stateChanged(HostLookup) stateChanged(Connecting) stateChanged(Connected) finished(1, false) start(2) stateChanged(LoggedIn) finished(2, false) start(3) finished(3, false) start(4) dataTransferProgress(0, 3798) dataTransferProgress(2896, 3798) readyRead() dataTransferProgress(3798, 3798) readyRead() finished(4, false) start(5) stateChanged(Closing) stateChanged(Unconnected) finished(5, false) done(false) //! [2] //! [3] start(1) stateChanged(HostLookup) stateChanged(Connecting) stateChanged(Connected) finished(1, false) start(2) finished(2, true) done(true) //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_access_qhttp.cpp ================================================ //! [0] content-type: text/html //! [0] //! [1] header.setValue("content-type", "text/html") contentType = header.value("content-type") //! [1] //! [2] header = QHttpRequestHeader("GET", QUrl.toPercentEncoding("/index.html")) header.setValue("Host", "qtsoftware.com") http.setHost("qtsoftware.com") http.request(header) //! [2] //! [3] http.setHost("qtsoftware.com") # id == 1 http.get(QUrl.toPercentEncoding("/index.html")) # id == 2 //! [3] //! [4] requestStarted(1) requestFinished(1, False) requestStarted(2) stateChanged(Connecting) stateChanged(Sending) dataSendProgress(77, 77) stateChanged(Reading) responseHeaderReceived(responseheader) dataReadProgress(5388, 0) readyRead(responseheader) dataReadProgress(18300, 0) readyRead(responseheader) stateChanged(Connected) requestFinished(2, False) done(False) stateChanged(Closing) stateChanged(Unconnected) //! [4] //! [5] http.setHost("www.foo.bar") # id == 1 http.get("/index.html") # id == 2 http.post("register.html", data) # id == 3 //! [5] //! [6] requestStarted(1) requestFinished(1, False) requestStarted(2) stateChanged(HostLookup) requestFinished(2, True) done(True) stateChanged(Unconnected) //! [6] //! [7] def getTicks(self): http = QHttp(self) self.connect(http, SIGNAL('done(bool)'), self, SLOT('showPage()')) http.setProxy("proxy.example.com", 3128) http.setHost("ticker.example.com") http.get("/ticks.asp") def showPage(self): self.display(http.readAll()) //! [7] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkaccessmanager.cpp ================================================ //! [0] manager = QNetworkAccessManager(self) manager.finished[QNetworkReply].connect(self.replyFinished) manager.get(QNetworkRequest(QUrl("http://qt.nokia.com"))) //! [0] //! [1] request = QNetworkRequest() request.setUrl(QUrl("http://qt.nokia.com")) request.setRawHeader("User-Agent", "MyOwnBrowser 1.0") reply = manager.get(request) reply.readyRead.connect(self.slotReadyRead) reply.error[QNetworkReply.NetworkError].connect(self..slotError) reply.sslErrors.connect(self.slotSslErrors) //! [1] //! [2] manager = QNetworkConfigurationManager() networkAccessManager.setConfiguration(manager.defaultConfiguration()) //! [2] //! [3] networkAccessManager.setConfiguration(QNetworkConfiguration()) //! [3] //! [4] networkAccessManager.setNetworkAccessible(QNetworkAccessManager.NotAccessible) //! [4] //! [5] networkAccessManager.setNetworkAccessible(QNetworkAccessManager.Accessible) //! [5] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkdiskcache.cpp ================================================ //! [0] manager = QNetworkAccessManager(self) diskCache = QNetworkDiskCache(self) diskCache.setCacheDirectory("cacheDir") manager.setCache(diskCache) //! [0] //! [1] # do a normal request (preferred from network, as this is the default) request = QNetworkRequest(QUrl("http://qt.nokia.com")) manager.get(request) # do a request preferred from cache request2 = QNetworkRequest(QUrl("http://qt.nokia.com")) request2.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache) manager.get(request2) //! [1] //! [2] @Slot(QNetworkReply) def replyFinished(reply): fromCache = reply.attribute(QNetworkRequest.SourceIsFromCacheAttribute) print("page from cache? %d" % fromCache) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkrequest.cpp ================================================ //! [0] request.setRawHeader("Last-Modified", "Sun, 06 Nov 1994 08:49:37 GMT") //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_bearer_qnetworkconfigmanager.cpp ================================================ //! [0] mgr = QNetworkConfigurationManager() activeConfigs = mgr.allConfigurations(QNetworkConfiguration.Active) if activeConfigs: assert(mgr.isOnline()) else: assert(not mgr.isOnline()) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_kernel_qhostaddress.cpp ================================================ //! [0] addr = hostAddr.toIPv6Address() # addr contains 16 unsigned characters for i in range(0, 16): # process addr[i] //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_kernel_qhostinfo.cpp ================================================ //! [0] # To find the IP address of qtsoftware.com QHostInfo.lookupHost("qtsoftware.com", self, SLOT("printResults(QHostInfo)")) # To find the host name for 4.2.2.1 QHostInfo.lookupHost("4.2.2.1", self, SLOT("printResults(QHostInfo)")) //! [0] //! [1] info = QHostInfo.fromName("qtsoftware.com") //! [1] //! [2] QHostInfo.lookupHost("www.kde.org", self.lookedUp) //! [2] //! [3] def lookedUp(host): if host.error() != QHostInfo.NoError: print "Lookup failed: %s" % host.errorString() return for address in host.addresses(): print "Found address: %s" % address.toString() //! [3] //! [4] QHostInfo.lookupHost("4.2.2.1", self.lookedUp) //! [4] //! [5] info = QHostInfo() ... if not info.addresses().isEmpty(): address = info.addresses().first() # use the first IP address //! [5] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_kernel_qnetworkproxy.cpp ================================================ //! [0] proxy = QNetworkProxy() proxy.setType(QNetworkProxy.Socks5Proxy) proxy.setHostName("proxy.example.com") proxy.setPort(1080) proxy.setUser("username") proxy.setPassword("password") QNetworkProxy.setApplicationProxy(proxy) //! [0] //! [1] serverSocket.setProxy(QNetworkProxy.NoProxy) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_socket_qabstractsocket.cpp ================================================ //! [0] socket.connectToHost("imap", 143) if socket.waitForConnected(1000): print "Connected!" //! [0] //! [1] socket.disconnectFromHost() if socket.state() == QAbstractSocket.UnconnectedState or \ socket.waitForDisconnected(1000): print "Disconnected!" //! [1] //! [2] class SocketClass(...): def readyReadSlot(self): # This slot is connected to QAbstractSocket::readyRead() while not socket.atEnd(): data = socket.read(100) ... //! [2] //! [3] socket.setProxy(QNetworkProxy.NoProxy) //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_socket_qlocalsocket_unix.cpp ================================================ //! [0] socket.connectToServer("market") if (socket.waitForConnected(1000)) print("Connected!") //! [0] //! [1] socket.disconnectFromServer() if (socket.waitForDisconnected(1000)) print("Disconnected!") //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_socket_qnativesocketengine.cpp ================================================ //! [0] socketLayer = QNativeSocketEngine() socketLayer.initialize(QAbstractSocket.TcpSocket, QAbstractSocket.IPv4Protocol) socketLayer.connectToHost(QHostAddress.LocalHost, 22) # returns False socketLayer.waitForWrite() socketLayer.connectToHost(QHostAddress.LocalHost, 22) # returns True //! [0] //! [1] socketLayer = QNativeSocketEngine() socketLayer.bind(QHostAddress.Any, 4000) socketLayer.listen() if socketLayer.waitForRead(): clientSocket = socketLayer.accept() # a client is connected //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_socket_qtcpserver.cpp ================================================ //! [0] server.setProxy(QNetworkProxy.NoProxy) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_socket_qudpsocket.cpp ================================================ //! [0] def initSocket(self): udpSocket = QUdpSocket(self) udpSocket.bind(QHostAddress.LocalHost, 7755) self.connect(udpSocket, SIGNAL('readyRead()'), self, SLOT('readPendingDatagrams()')) def readPendingDatagrams(self): while udpSocket.hasPendingDatagrams(): datagram = QByteArray() datagram.resize(udpSocket.pendingDatagramSize()) (sender, senderPort) = udpSocket.readDatagram(datagram.data(), datagram.size()) processTheDatagram(datagram) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_ssl_qsslcertificate.cpp ================================================ //! [0] for cert in QSslCertificate.fromPath('C:/ssl/certificate.*.pem', QSsL.Pem, QRegExp.Wildcard): print cert.issuerInfo(QSslCertificate.Organization) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_ssl_qsslconfiguration.cpp ================================================ //! [0] config = sslSocket.sslConfiguration() config.setProtocol(QSsl.TlsV1) sslSocket.setSslConfiguration(config) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_network_ssl_qsslsocket.cpp ================================================ //! [0] socket = QSslSocket(self) QObject.connect(socket, SIGNAL("encrypted()"), self, SLOT("ready()")) socket.connectToHostEncrypted("imap.example.com", 993) //! [0] //! [1] def incomingConnection(socketDescriptor): serverSocket = QSslSocket() if serverSocket.setSocketDescriptor(socketDescriptor): QObject.connect(serverSocket, SIGNAL("encrypted()"), self, SLOT("ready()")) serverSocket.startServerEncryption() //! [1] //! [2] socket = QSslSocket() socket.connectToHostEncrypted("http.example.com", 443) if not socket.waitForEncrypted(): print socket.errorString() return false socket.write("GET / HTTP/1.0\r\n\r\n") while socket.waitForReadyRead(): print socket.readAll().data() //! [2] //! [3] socket = QSslSocket() QObject.connect(socket, SIGNAL("encrypted()"), receiver, SLOT("socketEncrypted()")) socket.connectToHostEncrypted("imap", 993) socket.write("1 CAPABILITY\r\n") //! [3] //! [4] socket = QSslSocket() socket.setCiphers("DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA") //! [4] //! [5] socket.connectToHostEncrypted("imap", 993) if socket.waitForEncrypted(1000): print "Encrypted!" //! [5] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_opengl_qgl.cpp ================================================ //! [0] fmt = QGLFormat() fmt.setAlpha(True) fmt.setStereo(True) QGLFormat.setDefaultFormat(fmt) //! [0] //! [1] fmt = QGLFormat() fmt.setDoubleBuffer(False) # single buffer fmt.setDirectRendering(False) # software rendering myWidget = MyGLWidget(fmt, ...) //! [1] //! [2] fmt = QGLFormat() fmt.setOverlay(True) fmt.setStereo(True) myWidget = MyGLWidget(fmt, ...) if !myWidget.format().stereo(): # ok, goggles off if !myWidget.format().hasOverlay(): print "Cool hardware required" //! [2] //! [3] # The rendering in MyGLWidget depends on using # stencil buffer and alpha channel class MyGLWidget(QGLWidget): def __init__(self, parent): QGLWidget.__init__(self, QGLFormat(QGL.StencilBuffer | QGL.AlphaChannel), parent) if !format().stencil(): print "Could not get stencil buffer results will be suboptimal" if !format().alpha(): print "Could not get alpha channel results will be suboptimal" ... //! [3] //! [4] a = QApplication([]) f = QGLFormat() f.setDoubleBuffer(False) QGLFormat.setDefaultFormat(f) //! [4] //! [5] f = QGLFormat.defaultOverlayFormat() f.setDoubleBuffer(True) QGLFormat.setDefaultOverlayFormat(f) //! [5] //! [6] # ...continued from above myWidget = MyGLWidget(QGLFormat(QGL.HasOverlay), ...) if myWidget.format().hasOverlay(): # Yes, we got an overlay, let's check _its_ format: olContext = myWidget.overlayContext() if olContext.format().doubleBuffer(): # yes, we got a double buffered overlay else: # no, only single buffered overlays are available //! [6] //! [7] cx = QGLContext() # ... f = QGLFormat() f.setStereo(True) cx.setFormat(f) if !cx.create(): exit() # no OpenGL support, or cannot render on the specified paintdevice if !cx.format().stereo(): exit() # could not create stereo context //! [7] //! [8] class MyGLDrawer(QGLWidget): def __init__(self, parent): QGLWidget.__init__(self, parent) pass def initializeGL(self): # Set up the rendering context, define display lists etc.: ... glClearColor(0.0, 0.0, 0.0, 0.0) glEnable(GL_DEPTH_TEST) ... def resizeGL(self, w, h): # setup viewport, projection etc.: glViewport(0, 0, w, h) ... glFrustum(...) ... def paintGL(self): # draw the scene: ... glRotatef(...) glMaterialfv(...) glBegin(GL_QUADS) glVertex3f(...) glVertex3f(...) ... glEnd() ... //! [8] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_opengl_qglcolormap.cpp ================================================ //! [0] import sys from PySide.QtGui import QApplication, qRgb from PySide.QtOpenGL import QGLColormap def main(argv): app = QApplication(argv) widget = MySuperGLWidget() # a QGLWidget in color-index mode colormap = QGLColormap() # This will fill the colormap with colors ranging from # black to white. for i in range(0, colormap.size()): colormap.setEntry(i, qRgb(i, i, i)) widget.setColormap(colormap) widget.show() return app.exec_() if __name__ == "__main__": main(sys.argv) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_opengl_qglpixelbuffer.cpp ================================================ //! [0] pbuffer QGLPixelBuffer(...) ... pbuffer.makeCurrent() dynamicTexture = pbuffer.generateDynamicTexture() pbuffer.bindToDynamicTexture(dynamicTexture) ... pbuffer.releaseFromDynamicTexture() //! [0] //! [1] pbuffer QGLPixelBuffer(...) ... pbuffer.makeCurrent() dynamicTexture = pbuffer.generateDynamicTexture() ... pbuffer.updateDynamicTexture(dynamicTexture) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_opengl_qglshaderprogram.cpp ================================================ //! [0] shader = QGLShader(QGLShader.Vertex) shader.compileSourceCode(code) program = QGLShaderProgram(context) program.addShader(shader) program.link() program.bind() //! [0] //! [1] program.addShaderFromSourceCode(QGLShader.Vertex, "attribute highp vec4 vertex\n" \ "attribute mediump mat4 matrix\n" \ "void main(void)\n" \ "{\n" \ " gl_Position = matrix * vertex\n" \ "}") program.addShaderFromSourceCode(QGLShader.Fragment, "uniform mediump vec4 color\n" \ "void main(void)\n" \ "{\n" \ " gl_FragColor = color\n" \ "}") program.link() program.bind() vertexLocation = program.attributeLocation("vertex") matrixLocation = program.attributeLocation("matrix") colorLocation = program.uniformLocation("color") //! [1] //! [2] triangleVertices = ( 60.0f, 10.0f, 0.0f, 110.0f, 110.0f, 0.0f, 10.0f, 110.0f, 0.0f) color = QColor(0, 255, 0, 255) pmvMatrix = QMatrix4x4() pmvMatrix.ortho(self.rect()) program.enableAttributeArray(vertexLocation) program.setAttributeArray(vertexLocation, triangleVertices, 3) program.setUniformValue(matrixLocation, pmvMatrix) program.setUniformValue(colorLocation, color) glDrawArrays(GL_TRIANGLES, 0, 3) program.disableAttributeArray(vertexLocation) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_qtestlib_qtestcase.cpp ================================================ //! [0] QVERIFY(1 + 1 == 2) //! [0] //! [1] QVERIFY2(1 + 1 == 2, "A breach in basic arithmetic occured.") //! [1] //! [2] QCOMPARE(QString("hello").toUpper(), QString("HELLO")) //! [2] //! [3] void TestQString.toInt_data() { QTest.addColumn("aString") QTest.addColumn("expected") QTest.newRow("positive value") << "42" << 42 QTest.newRow("negative value") << "-42" << -42 QTest.newRow("zero") << "0" << 0 } //! [3] //! [4] void TestQString.toInt() { QFETCH(QString, aString) QFETCH(int, expected) QCOMPARE(aString.toInt(), expected) } //! [4] //! [5] if (sizeof(int) != 4) QFAIL("This test has not been ported to this platform yet.") //! [5] //! [6] QFETCH(QString, myString) QCOMPARE(QString("hello").toUpper(), myString) //! [6] //! [7] QTEST(QString("hello").toUpper(), "myString") //! [7] //! [8] if (!QSqlDatabase.drivers().contains("SQLITE")) QSKIP("This test requires the SQLITE database driver", SkipAll) //! [8] //! [9] QEXPECT_FAIL("", "Will fix in the next release", Continue) QCOMPARE(i, 42) QCOMPARE(j, 43) //! [9] //! [10] QEXPECT_FAIL("data27", "Oh my, this is soooo broken", Abort) QCOMPARE(i, 42) //! [10] //! [11] class TestQString: public QObject { ... } QTEST_MAIN(TestQString) //! [11] //! [12] #ifdef Q_WS_X11 QTEST_MAIN(MyX11Test) #else // do nothing on non-X11 platforms QTEST_NOOP_MAIN #endif //! [12] //! [13] QTest.keyClick(myWidget, 'a') //! [13] //! [14] QTest.keyClick(myWidget, Qt.Key_Escape) QTest.keyClick(myWidget, Qt.Key_Escape, Qt.ShiftModifier, 200) //! [14] //! [15] QTest.keyClicks(myWidget, "hello world") //! [15] //! [16] namespace QTest { template<> char *toString(const MyPoint &point) { QByteArray ba = "MyPoint(" ba += QByteArray.number(point.x()) + ", " + QByteArray.number(point.y()) ba += ")" return qstrdup(ba.data()) } } //! [16] //! [17] int i = 0 while (myNetworkServerNotResponding() && i++ < 50) QTest.qWait(250) //! [17] //! [18] MyFirstTestObject test1 QTest.qExec(&test1) MySecondTestObject test2 QTest.qExec(&test2) //! [18] //! [19] QDir dir QTest.ignoreMessage(QtWarningMsg, "QDir.mkdir: Empty or null file name(s)") dir.mkdir("") //! [19] //! [20] void myTestFunction_data() { QTest.addColumn("aString") QTest.newRow("just hello") << QString("hello") QTest.newRow("a null string") << QString() } //! [20] //! [21] void myTestFunction_data() { QTest.addColumn("intval") QTest.addColumn("str") QTest.addColumn("dbl") QTest.newRow("row1") << 1 << "hello" << 1.5 } //! [21] //! [22] void MyTestClass.cleanup() { if (qstrcmp(currentTestFunction(), "myDatabaseTest") == 0) { // clean up all database connections closeAllDatabases() } } //! [22] //! [23] QTest.qSleep(250) //! [23] //! [24] widget = QWidget() widget.show() QTest.qWaitForWindowShown(widget) //! [24] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_script_qscriptable.cpp ================================================ //! [0] class MyScriptableObject(QObject, QScriptable): ... def doSomething(self): ... def doSomethingElse(self): ... //! [0] //! [1] def doSomething(self): self.context().throwError('Threw an error from a slot') def doSomethingElse(self): return self.thisObject() //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_script_qscriptclass.cpp ================================================ //! [0] if extension == Callable: context = argument engine = context.engine() sum = 0 for i in range(0, context.argumentCount()): sum += context.argument(i).toNumber() return sum //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_script_qscriptcontext.cpp ================================================ //! [0] foo(20.5, "hello", Object()) //! [0] //! [1] def Person_prototype_fullName(context, engine): self = context.selfObject() result = self.property("firstName").toString() result += QLatin1String(" ") result += self.property("lastName").toString() return result //! [1] //! [2] def myInclude(ctx, eng): fileName = ctx.argument(0).toString() contents = readTheFile(fileName) ctx.setActivationObject(ctx.parentContext().activationObject()) ctx.setThisObject(ctx.parentContext().selfObject()) return eng.evaluate(contents, fileName) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_script_qscriptengine.cpp ================================================ //! [0] myEngine = QScriptEngine() three = myEngine.evaluate("1 + 2") //! [0] //! [1] fun = myEngine.evaluate("function(a, b) { return a + b }"); args = QScriptValueList() args << 1 << 2 threeAgain = fun.call(QScriptValue(), args) //! [1] //! [2] fileName = "helloworld.qs" scriptFile = QFile(fileName) if !scriptFile.open(QIODevice.ReadOnly): # handle error stream = QTextStream(scriptFile) contents = stream.readAll() scriptFile.close() myEngine.evaluate(contents, fileName) //! [2] //! [3] myEngine.globalObject().setProperty("myNumber", 123) ... myNumberPlusOne = myEngine.evaluate("myNumber + 1") //! [3] //! [4] result = myEngine.evaluate(...) if myEngine.hasUncaughtException(): line = myEngine.uncaughtExceptionLineNumber() print "uncaught exception at line", line, ":", result.toString() //! [4] //! [5] button = QPushButton() QScriptValue scriptButton = myEngine.QObject(button) myEngine.globalObject().setProperty("button", scriptButton) myEngine.evaluate("button.checkable = True") print scriptButton.property("checkable").toBoolean() scriptButton.property("show").call() # call the show() slot //! [5] //! [6] def myAdd(context, engine): a = context.argument(0) b = context.argument(1) return a.toNumber() + b.toNumber() //! [6] //! [7] fun = myEngine.Function(myAdd) myEngine.globalObject().setProperty("myAdd", fun) //! [7] //! [8] result = myEngine.evaluate("myAdd(myNumber, 1)") //! [8] //! [9] def Foo(context, engine): if context.calledAsConstructor(): # initialize the object context.selfObject().setProperty("bar", ...) # ... # return a non-object value to indicate that the # selfObject() should be the result of the " Foo()" expression return engine.undefinedValue() else: # not called as " Foo()", just "Foo()" # create our own object and return that one object = engine.Object() object.setPrototype(context.callee().property("prototype")) object.setProperty("baz", ...) return object ... fooProto = engine.Object() fooProto.setProperty("whatever", ...) engine.globalObject().setProperty("Foo", engine->Function(Foo, fooProto)) //! [9] //! [10] class Bar: ... def constructBar(context, engine): bar = Bar() # initialize from arguments in context, if desired ... return engine.toScriptValue(bar) class BarPrototype(QObject, QScriptable): # provide the scriptable interface of self type using slots and properties ... ... # create and register the Bar prototype and constructor in the engine barPrototypeObject = BarPrototype(...) barProto = engine.QObject(barPrototypeObject) engine.setDefaultPrototype(qMetaTypeId(Bar), barProto) barCtor = engine.Function(constructBar, barProto) engine.globalObject().setProperty("Bar", barCtor) //! [10] //! [11] def getSetFoo(context,engine): callee = context.callee() if context.argumentCount() == 1: # writing? callee.setProperty("value", context.argument(0)) return callee.property("value") } .... object = engine.Object() object.setProperty("foo", engine.Function(getSetFoo), QScriptValue.PropertyGetter | QScriptValue::PropertySetter) //! [11] //! [12] object = engine.Object() object.setProperty("foo", engine.Function(getFoo), QScriptValue.PropertyGetter) object.setProperty("foo", engine.Function(setFoo), QScriptValue.PropertySetter) //! [12] //! [13] Q_SCRIPT_DECLARE_QMETAOBJECT(QLineEdit, QWidget*) ... lineEditClass = engine.scriptValueFromQMetaObject(QLineEdit) engine.globalObject().setProperty("QLineEdit", lineEditClass) //! [13] //! [14] if hello && world: print("hello world") //! [14] //! [15] if hello && //! [15] //! [16] 0 = 0 //! [16] //! [17] ./test.js //! [17] //! [18] foo["bar"] //! [18] //! [19] engine = QScriptEngine() context = engine.pushContext() context.activationObject().setProperty("myArg", 123) engine.evaluate("var tmp = myArg + 42") ... engine.popContext() //! [19] //! [20] class MyStruct: x = 0 y = 0 //! [20] //! [21] Q_DECLARE_METATYPE(MyStruct) //! [21] //! [22] def toScriptValue(engine, s): obj = engine.Object() obj.setProperty("x", s.x) obj.setProperty("y", s.y) return obj def fromScriptValue(obj, s): s.x = obj.property("x").toInt32() s.y = obj.property("y").toInt32() //! [22] //! [23] qScriptRegisterMetaType(engine, toScriptValue, fromScriptValue) //! [23] //! [24] s = context.argument(0) ... s2 = MyStruct() s2.x = s.x + 10 s2.y = s.y + 20 v = engine.toScriptValue(s2) //! [24] //! [25] def createMyStruct(cx, engine): s = MyStruct() s.x = 123 s.y = 456 return engine.toScriptValue(s) ... ctor = engine.Function(createMyStruct) engine.globalObject().setProperty("MyStruct", ctor) //! [25] //! [26] Q_DECLARE_METATYPE(QVector) ... qScriptRegisterSequenceMetaType >(engine) ... v = engine.evaluate("[5, 1, 3, 2]") v.sort() a = engine.toScriptValue(v) print a.toString() # outputs "[1, 2, 3, 5]" //! [26] //! [27] def mySpecialQObjectConstructor(context, engine): parent = context.argument(0).toQObject() object = QObject(parent) return engine.QObject(object, QScriptEngine.ScriptOwnership) ... ctor = engine.Function(mySpecialQObjectConstructor) metaObject = engine.QMetaObject(QObject.staticMetaObject, ctor) engine.globalObject().setProperty("QObject", metaObject) result = engine.evaluate(" QObject()") //! [27] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_script_qscriptengineagent.cpp ================================================ //! [0] var a = Math.random() + 2; //! [0] //! [1] function cube(a) { return a * a * a; } var a = cube(3); //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_script_qscriptvalue.cpp ================================================ //! [0] myEngine = QScriptEngine() myObject = myEngine.newObject() myOtherObject = myEngine.newObject() myObject.setProperty("myChild", myOtherObject) myObject.setProperty("name", "John Doe") //! [0] //! [1] val = QScriptValue(myEngine, 123) myObject.setProperty("myReadOnlyProperty", val, QScriptValue.ReadOnly) //! [1] //! [2] engine = QScriptEngine() engine.evaluate("function fullName() { return this.firstName + ' ' + this.lastName; }") engine.evaluate("somePerson = { firstName: 'John', lastName: 'Doe' }") global_ = engine.globalObject() fullName = global_.property("fullName") who = global_.property("somePerson") print fullName.call(who).toString() # "John Doe" engine.evaluate("function cube(x) { return x * x * x; }") QScriptValue cube = global_.property("cube") args = QScriptValueList() args << 3 print cube.call(QScriptValue(), args).toNumber() # 27 //! [2] //! [3] def myNativeFunction(context, engine): otherFunction = ... return otherFunction.call(context.thisObject(), context.argumentsObject()) //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_script_qscriptvalueiterator.cpp ================================================ //! [0] object = QScriptValue() ... it = QScriptValueIterator(object) while it.hasNext(): it.next() print "%s:%s" % (it.name(), it.value().toString()) //! [0] //! [1] QScriptValue obj = ... // the object to iterate over while obj.isObject(): it = QScriptValueIterator(obj) while it.hasNext(): it.next() print it.name() obj = obj.prototype() //! [1] //! [2] while it.hasNext(): it.next() if it.flags() & QScriptValue::SkipInEnumeration: continue print "found enumerated property: %s" % it.name() //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_sql_kernel_qsqldatabase.cpp ================================================ //! [0] # WRONG db = QSqlDatabase.database("sales") query = QSqlQuery("SELECT NAME, DOB FROM EMPLOYEES", db) QSqlDatabase.removeDatabase("sales") # will output a warning # "db" is now a dangling invalid database connection, # "query" contains an invalid result set //! [0] //! [1] db = QSqlDatabase.database("sales") query = QSqlQuery("SELECT NAME, DOB FROM EMPLOYEES", db) # Both "db" and "query" are destroyed because they are out of scope QSqlDatabase.removeDatabase("sales") # correct //! [1] //! [2] class MyDatabaseDriverCreatorBase(QtSql.QSqlDriverCreatorBase): ... def createObject(self): return MyDatabaseDriver() mydriver = MyDatabaseDriverCreatorBase() QtSql.QSqlDatabase.registerSqlDriver("MYDRIVER", mydriver) db = QtSql.QSqlDatabase.addDatabase("MYDRIVER") //! [2] //! [3] ... db = QSqlDatabase.addDatabase("QODBC") db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb") if db.open(): # success! pass ... //! [3] //! [4] ... # MySQL connection db.setConnectOptions("CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1") # use an SSL connection to the server if not db.open(): db.setConnectOptions() # clears the connect option string ... ... # PostgreSQL connection db.setConnectOptions("requiressl=1") # enable PostgreSQL SSL connections if not db.open(): db.setConnectOptions() # clear options ... ... # ODBC connection # set ODBC options db.setConnectOptions("SQL_ATTR_ACCESS_MODE=SQL_MODE_READ_ONLY;SQL_ATTR_TRACE=SQL_OPT_TRACE_ON") if not db.open(): db.setConnectOptions() # don't try to set this option ... //! [4] //! [5] #include "qtdir/src/sql/drivers/psql/qsql_psql.cpp" //! [5] //! [6] con = PQconnectdb("host=server user=bart password=simpson dbname=springfield") drv = QPSQLDriver(con) db = QSqlDatabase.addDatabase(drv) # becomes the new default connection query = QSqlQuery() query.exec_("SELECT NAME, ID FROM STAFF") ... //! [6] //! [7] unix:LIBS += -lpq win32:LIBS += libpqdll.lib //! [7] //! [8] db = QSqlDatabase() print(db.isValid()) # Returns False db = QSqlDatabase.database("sales") print(db.isValid()) # Returns True if "sales" connection exists QSqlDatabase.removeDatabase("sales") print(db.isValid()) # Returns False //! [8] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_sql_kernel_qsqldriver.cpp ================================================ //! [0] db = QSqlDatabase.addDatabase("SQLITE3") v = QVariant(db.driver().handle()) if v.isValid() && v.typeName() == "sqlite3*": # v.data() returns a pointer to the handle sqlite3 *handle = *static_cast(v.data()) if handle != 0: # check that it is not NULL doSomething() //! [0] //! [1] # Impossible to translate to python if (v.typeName() == "PGconn*") { PGconn *handle = *static_cast(v.data()) if (handle != 0) ... } if (v.typeName() == "MYSQL*") { MYSQL *handle = *static_cast(v.data()) if (handle != 0) ... } //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_sql_kernel_qsqlerror.cpp ================================================ //! [0] model = QSqlQueryModel() model.setQuery("select * from myTable") if model.lastError().isValid(): print model.lastError() //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_sql_kernel_qsqlindex.cpp ================================================ //! [0] strlist = myIndex.toStringList() for i in strlist: myProcessing(i) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_sql_kernel_qsqlquery.cpp ================================================ //! [0] SELECT forename, surname FROM people //! [0] //! [1] q = QSqlQuery("select * from employees") rec = q.record() print "Number of columns: %d" % rec.count() nameCol = rec.indexOf("name") # index of the field "name" while q.next(): print q.value(nameCol) # output all names //! [1] //! [2] q = QSqlQuery() q.prepare("insert into myTable values (?, ?)") ints = [1, 2, 3, 4] q.addBindValue(ints) names = ["Harald", "Boris", "Trond", ""] q.addBindValue(names) if not q.execBatch(): print q.lastError() //! [2] //! [3] 1 Harald 2 Boris 3 Trond 4 NULL //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_sql_kernel_qsqlresult.cpp ================================================ //! [0] q = QSqlQuery() q.prepare("insert into test (i1, i2, s) values (?, ?, ?)") col1 = [1, 3] col2 = [2, 4] col3 = ["hello", "world"] q.bindValue(0, col1) q.bindValue(1, col2) q.bindValue(2, col3) if not q.execBatch(): print q.lastError() //! [0] //! [1] query = QSqlQuery ... v = query.result().handle() if v.isValid() and (v.typeName() == "sqlite3_stmt*"): # v.data() returns a pointer to the handle handle = v.data() if handle != 0: # check that it is not NULL ... //! [1] //! [2] if v.typeName() == "PGresult*": handle = v.data() if handle != 0 ... if v.typeName() == "MYSQL_STMT*": handle = v.data() if handle != 0 ... } //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_sql_models_qsqlquerymodel.cpp ================================================ //! [0] while myModel.canFetchMore(): myModel.fetchMore() //! [0] //! [1] model = QSqlQueryModel() model.setQuery("select * from MyTable") if model.lastError().isValid(): print model.lastError() //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_svg_qgraphicssvgitem.cpp ================================================ //! [0] renderer = QSvgRenderer(QLatin1String("SvgCardDeck.svg")) black = QGraphicsSvgItem() red = QGraphicsSvgItem() black.setSharedRenderer(renderer) black.setElementId(QLatin1String("black_joker")) red.setSharedRenderer(renderer) red.setElementId(QLatin1String("red_joker")) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xml_dom_qdom.cpp ================================================ //! [0] doc = QDomDocument() impl = QDomImplementation() # This will create the element, but the resulting XML document will # be invalid, because '~' is not a valid character in a tag name. impl.setInvalidDataPolicy(QDomImplementation.AcceptInvalidData) elt1 = doc.createElement("foo~bar") # This will create an element with the tag name "foobar". impl.setInvalidDataPolicy(QDomImplementation.DropInvalidData) elt2 = doc.createElement("foo~bar") # This will create a null element. impl.setInvalidDataPolicy(QDomImplementation::ReturnNullNode) elt3 = doc.createElement("foo~bar") //! [0] //! [1] d = QDomDocument() d.setContent(someXML) n = d.firstChild() while !n.isNull(): if n.isElement(): e = n.toElement() print "Element name: %s" % e.tagName() break n = n.nextSibling() //! [1] //! [2] QDomDocument document QDomElement element1 = document.documentElement() QDomElement element2 = element1 //! [2] //! [3] QDomElement element3 = document.createElement("MyElement") QDomElement element4 = document.createElement("MyElement") //! [3] //! [4]

Heading

Hello you

//! [4] //! [5]

Heading

The text...

Next heading

//! [5] //! [6]

Heading

The text...

Next heading

//! [6] //! [7] //! [7] //! [8] e = # some QDomElement... #... a = e.attributeNode("href") print a.value() # prints "http://qtsoftware.com" a.setValue("http://doc.trolltech.com") # change the node's attribute a2 = e.attributeNode("href") print a2.value() # prints "http://doc.trolltech.com" //! [8] //! [9] e = # some QDomElement... #... s = e.text() //! [9] //! [10] text = QString() element = doc.documentElement() n = element.firstChild() while True: if not n.isNull() break t = n.toText() if !t.isNull(): text += t.data() n = n.nextSibling() //! [10] //! [11] doc = # some QDomDocument ... root = doc.firstChildElement("database") elt = root.firstChildElement("entry") while True: if not elt.isNull(): break # ... elt = elt.nextSiblingElement("entry") //! [11] //! [12] //! [12] //! [13]

Hello Qt ]]>

//! [13] //! [14] Hello Qt //! [14] //! [15] //! [15] //! [16] doc = QDomDocument("mydocument") file = QFile("mydocument.xml") if not file.open(QIODevice::ReadOnly): return if not doc.setContent(&file): file.close() return file.close() # print out the element names of all elements that are direct children # of the outermost element. docElem = doc.documentElement() n = docElem.firstChild() while not n.isNull(): e = n.toElement() # try to convert the node to an element. if not e.isNull(): print e.tagName() # the node really is an element. n = n.nextSibling() } # Here we append a new element to the end of the document elem = doc.createElement("img") elem.setAttribute("src", "myimage.png") docElem.appendChild(elem) //! [16] //! [17] doc = QDomDocument("MyML") root = doc.createElement("MyML") doc.appendChild(root) tag = doc.createElement("Greeting") root.appendChild(tag) t = doc.createTextNode("Hello World") tag.appendChild(t) xml = doc.toString() //! [17] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xml_sax_qxml.cpp ================================================ //! [0] xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", True) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xmlpatterns_api_qabstracturiresolver.cpp ================================================ //! [0] return baseURI.resolved(relative); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xmlpatterns_api_qabstractxmlforwarditerator.cpp ================================================ //! [0] OutputType inputToOutputItem(const InputType &inputType) const; //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xmlpatterns_api_qabstractxmlnodemodel.cpp ================================================ //! [0] myInstance = QXmlNodeModelIndex(); //! [0] //! [1] QFile queryFile(argv[1]); QFile chemistryData(argv[2]); QString moleculeName = argv[3]; QXmlQuery query; query.setQuery(&queryFile, QUrl::fromLocalFile(queryFile.fileName())); ChemistryNodeModel myNodeModel(query.namePool(), chemistryData); QXmlNodeModelIndex startNode = myNodeModel.nodeFor(moleculeName); query.bindVariable("queryRoot", startNode); QFile out; out.open(stdout, QIODevice::WriteOnly); QXmlSerializer serializer(query, &out); query.evaluateTo(&serializer); //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xmlpatterns_api_qabstractxmlreceiver.cpp ================================================ //! [0] QXmlQuery query; query.setQuery("doc('index.html')/html/body/p[1]"); QXmlSerializer serializer(query, myOutputDevice); query.evaluateTo(&serializer); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xmlpatterns_api_qsimplexmlnodemodel.cpp ================================================ //! [0] QXmlNodeModelIndex MyTreeModel::nextFromSimpleAxis(SimpleAxis axis, const QXmlNodeModelIndex &ni) const { // Convert the QXmlNodeModelIndex to a value that is specific to what we represent. const MyValue value = toMyValue(ni); switch(axis) { case Parent: return toNodeIndex(value.parent()); case FirstChild: case PreviousSibling: case NextSibling: // and so on ; } return QXmlNodeModelIndex(); } //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xmlpatterns_api_qxmlformatter.cpp ================================================ //! [0] QXmlQuery query; query.setQuery("doc('index.html')/html/body/p[1]"); QXmlFormatter formatter(query, myOutputDevice); formatter.setIndentationDepth(2); query.evaluateTo(&formatter); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xmlpatterns_api_qxmlname.cpp ================================================ // Fills the bits from begin to end with 1s and leaves the rest as 0. template inline IntegralT bitmask(IntegralT begin, IntegralT end) { IntegralT filled_bits = (1 << (end - begin + 1)) - 1; return filled_bits << begin; } ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xmlpatterns_api_qxmlquery.cpp ================================================ //! [0] QXmlNamePool namePool(query.namePool()); query.bindVariable(QXmlName(namePool, localName), value); //! [0] { //! [1] QByteArray myDocument; QBuffer buffer(&myDocument); // This is a QIODevice. buffer.open(QIODevice::ReadOnly); QXmlQuery query; query.bindVariable("myDocument", &buffer); query.setQuery("doc($myDocument)"); //! [1] } { QIODevice *device = 0; //! [2] QXmlNamePool namePool(query.namePool()); query.bindVariable(QXmlName(namePool, localName), device); //! [2] } { QIODevice *myOutputDevice = 0; //! [3] QFile xq("myquery.xq"); QXmlQuery query; query.setQuery(&xq, QUrl::fromLocalFile(xq.fileName())); QXmlSerializer serializer(query, myOutputDevice); query.evaluateTo(&serializer); //! [3] } { QIODevice *myOutputDevice = 0; //! [4] QFile xq("myquery.xq"); QString fileName("the filename"); QString publisherName("the publisher"); qlonglong year = 1234; QXmlQuery query; query.bindVariable("file", QVariant(fileName)); query.bindVariable("publisher", QVariant(publisherName)); query.bindVariable("year", QVariant(year)); query.setQuery(&xq, QUrl::fromLocalFile(xq.fileName())); QXmlSerializer serializer(query, myOutputDevice); query.evaluateTo(&serializer); //! [4] } { //! [5] QFile xq("myquery.xq"); QString fileName("the filename"); QString publisherName("the publisher"); qlonglong year = 1234; QXmlQuery query; query.bindVariable("file", QVariant(fileName)); query.bindVariable("publisher", QVariant(publisherName)); query.bindVariable("year", QVariant(year)); query.setQuery(&xq, QUrl::fromLocalFile(xq.fileName())); QXmlResultItems result; query.evaluateTo(&result); QXmlItem item(result.next()); while (!item.isNull()) { if (item.isAtomicValue()) { QVariant v = item.toAtomicValue(); switch (v.type()) { case QVariant::LongLong: // xs:integer break; case QVariant::String: // xs:string break; default: // error break; } } else if (item.isNode()) { QXmlNodeModelIndex i = item.toNodeModelIndex(); // process node } item = result.next(); } //! [5] } { //! [6] QFile xq("myquery.xq"); QXmlQuery query; query.setQuery(&xq, QUrl::fromLocalFile(xq.fileName())); QXmlResultItems result; query.evaluateTo(&result); QXmlItem item(result.next()); while (!item.isNull()) { if (item.isAtomicValue()) { QVariant v = item.toAtomicValue(); switch (v.type()) { case QVariant::LongLong: // xs:integer break; case QVariant::String: // xs:string break; default: if (v.userType() == qMetaTypeId()) { QXmlName n = qVariantValue(v); // process QXmlName n... } else { // error } break; } } else if (item.isNode()) { QXmlNodeModelIndex i = item.toNodeModelIndex(); // process node } item = result.next(); } //! [6] } { QIODevice *out = 0; //! [7] QXmlQuery query(QXmlQuery::XSLT20); query.setFocus(QUrl("myInput.xml")); query.setQuery(QUrl("myStylesheet.xsl")); query.evaluateTo(out); //! [7] } ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xmlpatterns_api_qxmlresultitems.cpp ================================================ //! [0] QXmlQuery query; query.setQuery(", 1, 'two'"); QXmlResultItems result; if (query.isValid()) { query.evaluateTo(&result); QXmlItem item(result.next()); while (!item.isNull()) { // use item item = result.next(); } if (result.hasError()) /* Runtime error! */; } //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/src_xmlpatterns_api_qxmlserializer.cpp ================================================ //! [0] QXmlQuery query; query.setQuery("doc('index.html')/html/body/p[1]"); QXmlSerializer serializer(query, myOutputDevice); query.evaluateTo(&serializer); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_assistant_compat_lib_qassistantclient.cpp ================================================ //! [0] QProcess *process = new QProcess(this); QString app = QLibraryInfo::location(QLibraryInfo::BinariesPath) + QLatin1String("/assistant"); process->start(app, QStringList() << QLatin1String("-enableRemoteControl")); if (!process->waitForStarted()) { QMessageBox::critical(this, tr("Remote Control"), tr("Could not start Qt Assistant from %1.").arg(app)); return; } // show index page QTextStream str(process); str << QLatin1String("SetSource qthelp://mycompany.com/doc/index.html") << QLatin1Char('\0') << endl; } //! [0] //! [1] CONFIG += assistant //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_extension_default_extensionfactory.cpp ================================================ //! [0] QObject *ANewExtensionFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const { if (iid != Q_TYPEID(QDesignerContainerExtension)) return 0; if (MyCustomWidget *widget = qobject_cast (object)) return new MyContainerExtension(widget, parent); return 0; } //! [0] //! [1] QObject *AGeneralExtensionFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const { MyCustomWidget *widget = qobject_cast(object); if (widget && (iid == Q_TYPEID(QDesignerTaskMenuExtension))) { return new MyTaskMenuExtension(widget, parent); } else if (widget && (iid == Q_TYPEID(QDesignerContainerExtension))) { return new MyContainerExtension(widget, parent); } else { return 0; } } //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_extension_extension.cpp ================================================ //! [0] QDesignerPropertySheetExtension *propertySheet; QExtensionManager manager = formEditor->extensionManager(); propertySheet = qt_extension(manager, widget); if(propertySheet) {...} //! [0] //! [1] Q_DECLARE_EXTENSION_INTERFACE(MyExtension, "com.mycompany.myproduct.myextension") //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_extension_qextensionmanager.cpp ================================================ //! [0] void MyPlugin::initialize(QDesignerFormEditorInterface *formEditor) { if (initialized) return; QExtensionManager *manager = formEditor->extensionManager(); Q_ASSERT(manager != 0); manager->registerExtensions(new MyExtensionFactory(manager), Q_TYPEID(QDesignerTaskMenuExtension)); initialized = true; } //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_sdk_abstractformeditor.cpp ================================================ //! [0] QDesignerObjectInspectorInterface *objectInspector = 0; objectInspector = formEditor->objectInspector(); QDesignerFormWindowManagerInterface *manager = 0; manager = formEditor->formWindowManager(); objectInspector->setFormWindow(manager->formWindow(0)); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_sdk_abstractformwindow.cpp ================================================ //! [0] QDesignerFormWindowInterface *formWindow; formWindow = QDesignerFormWindowInterface::findFormWindow(myWidget); //! [0] //! [1] QList forms; QDesignerFormWindowInterface *formWindow; QDesignerFormWindowManagerInterface *manager = formEditor->formWindowManager(); for (int i = 0; i < manager->formWindowCount(); i++) { formWindow = manager->formWindow(i); forms.append(formWindow); } //! [1] //! [2] if (formWindow->isManaged(myWidget)) formWindow->manageWidget(myWidget->childWidget); //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_sdk_abstractformwindowcursor.cpp ================================================ //! [0] QDesignerFormWindowInterface *formWindow = 0; formWindow = QDesignerFormWindowInterface::findFormWindow(myWidget); formWindow->cursor()->setProperty(myWidget, myProperty, newValue); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_sdk_abstractformwindowmanager.cpp ================================================ //! [0] QDesignerFormWindowManagerInterface *manager = 0; QDesignerFormWindowInterface *formWindow = 0; manager = formEditor->formWindowManager(); formWindow = manager->formWindow(0); manager->setActiveFormWindow(formWindow); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_sdk_abstractobjectinspector.cpp ================================================ //! [0] QDesignerObjectInspectorInterface *objectInspector = 0; objectInspector = formEditor->objectInspector(); QDesignerFormWindowManagerInterface *manager = 0; manager = formEditor->formWindowManager(); objectInspector->setFormWindow(manager->formWindow(0)); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_sdk_abstractpropertyeditor.cpp ================================================ //! [0] QDesignerPropertyEditorInterface *propertyEditor = 0; propertyEditor = formEditor->propertyEditor(); connect(propertyEditor, SIGNAL(propertyChanged(QString, QVariant)), this, SLOT(checkProperty(QString, QVariant))); //! [0] //! [1] void checkProperty(QString property, QVariant value) { QDesignerPropertyEditorInterface *propertyEditor = 0; propertyEditor = formEditor->propertyEditor(); QObject *object = propertyeditor->object(); MyCustomWidget *widget = qobject_cast(object); if (widget && property == aProperty && value != expectedValue) {...} } //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_sdk_abstractwidgetbox.cpp ================================================ //! [0] QDesignerWidgetBoxInterface *widgetBox = 0: widgetBox = formEditor->widgetBox(); widgetBox->load(); //! [0] //! [1] QString originalFile = widgetBox->fileName(); widgetBox->setFileName("myWidgetBox.xml"); widgetBox->save(); //! [1] //! [2] widgetBox->setFileName(originalFile); widgetBox->load(); //! [2] //! [3] if (widgetBox->filename() != "myWidgetBox.xml") { widgetBox->setFileName("myWidgetBox.xml"); widgetBox->load(); } //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_uilib_abstractformbuilder.cpp ================================================ //! [0] MyForm::MyForm(QWidget *parent) : QWidget(parent) { QFormBuilder builder; QFile file(":/forms/myWidget.ui"); file.open(QFile::ReadOnly); QWidget *myWidget = builder.load(&file, this); file.close(); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(myWidget); setLayout(layout); } //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_designer_src_lib_uilib_formbuilder.cpp ================================================ //! [0] MyForm::MyForm(QWidget *parent) : QWidget(parent) { QFormBuilder builder; QFile file(":/forms/myWidget.ui"); file.open(QFile::ReadOnly); QWidget *myWidget = builder.load(&file, this); file.close(); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(myWidget); setLayout(layout); } //! [0] //! [1] mywidget.ui //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_patternist_qapplicationargumentparser.cpp ================================================ //! [0] \include main.cpp //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_shared_qtgradienteditor_qtgradientdialog.cpp ================================================ //! [0] bool ok; QGradient gradient = QtGradientDialog::getGradient(&ok, QRadialGradient(), this); if (ok) { // the user clicked OK and gradient is set to the gradient the user selected } else { // the user canceled the dialog; gradient is set to the initial // value, in this case radial gradient } //! [0] //! [1] bool detailsVisible; QColor::Spec spec; QGradient gradient; QtGradientDialog dlg(this); dlg.setDetailsVisible(detailsVisible); dlg.setSpec(spec); dlg.setGradient(gradient); if (dlg.exec() != QDialog::Accepted) return; gradient = dlg.gradient(); // detailsVisible and spec properties can be changed interactively by the user too, // we store the values of these properties for the next time QtGradientDialog is executed. detailsVisible = dlg.detailsVisible(); spec = dlg.spec(); //! [1] //! [2] QtGradientDialog dlg; dlg.setBackgroundCheckered(true); //! [2] //! [3] QtGradientDialog dlg; dlg.setBackgroundCheckered(false); //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_shared_qtpropertybrowser_qtpropertybrowser.cpp ================================================ //! [0] QtSpinBoxFactory *factory; QSet managers = factory->propertyManagers(); //! [0] //! [1] QtBrowserItem *item; QList childrenItems = item->children(); QList childrenProperties = item->property()->subProperties(); //! [1] //! [2] QtProperty *property1, *property2, *property3; property2->addSubProperty(property1); property3->addSubProperty(property2); QtAbstractPropertyBrowser *editor; editor->addProperty(property1); editor->addProperty(property2); editor->addProperty(property3); //! [2] //! [3] QtIntPropertyManager *intManager; QtDoublePropertyManager *doubleManager; QtProperty *myInteger = intManager->addProperty(); QtProperty *myDouble = doubleManager->addProperty(); QtSpinBoxFactory *spinBoxFactory; QtDoubleSpinBoxFactory *doubleSpinBoxFactory; QtAbstractPropertyBrowser *editor; editor->setFactoryForManager(intManager, spinBoxFactory); editor->setFactoryForManager(doubleManager, doubleSpinBoxFactory); editor->addProperty(myInteger); editor->addProperty(myDouble); //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_shared_qtpropertybrowser_qtvariantproperty.cpp ================================================ //! [0] QtVariantPropertyManager *variantPropertyManager; QtProperty *property; variantPropertyManager->setValue(property, 10); //! [0] //! [1] QtVariantPropertyManager *variantPropertyManager; QtVariantProperty *property; property->setValue(10); //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/code/tools_shared_qttoolbardialog_qttoolbardialog.cpp ================================================ //! [0] QtToolBarManager *toolBarManager; void MyMainWindow::customize() { QtToolBarDialog dialog(this); dialog.setToolBarManager(toolBarManager); dialog.exec(); } //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/console/dbus_pingpong.txt ================================================ [qtuser@workstation:~/dev/qt-4.4/examples/dbus/pingpong]$ ./pong & [qtuser@workstation:~/dev/qt-4.4/examples/dbus/pingpong]$ ./ping Hello Reply was: ping("Hello") got called ================================================ FILE: doc/codesnippets/doc/src/snippets/coordsys/coordsys.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class MyWidget : public QWidget { public: MyWidget(); protected: void paintEvent(QPaintEvent *); }; MyWidget::MyWidget() { QPalette palette(MyWidget::palette()); palette.setColor(backgroundRole(), Qt::white); setPalette(palette); } void MyWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::darkGreen); painter.drawRect(1, 2, 6, 4); //painter.setPen(Qt::darkGray); //painter.drawLine(2, 8, 6, 2); } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/customstyle/customstyle.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "customstyle.h" CustomStyle::CustomStyle() { //! [0] if widget: //! [0] //! [1] //! [1] } //! [2] def drawPrimitive(element, option, painter, widget): if element == PE_IndicatorSpinUp or element == PE_IndicatorSpinDown: points = QPolygon(3) x = option->rect.x() y = option->rect.y() w = option->rect.width() / 2 h = option->rect.height() / 2 x += (option->rect.width() - w) / 2 y += (option->rect.height() - h) / 2 if element == PE_IndicatorSpinUp: points[0] = QPoint(x, y + h) points[1] = QPoint(x + w, y + h) points[2] = QPoint(x + w / 2, y) else: # PE_SpinBoxDown points[0] = QPoint(x, y) points[1] = QPoint(x + w, y) points[2] = QPoint(x + w / 2, y + h) if option.state & State_Enabled: painter.setPen(option.palette.mid().color()) painter.setBrush(option.palette.buttonText()) else: painter.setPen(option.palette.buttonText().color()) painter.setBrush(option.palette.mid()) painter.drawPolygon(points) else: QWindowsStyle.drawPrimitive(element, option, painter, widget) //! [2] //! [3] //! [3] //! [4] } //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/customstyle/customstyle.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef CUSTOMSTYLE_H #define CUSTOMSTYLE_H #include //! [0] class CustomStyle(QWindowsStyle): ... def drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const; # element : PrimitiveElement # option : QStyleOption # painter : QPainter # widget : QWidget ... //! [0] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/customstyle/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [using a custom style] #include #include "customstyle.h" int main(int argc, char *argv[]) { QApplication::setStyle(new CustomStyle); QApplication app(argc, argv); QSpinBox spinBox; spinBox.show(); return app.exec(); } //! [using a custom style] ================================================ FILE: doc/codesnippets/doc/src/snippets/customviewstyle.cpp ================================================ #include #include "customviewstyle.h" void CustomViewStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { //![0] switch (element) { case (PE_PanelItemViewItem): { painter->save(); QPoint topLeft = option->rect.topLeft(); QPoint bottomRight = option->rect.topRight(); QLinearGradient backgroundGradient(topLeft, bottomRight); backgroundGradient.setColorAt(0.0, QColor(Qt::yellow).lighter(190)); backgroundGradient.setColorAt(1.0, Qt::white); painter->fillRect(option->rect, QBrush(backgroundGradient)); painter->restore(); break; } default: QWindowsStyle::drawPrimitive(element, option, painter, widget); } //![0] } ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/autoconnection/imagedialog.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "imagedialog.h" ImageDialog::ImageDialog(QWidget *parent) : QDialog(parent) { setupUi(this); okButton->setAutoDefault(false); cancelButton->setAutoDefault(false); colorDepthCombo->addItem(tr("2 colors (1 bit per pixel)")); colorDepthCombo->addItem(tr("4 colors (2 bits per pixel)")); colorDepthCombo->addItem(tr("16 colors (4 bits per pixel)")); colorDepthCombo->addItem(tr("256 colors (8 bits per pixel)")); colorDepthCombo->addItem(tr("65536 colors (16 bits per pixel)")); colorDepthCombo->addItem(tr("16 million colors (24 bits per pixel)")); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); } void ImageDialog::on_okButton_clicked() { if (nameLineEdit->text().isEmpty()) (void) QMessageBox::information(this, tr("No Image Name"), tr("Please supply a name for the image."), QMessageBox::Cancel); else accept(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/autoconnection/imagedialog.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef IMAGEDIALOG_H #define IMAGEDIALOG_H #include "ui_imagedialog.h" //! [0] class ImageDialog : public QDialog, private Ui::ImageDialog { Q_OBJECT public: ImageDialog(QWidget *parent = 0); private slots: void on_okButton_clicked(); }; //! [0] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/autoconnection/imagedialog.ui ================================================ ImageDialog ImageDialog 0 0 320 180 Create Image 9 6 1 6 widthLabel 1 27 67 22 QFrame::NoFrame QFrame::Plain Width: Qt::AutoText heightLabel 1 55 67 22 QFrame::NoFrame QFrame::Plain Height: Qt::AutoText colorDepthCombo 74 83 227 22 5 0 0 0 QComboBox::InsertAtBottom nameLineEdit 74 83 227 22 5 0 1 0 Untitled image QLineEdit::Normal spinBox 74 1 227 20 5 0 0 0 QAbstractSpinBox::UpDownArrows 32 1024 1 spinBox_2 74 27 227 22 5 0 0 0 QAbstractSpinBox::UpDownArrows 32 1024 1 nameLabel 1 1 67 20 QFrame::NoFrame QFrame::Plain Name: Qt::AutoText colorDepthLabel 1 83 67 22 QFrame::NoFrame QFrame::Plain Color depth: Qt::AutoText 9 121 302 18 Qt::Vertical 1 6 1 1 128 24 Qt::Horizontal okButton 135 1 80 24 OK cancelButton 221 1 80 24 Cancel nameLineEdit spinBox spinBox_2 colorDepthCombo okButton cancelButton nameLineEdit returnPressed() okButton animateClick() -1 7 -1 7 ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/autoconnection/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "imagedialog.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); ImageDialog *dialog = new ImageDialog; dialog->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/imagedialog/imagedialog.ui ================================================ ImageDialog ImageDialog 0 0 320 180 Create Image 9 6 1 6 widthLabel 1 27 67 22 QFrame::NoFrame QFrame::Plain Width: Qt::AutoText heightLabel 1 55 67 22 QFrame::NoFrame QFrame::Plain Height: Qt::AutoText colorDepthCombo 74 83 227 22 5 0 0 0 QComboBox::InsertAtBottom nameLineEdit 74 83 227 22 5 0 1 0 Untitled image QLineEdit::Normal spinBox 74 1 227 20 5 0 0 0 QAbstractSpinBox::UpDownArrows 32 1024 1 spinBox_2 74 27 227 22 5 0 0 0 QAbstractSpinBox::UpDownArrows 32 1024 1 nameLabel 1 1 67 20 QFrame::NoFrame QFrame::Plain Name: Qt::AutoText colorDepthLabel 1 83 67 22 QFrame::NoFrame QFrame::Plain Color depth: Qt::AutoText 9 121 302 18 Qt::Vertical 1 6 1 1 128 24 Qt::Horizontal okButton 135 1 80 24 OK cancelButton 221 1 80 24 Cancel nameLineEdit spinBox spinBox_2 colorDepthCombo okButton cancelButton nameLineEdit returnPressed() okButton animateClick() -1 7 -1 7 ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/imagedialog/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "ui_imagedialog.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QDialog *window = new QDialog; Ui::ImageDialog ui; ui.setupUi(window); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/multipleinheritance/imagedialog.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "imagedialog.h" ImageDialog::ImageDialog(QWidget *parent) : QDialog(parent) { setupUi(this); colorDepthCombo->addItem(tr("2 colors (1 bit per pixel)")); colorDepthCombo->addItem(tr("4 colors (2 bits per pixel)")); colorDepthCombo->addItem(tr("16 colors (4 bits per pixel)")); colorDepthCombo->addItem(tr("256 colors (8 bits per pixel)")); colorDepthCombo->addItem(tr("65536 colors (16 bits per pixel)")); colorDepthCombo->addItem(tr("16 million colors (24 bits per pixel)")); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); } ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/multipleinheritance/imagedialog.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef IMAGEDIALOG_H #define IMAGEDIALOG_H #include "ui_imagedialog.h" class ImageDialog : public QDialog, private Ui::ImageDialog { Q_OBJECT public: ImageDialog(QWidget *parent = 0); }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/multipleinheritance/imagedialog.ui ================================================ ImageDialog ImageDialog 0 0 320 180 Create Image 9 6 1 6 widthLabel 1 27 67 22 QFrame::NoFrame QFrame::Plain Width: Qt::AutoText heightLabel 1 55 67 22 QFrame::NoFrame QFrame::Plain Height: Qt::AutoText colorDepthCombo 74 83 227 22 5 0 0 0 QComboBox::InsertAtBottom nameLineEdit 74 83 227 22 5 0 1 0 Untitled image QLineEdit::Normal spinBox 74 1 227 20 5 0 0 0 QAbstractSpinBox::UpDownArrows 32 1024 1 spinBox_2 74 27 227 22 5 0 0 0 QAbstractSpinBox::UpDownArrows 32 1024 1 nameLabel 1 1 67 20 QFrame::NoFrame QFrame::Plain Name: Qt::AutoText colorDepthLabel 1 83 67 22 QFrame::NoFrame QFrame::Plain Color depth: Qt::AutoText 9 121 302 18 Qt::Vertical 1 6 1 1 128 24 Qt::Horizontal okButton 135 1 80 24 OK cancelButton 221 1 80 24 Cancel nameLineEdit spinBox spinBox_2 colorDepthCombo okButton cancelButton nameLineEdit returnPressed() okButton animateClick() -1 7 -1 7 ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/multipleinheritance/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "imagedialog.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); ImageDialog *dialog = new ImageDialog; dialog->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/noautoconnection/imagedialog.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "imagedialog.h" //! [0] ImageDialog::ImageDialog(QWidget *parent) : QDialog(parent) { setupUi(this); okButton->setAutoDefault(false); cancelButton->setAutoDefault(false); //! [0] colorDepthCombo->addItem(tr("2 colors (1 bit per pixel)")); colorDepthCombo->addItem(tr("4 colors (2 bits per pixel)")); colorDepthCombo->addItem(tr("16 colors (4 bits per pixel)")); colorDepthCombo->addItem(tr("256 colors (8 bits per pixel)")); colorDepthCombo->addItem(tr("65536 colors (16 bits per pixel)")); colorDepthCombo->addItem(tr("16 million colors (24 bits per pixel)")); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); //! [1] connect(okButton, SIGNAL(clicked()), this, SLOT(checkValues())); } //! [1] //! [2] void ImageDialog::checkValues() { if (nameLineEdit->text().isEmpty()) (void) QMessageBox::information(this, tr("No Image Name"), tr("Please supply a name for the image."), QMessageBox::Cancel); else accept(); } //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/noautoconnection/imagedialog.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef IMAGEDIALOG_H #define IMAGEDIALOG_H #include "ui_imagedialog.h" //! [0] class ImageDialog : public QDialog, private Ui::ImageDialog { Q_OBJECT public: ImageDialog(QWidget *parent = 0); private slots: void checkValues(); }; //! [0] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/noautoconnection/imagedialog.ui ================================================ ImageDialog ImageDialog 0 0 320 180 Create Image 9 6 1 6 widthLabel 1 27 67 22 QFrame::NoFrame QFrame::Plain Width: Qt::AutoText heightLabel 1 55 67 22 QFrame::NoFrame QFrame::Plain Height: Qt::AutoText colorDepthCombo 74 83 227 22 5 0 0 0 QComboBox::InsertAtBottom nameLineEdit 74 83 227 22 5 0 1 0 Untitled image QLineEdit::Normal spinBox 74 1 227 20 5 0 0 0 QAbstractSpinBox::UpDownArrows 32 1024 1 spinBox_2 74 27 227 22 5 0 0 0 QAbstractSpinBox::UpDownArrows 32 1024 1 nameLabel 1 1 67 20 QFrame::NoFrame QFrame::Plain Name: Qt::AutoText colorDepthLabel 1 83 67 22 QFrame::NoFrame QFrame::Plain Color depth: Qt::AutoText 9 121 302 18 Qt::Vertical 1 6 1 1 128 24 Qt::Horizontal okButton 135 1 80 24 OK cancelButton 221 1 80 24 Cancel nameLineEdit spinBox spinBox_2 colorDepthCombo okButton cancelButton nameLineEdit returnPressed() okButton animateClick() -1 7 -1 7 ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/noautoconnection/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "imagedialog.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); ImageDialog *dialog = new ImageDialog; dialog->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/singleinheritance/imagedialog.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "imagedialog.h" ImageDialog::ImageDialog(QWidget *parent) : QDialog(parent) { ui.setupUi(this); ui.colorDepthCombo->addItem(tr("2 colors (1 bit per pixel)")); ui.colorDepthCombo->addItem(tr("4 colors (2 bits per pixel)")); ui.colorDepthCombo->addItem(tr("16 colors (4 bits per pixel)")); ui.colorDepthCombo->addItem(tr("256 colors (8 bits per pixel)")); ui.colorDepthCombo->addItem(tr("65536 colors (16 bits per pixel)")); ui.colorDepthCombo->addItem(tr("16 million colors (24 bits per pixel)")); connect(ui.okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(reject())); } ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/singleinheritance/imagedialog.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef IMAGEDIALOG_H #define IMAGEDIALOG_H #include "ui_imagedialog.h" class ImageDialog : public QDialog { Q_OBJECT public: ImageDialog(QWidget *parent = 0); private: Ui::ImageDialog ui; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/singleinheritance/imagedialog.ui ================================================ ImageDialog ImageDialog 0 0 320 180 Create Image 9 6 1 6 widthLabel 1 27 67 22 QFrame::NoFrame QFrame::Plain Width: Qt::AutoText heightLabel 1 55 67 22 QFrame::NoFrame QFrame::Plain Height: Qt::AutoText colorDepthCombo 74 83 227 22 5 0 0 0 QComboBox::InsertAtBottom nameLineEdit 74 83 227 22 5 0 1 0 Untitled image QLineEdit::Normal spinBox 74 1 227 20 5 0 0 0 QAbstractSpinBox::UpDownArrows 32 1024 1 spinBox_2 74 27 227 22 5 0 0 0 QAbstractSpinBox::UpDownArrows 32 1024 1 nameLabel 1 1 67 20 QFrame::NoFrame QFrame::Plain Name: Qt::AutoText colorDepthLabel 1 83 67 22 QFrame::NoFrame QFrame::Plain Color depth: Qt::AutoText 9 121 302 18 Qt::Vertical 1 6 1 1 128 24 Qt::Horizontal okButton 135 1 80 24 OK cancelButton 221 1 80 24 Cancel nameLineEdit spinBox spinBox_2 colorDepthCombo okButton cancelButton nameLineEdit returnPressed() okButton animateClick() -1 7 -1 7 ================================================ FILE: doc/codesnippets/doc/src/snippets/designer/singleinheritance/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "imagedialog.h" #include int main(int argc, char *argv[]) { QApplication app(argc, argv); ImageDialog *dialog = new ImageDialog; dialog->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/dialogs/dialogs.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] def find(self) if !self.findDialog: self.findDialog = FindDialog(self) connect(findDialog, SIGNAL("findNext()"), self, SLOT("findNext()")) self.findDialog.show() self.findDialog.raise() self.findDialog.activateWindow() //! [0] //! [1] def countWords(self): dialog = WordCountDialog(self) dialog.setWordCount(document().wordCount()) dialog.exec_() //! [1] //! [2] mb = QMessageBox("Application Name", "Hardware failure.\n\nDisk error detected\nDo you want to stop?", QMessageBox.Question, QMessageBox.Yes | QMessageBox.Default, QMessageBox.No | QMessageBox.Escape, QMessageBox.NoButton) if mb.exec() == QMessageBox.No: # try again //! [2] //! [3] progress = QProgressDialog("Copying files...", "Abort Copy", 0, numFiles, self) progress.setWindowModality(Qt.WindowModal) for i in rang(numFiles): progress.setValue(i) if progress.wasCanceled(): break #... copy one file progress.setValue(numFiles) //! [3] //! [4] # Operation constructor def __init__(self, parent): QObject.__init__(self, parent) pd = QProgressDialog("Operation in progress.", "Cancel", 0, 100) connect(pd, SIGNAL("canceled()"), self, SLOT("cancel()")) t = QTimer(self) connect(t, SIGNAL("timeout()"), self, SLOT("perform()")) t.start(0) //! [4] //! [5] def perform(self): pd.setValue(steps) #... perform one percent of the operation steps++ if steps > pd.maximum(): t.stop() //! [5] //! [6] def cancel(self): t.stop() #... cleanup //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/Resources/modules.html ================================================ Qt 4.0: Qt Classes by Module

Qt Classes by Module

QtCoreCore classes used by other modules.
QtGuiGraphical User Interface components
QtNetworkClasses for network programming.
QtOpenGLOpenGL support classes.
QtSqlClasses for database integration using SQL.
QtXmlClasses for handling XML.
================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/Resources/qtcore.html ================================================ Qt 4.0: QtCore Classes

QtCore Classes

QAbstractEventDispatcherManages Qt's event queue, excluding GUI-related events
QAbstractItemModelThe abstract interface for item model classes
QAbstractListModelAbstract model that can be subclassed to create one-dimensional list models
QAbstractTableModelAbstract model that can be subclassed to create table models
QBasicTimerTimer events for
QBitArrayArray of bits
QBufferQIODevice interface for a QByteArray
QByteArrayArray of bytes
QByteArrayMatcherHolds a sequence of bytes that can be quickly matched in a byte array
QCacheTemplate class that provides a cache
QChar16-bit Unicode character
QChildEventEvent parameters for child object events
QCoreApplicationEvent loop for Qt applications
QCustomEventSupport for custom events
QDataStreamSerialization of binary data to a QIODevice
QDateDate functions
QDateTimeDate and time functions
QDirAccess to directory structures and their contents
QEventThe base class of all event classes. Event objects contain event parameters
QFileInterface for reading from and writing to files
QFileEngineAbstraction for accessing the filesystem
QFileEngineHandlerAllows custom QFileEngines to be plugged into Qt
QFileInfoSystem-independent file information
QHashTemplate class that provides a hash-table-based dictionary
QIODeviceThe base interface class of all I/O devices in Qt
QLatin1Char8-bit ASCII/Latin-1 character
QLatin1StringThin wrapper around an ASCII/Latin-1 encoded string literal
QLibraryLoads shared libraries at runtime
QLibraryInfoInformation about the Qt library
QLineTwo-dimensional vector that uses integer point coordinates for accuracy
QLineFTwo-dimensional vector that uses floating point coordinates for accuracy
QLinkedListTemplate class that provides linked lists
QListTemplate class that provides lists
QLocaleConverts between numbers and their string representations in various languages
QMapTemplate class that provides a skip-list-based dictionary
QMetaClassInfoAdditional information about a class
QMetaEnumMeta data about an enumerator
QMetaMemberMeta data about a member function
QMetaObjectMeta information about Qt objects
QMetaPropertyMeta data about a property
QMetaTypeManages named types in the meta object system
QMimeDataContainer for data that records information about its MIME type
QModelIndexUsed to locate data in a data model
QMultiHashConvenience QHash subclass that provides multi-valued hashes
QMultiMapConvenience QMap subclass that provides multi-valued maps
QMutexAccess serialization between threads
QMutexLockerConvenience class that simplifies locking and unlocking mutexes
QObjectThe base class of all Qt objects
QObjectCleanupHandlerWatches the lifetime of multiple QObjects
QPairTemplate class that stores a pair of items
QPersistentModelIndexUsed to locate data in a data model
QPluginLoaderLoads a plugin at runtime
QPointDefines a point in the plane
QPointFPoint object that uses floating point coordinates for accuracy
QPointerTemplate class that provides guarded pointers to QObjects
QProcessUsed to start external programs and to communicate with them
QQueueGeneric container that provides a queue
QReadLockerConvenience class that simplifies locking and unlocking read-write locks for read access
QReadWriteLockRead-write locking
QRectDefines a rectangle in the plane
QRectFDefines a rectangle in the plane using floating point coordinates for accuracy
QRegExpPattern matching using regular expressions
QResourceAccess to application resource data
QSemaphoreGeneral counting semaphore
QSetTemplate class that provides a hash-table-based set
QSettingsPersistent platform-independent application settings
QSharedDataBase class for shared data objects
QSharedDataPointerPointer to a shared data object
QSignalCan be used to send signals for classes that do not inherit QObject
QSignalMapperBundles signals from identifiable senders
QSizeDefines the size of a two-dimensional object
QSizeFDefines the size of a two-dimensional object using floating point values for accuracy
QSocketNotifierSupport for monitoring activity on a file descriptor
QStackTemplate class that provides a stack
QStringUnicode character string
QStringListList of strings
QTemporaryFileI/O device that operates on temporary files
QTextCodecConversions between text encodings
QTextCodecPluginAbstract base for custom QTextCodec plugins
QTextDecoderState-based decoder
QTextEncoderState-based encoder
QTextIStreamConvenience class for input streams
QTextOStreamConvenience class for output streams
QTextStreamConvenient interface for reading and writing text
QThreadPlatform-independent threads
QThreadStoragePer-thread data storage
QTimeClock time functions
QTimerRepetitive and single-shot timers
QTimerEventParameters that describe a timer event
QTranslatorInternationalization support for text output
QTranslatorMessageTranslator message and its properties
QTsciiCodecConversion to and from the Tamil TSCII encoding
QUrlConvenient interface for working with URLs
QUuidDefines a Universally Unique Identifier (UUID)
QVarLengthArrayLow-level variable-length array
QVariantActs like a union for the most common Qt data types
QVectorTemplate class that provides a dynamic array
QWaitConditionCondition variable for synchronizing threads
QWriteLockerConvenience class that simplifies locking and unlocking read-write locks for write access

================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/Resources/qtgui.html ================================================ Qt 4.0: QtGui Classes

QtGui Classes

QAbstractButtonThe abstract base class of button widgets, providing functionality common to buttons
QAbstractItemDelegateUsed to display and edit data items from a model
QAbstractItemViewThe basic functionality for item view classes
QAbstractScrollAreaScrolling area with on-demand scroll bars
QAbstractSliderInteger value within a range
QAbstractSpinBoxSpinwidget and a line edit to display values
QAbstractTextDocumentLayoutAbstract base class used to implement custom layouts for QTextDocuments
QAccessibleEnums and static functions relating to accessibility
QAccessibleInterfaceDefines an interface that exposes information about accessible objects
QAccessibleObjectImplements parts of the QAccessibleInterface for QObjects
QAccessiblePluginAbstract base for accessibility plugins
QAccessibleWidgetImplements the QAccessibleInterface for QWidgets
QActionAbstract user interface action that can be inserted into widgets with QWidget::addAction()
QActionGroupGroups actions together
QApplicationManages the GUI application's control flow and main settings
QBitmapMonochrome (1-bit depth) pixmaps
QBoxLayoutLines up child widgets horizontally or vertically
QBrushDefines the fill pattern of shapes drawn by a QPainter
QButtonGroupContainer to organize groups of button widgets
QCDEStyleCDE look and feel
QCheckBoxCheckbox with a text label
QClipboardAccess to the window system clipboard
QCloseEventParameters that describe a close event
QColorColors based on RGB or HSV values
QColorDialogDialog widget for specifying colors
QColorGroup
QComboBoxCombined button and popup list
QCommonStyleEncapsulates the common Look and Feel of a GUI
QConicalGradientUsed in combination with QBrush to specify a conical gradient brush
QContextMenuEventParameters that describe a context menu event
QCopChannelCommunication capabilities between several clients
QCursorMouse cursor with an arbitrary shape
QDateTimeEditWidget for editing dates and times
QDecorationAllows the appearance of the Qtopia Core Window Manager to be customized
QDecorationFactoryCreates QDecoration objects
QDecorationPluginAbstract base for custom QDecoration plugins
QDesktopWidgetAccess to screen information on multi-head systems
QDialRounded range control (like a speedometer or potentiometer)
QDialogThe base class of dialog windows
QDirModelData model for the local filesystem
QDirectPainterDirect access to the video hardware
QDockWidgetWidget that can be docked inside a QMainWindow or floated as a top-level window on the desktop
QDoubleSpinBoxSpin box widget that takes doubles
QDoubleValidatorRange checking of floating-point numbers
QDragSupport for MIME-based drag and drop data transfer
QDragEnterEventEvent which is sent to a widget when a drag and drop action enters it
QDragLeaveEventEvent that is sent to a widget when a drag and drop action leaves it
QDragMoveEventEvent which is sent while a drag and drop action is in progress
QDropEventEvent which is sent when a drag and drop action is completed
QErrorMessageError message display dialog
QFileDialogDialog that allow users to select files or directories
QFileIconProviderFile icon for the QDirModel class
QFileOpenEventEvent that will be sent when there is a request to open a file
QFocusEventEvent parameters for widget focus events
QFocusFrameFocus frame which can be outside of a widget's normal paintable area
QFontFont used for drawing text
QFontDatabaseInformation about the fonts available in the underlying window system
QFontDialogDialog widget for selecting a font
QFontInfoGeneral information about fonts
QFontMetricsFont metrics information
QFontMetricsFFont metrics information
QFrameThe base class of widgets that can have a frame
QGfxDriverFactoryCreates QScreen objects for Qtopia Core
QGfxDriverPluginAbstract base for Qtopia Core graphics driver plugins
QGradientUsed in combination with QBrush to specify gradient fills
QGridLayoutLays out widgets in a grid
QGridWidgetSimple geometry management of its children
QGroupBoxGroup box frame with a title
QHBoxLayoutLines up widgets horizontally
QHBoxWidgetHorizontal geometry management for its child widgets
QHeaderViewHeader row or header column for item views
QHideEventEvent which is sent after a widget is hidden
QHoverEventParameters that describe a mouse event
QIconScalable icons in different modes and states
QIconDragEventIndicates that a main icon drag has begun
QIconEngineAbstract base class for QIcon renderers
QIconEnginePluginAbstract base for custom QIconEngine plugins
QImageHardware-independent pixmap that allows direct access to the pixel data, and can be used as a paint device
QImageIOHandlerDefines the common image I/O interface for all image formats in Qt
QImageIOHandlerFactoryInterfaceThe factory interface for QImageIOPlugin
QImageIOPluginDefines an interface for writing an image format plugin
QImageReaderFormat independent interface for reading images from files or other devices
QImageWriterFormat independent interface for writing images to files or other devices
QInputContextAbstracts the input method dependent data and composing state
QInputContextPluginAbstract base for custom QInputContext plugins
QInputDialogSimple convenience dialog to get a single value from the user
QInputEventThe base class for events that describe user input
QInputMethodEventParameters for input method events
QIntValidatorValidator that ensures a string contains a valid integer within a specified range
QItemDelegateDisplay and editing facilities for data items from a model
QItemSelectionManages information about selected items in a model
QItemSelectionModelKeeps track of a view's selected items
QItemSelectionRangeManages information about a range of selected items in a model
QKbdDriverFactoryCreates QWSKeyboardHandler objects for Qtopia Core
QKbdDriverPluginAbstract base for Qtopia Core keyboard driver plugins
QKeyEventDescribes a key event
QKeySequenceEncapsulates a key sequence as used by shortcuts
QLCDNumberDisplays a number with LCD-like digits
QLabelText or image display
QLayoutThe base class of geometry managers
QLayoutItemAbstract item that a QLayout manipulates
QLineEditOne-line text editor
QLinearGradientUsed in combination with QBrush to specify a linear gradient brush
QListViewDefault model/view implementation of a list, and of an icon view
QListWidgetItem-based list widget
QListWidgetItemItem for use with the QListWidget item view class
QMacMimeMaps open-standard MIME to Mac flavors
QMacStyleImplements an Appearance Manager style
QMainWindowMain application window
QMatrix2D transformations of a coordinate system
QMenuMenu widget for use in menu bars, context menus, and other popup menus
QMenuBarHorizontal menu bar
QMenuItemRepresents an item in a menu
QMessageBoxModal dialog with a short message, an icon, and some buttons
QMotifPlusStyleMore sophisticated Motif-ish look and feel
QMotifStyleMotif look and feel
QMouseDriverFactoryCreates QWSMouseHandler objects for Qtopia Core
QMouseDriverPluginAbstract base for Qtopia Core mouse driver plugins
QMouseEventParameters that describe a mouse event
QMoveEventEvent parameters for move events
QMovieConvenience class for playing movies with QImageReader
QPaintDeviceThe base class of objects that can be painted
QPaintEngineAbstract definition of how QPainter draws to a given device on a given platform
QPaintEventEvent parameters for paint events
QPainterDoes low-level painting e.g. on widgets
QPainterPathContainer for painting operations, enabling graphical shapes to be constructed and reused
QPaletteColor groups for each widget state
QPenDefines how a QPainter should draw lines and outlines of shapes
QPicturePaint device that records and replays QPainter commands
QPictureFormatPluginAbstract base for custom picture format plugins
QPictureIOParameters for loading and saving pictures
QPixmapOff-screen, pixel-based paint device
QPixmapCacheApplication-wide cache for pixmaps
QPlatinumStyleMac/Platinum look and feel
QPolygonVector of points
QPolygonFVector of points
QPrintEngineDefines an interface for how QPrinter interacts with a given printing subsystem
QPrinterPaint device that paints on a printer
QProgressBarHorizontal progress bar
QProgressDialogFeedback on the progress of a slow operation
QProxyModelSupport for filtering and sorting data that is passed between another model and a view
QPushButtonCommand button
QRadialGradientUsed in combination with QBrush to specify a radial gradient brush
QRadioButtonRadio button with a text label
QRegExpValidatorUsed to check a string against a regular expression
QRegionClip region for a painter
QResizeEventEvent parameters for resize events
QRubberBandRectangle or line that can indicate a selection or a boundary
QSGIStyleSGI/Irix look and feel
QScreenAnd its descendants manage the framebuffer and palette
QScrollAreaScrolling view onto another widget
QScrollBarVertical or horizontal scroll bar
QSessionManagerAccess to the session manager
QShortcutUsed to create keyboard shortcuts
QShowEventEvent that is sent when a widget is shown
QSizeGripCorner-grip for resizing a top-level window
QSizePolicyLayout attribute describing horizontal and vertical resizing policy
QSliderVertical or horizontal slider
QSoundAccess to the platform audio facilities
QSpacerItemBlank space in a layout
QSpinBoxSpin box widget
QSplashScreenSplash screen that can be shown during application startup
QSplitterImplements a splitter widget
QSplitterHandleHandle functionality of the splitter
QStackedLayoutStack of widgets where only one widget is visible at a time
QStackedWidgetStack of widgets where only one widget is visible at a time
QStandardItemModel
QStatusBarHorizontal bar suitable for presenting status information
QStyleAbstract base class that encapsulates the look and feel of a GUI
QStyleFactoryCreates QStyle objects
QStyleHintReturn
QStyleOptionStores the parameters used by QStyle functions
QStyleOptionButtonUsed to describe the parameters for drawing buttons
QStyleOptionComboBoxUsed to describe the parameter for drawing a combobox
QStyleOptionComplexUsed to hold parameters that are common to all complex controls
QStyleOptionDockWidgetUsed to describe the parameters for drawing a dock window
QStyleOptionFocusRectUsed to describe the parameters for drawing a focus rectangle with QStyle
QStyleOptionFrameUsed to describe the parameters for drawing a frame
QStyleOptionHeaderUsed to describe the parameters for drawing a header
QStyleOptionMenuItemUsed to describe the parameter necessary for drawing a menu item
QStyleOptionProgressBarUsed to describe the parameters necessary for drawing a progress bar
QStyleOptionQ3DockWindowUsed to describe the parameters for drawing various parts of a
QStyleOptionQ3ListViewUsed to describe the parameters for drawing a Q3ListView
QStyleOptionQ3ListViewItemUsed to describe an item drawn in a Q3ListView
QStyleOptionSliderUsed to describe the parameters needed for drawing a slider
QStyleOptionSpinBoxUsed to describe the parameters necessary for drawing a spin box
QStyleOptionTabUsed to describe the parameters for drawing a tab bar
QStyleOptionTitleBarUsed to describe the parameters for drawing a title bar
QStyleOptionToolBoxUsed to describe the parameters needed for drawing a tool box
QStyleOptionToolButtonUsed to describe the parameters for drawing a tool button
QStyleOptionViewItemUsed to describe the parameters used to draw an item in a view widget
QStylePainterConvenience class for drawing QStyle elements inside a widget
QStylePluginAbstract base for custom QStyle plugins
QTabBarTab bar, e.g. for use in tabbed dialogs
QTabWidgetStack of tabbed widgets
QTableViewDefault model/view implementation of a table view
QTableWidgetItem-based table view with a default model
QTableWidgetItemItem for use with the QTableWidget class
QTableWidgetSelectionRange
QTabletEventParameters that describe a Tablet event
QTextBlockContainer for text fragments in a QTextDocument
QTextBlockFormatFormatting information for blocks of text in a QTextDocument
QTextBlockGroupContainer for text blocks within a QTextDocument
QTextBrowserRich text browser with hypertext navigation
QTextCharFormatFormatting information for characters in a QTextDocument
QTextCursorOffers an API to access and modify QTextDocuments
QTextDocumentHolds formatted text that can be viewed and edited using a QTextEdit
QTextDocumentFragmentRepresents a piece of formatted text from a QTextDocument
QTextEditWidget that is used to edit and display both plain and rich text
QTextFormatFormatting information for a QTextDocument
QTextFragmentHolds a piece of text in a QTextDocument with a single QTextCharFormat
QTextFrameRepresents a frame in a QTextDocument
QTextFrameFormatFormatting information for frames in a QTextDocument
QTextImageFormatFormatting information for images in a QTextDocument
QTextInlineObjectRepresents an inline object in a QTextLayout
QTextLayoutUsed to lay out and paint a single paragraph of text
QTextLengthEncapsulates the different types of length used in a QTextDocument
QTextLineRepresents a line of text inside a QTextLayout
QTextListDecorated list of items in a QTextDocument
QTextListFormatFormatting information for lists in a QTextDocument
QTextObjectBase class for different kinds of objects that can group parts of a QTextDocument together
QTextOptionDescription of general rich text properties
QTextTableRepresents a table in a QTextDocument
QTextTableCellRepresents the properties of a cell in a QTextTable
QTextTableFormatFormatting information for tables in a QTextDocument
QToolBarMovable panel that contains a set of controls
QToolBarChangeEventEvent that is sent whenever a the toolbar button is clicked on Mac OS X
QToolBoxColumn of tabbed widget items
QToolButtonQuick-access button to commands or options, usually used inside a QToolBar
QToolTipTool tips (balloon help) for any widget
QTreeViewDefault model/view implementation of a tree view
QTreeWidgetTree view that uses a predefined tree model
QTreeWidgetItemItem for use with the QTreeWidget convenience class
QVBoxLayoutLines up widgets vertically
QVBoxWidgetVertical geometry management of its child widgets
QValidatorValidation of input text
QWSInputMethodInternational input methods for Qtopia Core
QWSKeyboardHandlerImplements the keyboard driver for Qtopia Core
QWSMouseHandlerMouse driver for Qtopia Core
QWSServerServer-specific functionality in Qtopia Core
QWSWindowServer-specific functionality in Qtopia Core
QWhatsThisSimple description of any widget, i.e. answering the question "What's this?"
QWhatsThisActionReady-made action to invoke "What's This" context help
QWheelEventParameters that describe a wheel event
QWidgetThe base class of all user interface objects
QWidgetContainerPluginAbstract base for complex custom container QWidget plugins
QWidgetItemLayout item that represents a widget
QWidgetPluginAbstract base for custom QWidget plugins
QWindowsMimeMaps open-standard MIME to Window Clipboard formats
QWindowsStyleMicrosoft Windows-like look and feel
QWindowsXPStyleMicrosoft WindowsXP-like look and feel
QWorkspaceWorkspace window that be used in an MDI application
QX11InfoInformation about the X display configuration

================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/Resources/qtnetwork.html ================================================ Qt 4.0: QtNetwork Classes

QtNetwork Classes

QAbstractSocketThe base functionality common to all socket types
QFtpImplementation of the FTP protocol
QHostAddressIP address
QHostInfoStatic functions for host name lookups
QHttpImplementation of the HTTP protocol
QHttpHeaderHeader information for HTTP
QHttpRequestHeaderRequest header information for HTTP
QHttpResponseHeaderResponse header information for HTTP
QTcpServerTCP-based server
QTcpSocketTCP socket
QUdpSocketUDP socket
QUrlInfoStores information about URLs

================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/Resources/qtopengl.html ================================================ Qt 4.0: QtOpenGL Classes

QtOpenGL Classes

QGLColormapUsed for installing custom colormaps into QGLWidgets
QGLContextEncapsulates an OpenGL rendering context
QGLFormatThe display format of an OpenGL rendering context
QGLWidgetWidget for rendering OpenGL graphics

================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/Resources/qtsql.html ================================================ Qt 4.0: QtSql Classes

QtSql Classes

QSqlDatabaseRepresents a connection to a database
QSqlDriverAbstract base class for accessing specific SQL databases
QSqlDriverCreatorTemplate class that provides a SQL driver factory for a specific driver type
QSqlDriverCreatorBaseThe base class for SQL driver factories
QSqlDriverPluginAbstract base for custom QSqlDriver plugins
QSqlErrorSQL database error information
QSqlFieldManipulates the fields in SQL database tables and views
QSqlIndexFunctions to manipulate and describe database indexes
QSqlQueryMeans of executing and manipulating SQL statements
QSqlQueryModelRead-only data model for SQL result sets
QSqlRecordEncapsulates a database record
QSqlRelationStores information about an SQL foreign key
QSqlRelationalDelegate
QSqlRelationalTableModelEditable data model for a single database table, with foreign key support
QSqlResultAbstract interface for accessing data from specific SQL databases
QSqlTableModelEditable data model for a single database table

================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/Resources/qtxml.html ================================================ Qt 4.0: QtXml Classes

QtXml Classes

QDomAttrRepresents one attribute of a QDomElement
QDomCDATASectionRepresents an XML CDATA section
QDomCharacterDataRepresents a generic string in the DOM
QDomCommentRepresents an XML comment
QDomDocumentRepresents an XML document
QDomDocumentFragmentTree of QDomNodes which is not usually a complete QDomDocument
QDomDocumentTypeThe representation of the DTD in the document tree
QDomElementRepresents one element in the DOM tree
QDomEntityRepresents an XML entity
QDomEntityReferenceRepresents an XML entity reference
QDomImplementationInformation about the features of the DOM implementation
QDomNamedNodeMapCollection of nodes that can be accessed by name
QDomNodeThe base class for all the nodes in a DOM tree
QDomNodeListList of QDomNode objects
QDomNotationRepresents an XML notation
QDomProcessingInstructionRepresents an XML processing instruction
QDomTextRepresents text data in the parsed XML document
QXmlAttributesXML attributes
QXmlContentHandlerInterface to report the logical content of XML data
QXmlDTDHandlerInterface to report DTD content of XML data
QXmlDeclHandlerInterface to report declaration content of XML data
QXmlDefaultHandlerDefault implementation of all the XML handler classes
QXmlEntityResolverInterface to resolve external entities contained in XML data
QXmlErrorHandlerInterface to report errors in XML data
QXmlInputSourceThe input data for the QXmlReader subclasses
QXmlLexicalHandlerInterface to report the lexical content of XML data
QXmlLocatorThe XML handler classes with information about the parsing position within a file
QXmlNamespaceSupportHelper class for XML readers which want to include namespace support
QXmlParseExceptionUsed to report errors with the QXmlErrorHandler interface
QXmlReaderInterface for XML readers (i.e. parsers)
QXmlSimpleReaderImplementation of a simple XML parser

================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/Resources/titles.txt ================================================ Qt Classes by Module :/Resources/modules.html QtCore :/Resources/qtcore.html QtGui :/Resources/qtgui.html QtNetwork :/Resources/qtnetwork.html QtOpenGL :/Resources/qtopengl.html QtSql :/Resources/qtsql.html QtXml :/Resources/qtxml.html ================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/dockwidgets.qrc ================================================ Resources/titles.txt Resources/modules.html Resources/qtcore.html Resources/qtgui.html Resources/qtnetwork.html Resources/qtopengl.html Resources/qtsql.html Resources/qtxml.html ================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow *window = new MainWindow; window->show(); window->resize(640, 480); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle("Dock Widgets"); setupDockWindow(); setupContents(); setupMenus(); textBrowser = new QTextBrowser(this); connect(headingList, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(updateText(QListWidgetItem *))); updateText(headingList->item(0)); headingList->setCurrentRow(0); setCentralWidget(textBrowser); } void MainWindow::setupContents() { QFile titlesFile(":/Resources/titles.txt"); titlesFile.open(QFile::ReadOnly); int chapter = 0; do { QString line = titlesFile.readLine().trimmed(); QStringList parts = line.split("\t", QString::SkipEmptyParts); if (parts.size() != 2) break; QString chapterTitle = parts[0]; QString fileName = parts[1]; QFile chapterFile(fileName); chapterFile.open(QFile::ReadOnly); QListWidgetItem *item = new QListWidgetItem(chapterTitle, headingList); item->setData(Qt::DisplayRole, chapterTitle); item->setData(Qt::UserRole, chapterFile.readAll()); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); chapterFile.close(); chapter++; } while (titlesFile.isOpen()); titlesFile.close(); } void MainWindow::setupDockWindow() { //! [0] contentsWindow = QDockWidget(tr("Table of Contents"), self) contentsWindow.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) addDockWidget(Qt.LeftDockWidgetArea, contentsWindow) headingList = QListWidget(contentsWindow) contentsWindow.setWidget(headingList) //! [0] } void MainWindow::setupMenus() { QAction *exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcut(tr("Ctrl+Q")); exitAct->setStatusTip(tr("Exit the application")); connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); QMenu *fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(exitAct); } void MainWindow::updateText(QListWidgetItem *item) { QString text = item->data(Qt::UserRole).toString(); textBrowser->setHtml(text); } ================================================ FILE: doc/codesnippets/doc/src/snippets/dockwidgets/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include class QDockWidget; class QListWidget; class QListWidgetItem; class QTextBrowser; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); private slots: void updateText(QListWidgetItem *item); private: void setupContents(); void setupDockWindow(); void setupMenus(); QDockWidget *contentsWindow; QListWidget *headingList; QTextBrowser *textBrowser; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/draganddrop/dragwidget.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "dragwidget.h" DragWidget::DragWidget(QWidget *parent) : QFrame(parent) { setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); dragDropLabel = new QLabel("", this); dragDropLabel->setAlignment(Qt::AlignHCenter); QHBoxLayout *layout = new QHBoxLayout(this); layout->addStretch(0); layout->addWidget(dragDropLabel); layout->addStretch(0); setAcceptDrops(true); } // Accept all actions, but deal with them separately later. //! [0] void DragWidget::dragEnterEvent(QDragEnterEvent *event) { event->acceptProposedAction(); } //! [0] //! [1] void DragWidget::dropEvent(QDropEvent *event) { if (event->source() == this && event->possibleActions() & Qt::MoveAction) return; //! [1] //! [2] if (event->proposedAction() == Qt::MoveAction) { event->acceptProposedAction(); // Process the data from the event. //! [2] emit dragResult(tr("The data was moved here.")); //! [3] } else if (event->proposedAction() == Qt::CopyAction) { event->acceptProposedAction(); // Process the data from the event. //! [3] emit dragResult(tr("The data was copied here.")); //! [4] } else { // Ignore the drop. return; } //! [4] // End of quote emit mimeTypes(event->mimeData()->formats()); setData(event->mimeData()->formats()[0], event->mimeData()->data(event->mimeData()->formats()[0])); //! [5] } //! [5] //! [6] void DragWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) dragStartPosition = event->pos(); } //! [6] //! [7] void DragWidget::mouseMoveEvent(QMouseEvent *event) { if (!(event->buttons() & Qt::LeftButton)) return; if ((event->pos() - dragStartPosition).manhattanLength() < QApplication::startDragDistance()) return; QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setData(mimeType, data); drag->setMimeData(mimeData); Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction); //! [7] switch (dropAction) { case Qt::CopyAction: emit dragResult(tr("The text was copied.")); break; case Qt::MoveAction: emit dragResult(tr("The text was moved.")); break; default: emit dragResult(tr("Unknown action.")); break; } //! [8] } //! [8] void DragWidget::setData(const QString &mimetype, const QByteArray &newData) { mimeType = mimetype; data = QByteArray(newData); dragDropLabel->setText(tr("%1 bytes").arg(data.size())); QStringList formats; formats << mimetype; emit mimeTypes(formats); } ================================================ FILE: doc/codesnippets/doc/src/snippets/draganddrop/dragwidget.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef DRAGWIDGET_H #define DRAGWIDGET_H #include #include #include #include class QComboBox; class QFrame; class QLabel; class QTextBrowser; class DragWidget : public QFrame { Q_OBJECT public: DragWidget(QWidget *parent); void setData(const QString &mimetype, const QByteArray &newData); signals: void dragResult(const QString &actionText); void mimeTypes(const QStringList &types); protected: void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); private: QByteArray data; QLabel *dragDropLabel; QPoint dragStartPosition; QString mimeType; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/draganddrop/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window1 = new MainWindow; MainWindow *window2 = new MainWindow; window1->show(); window2->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/draganddrop/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "dragwidget.h" #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QFrame *centralWidget = new QFrame(this); QLabel *mimeTypeLabel = new QLabel(tr("MIME types:"), centralWidget); mimeTypeCombo = new QComboBox(centralWidget); QLabel *dataLabel = new QLabel(tr("Amount of data (bytes):"), centralWidget); dragWidget = new DragWidget(centralWidget); connect(dragWidget, SIGNAL(mimeTypes(const QStringList &)), this, SLOT(setMimeTypes(const QStringList &))); connect(dragWidget, SIGNAL(dragResult(const QString &)), this, SLOT(setDragResult(const QString &))); QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget); mainLayout->addWidget(mimeTypeLabel); mainLayout->addWidget(mimeTypeCombo); mainLayout->addSpacing(32); mainLayout->addWidget(dataLabel); mainLayout->addWidget(dragWidget); statusBar(); dragWidget->setData(QString("text/plain"), QByteArray("Hello world")); setCentralWidget(centralWidget); setWindowTitle(tr("Drag and Drop")); } void MainWindow::setDragResult(const QString &actionText) { statusBar()->showMessage(actionText); } void MainWindow::setMimeTypes(const QStringList &types) { mimeTypeCombo->clear(); mimeTypeCombo->addItems(types); } ================================================ FILE: doc/codesnippets/doc/src/snippets/draganddrop/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include class QComboBox; class QLabel; class QLineEdit; class QMouseEvent; class QTextEdit; class DragWidget; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); public slots: void setDragResult(const QString &actionText); void setMimeTypes(const QStringList &types); private: QComboBox *mimeTypeCombo; DragWidget *dragWidget; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/dragging/images.qrc ================================================ images/file.png ================================================ FILE: doc/codesnippets/doc/src/snippets/dragging/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/dragging/mainwindow.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] def mousePressEvent(self, event): if event.button() == Qt.LeftButton && iconLabel.geometry().contains(event.pos()): //! [1] drag = QDrag(self) mimeData = QMimeData() mimeData.setText(commentEdit.toPlainText()) drag.setMimeData(mimeData) //! [1] drag.setPixmap(iconPixmap) dropAction = drag.exec_() //! [0] //! [2] //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/dragging/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include class QLabel; class QLineEdit; class QMouseEvent; class QTextEdit; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); protected: void mousePressEvent(QMouseEvent *event); private: QLabel *iconLabel; QLineEdit *nameEdit; QPixmap iconPixmap; QPoint dragStartPosition; QTextEdit *commentEdit; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/dropactions/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "window.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Window *window = new Window; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/dropactions/window.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "window.h" Window::Window(QWidget *parent) : QWidget(parent) { QLabel *textLabel = new QLabel(tr("Data:"), this); textBrowser = new QTextBrowser(this); QLabel *mimeTypeLabel = new QLabel(tr("MIME types:"), this); mimeTypeCombo = new QComboBox(this); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(textLabel); layout->addWidget(textBrowser); layout->addWidget(mimeTypeLabel); layout->addWidget(mimeTypeCombo); /* ... setAcceptDrops(true); */ setAcceptDrops(true); setWindowTitle(tr("Drop Actions")); } void Window::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("text/plain")) event->acceptProposedAction(); } void Window::dropEvent(QDropEvent *event) { QMenu actionMenu(this); QAction *copyAction = 0; QAction *moveAction = 0; QAction *linkAction = 0; QAction *ignoreAction = 0; if (event->possibleActions() & Qt::CopyAction) copyAction = actionMenu.addAction(tr("Copy")); if (event->possibleActions() & Qt::MoveAction) moveAction = actionMenu.addAction(tr("Move")); if (event->possibleActions() & Qt::LinkAction) linkAction = actionMenu.addAction(tr("Link")); if (event->possibleActions() & Qt::IgnoreAction) ignoreAction = actionMenu.addAction(tr("Ignore")); QAction *result = actionMenu.exec(QCursor::pos()); if (copyAction && result == copyAction) event->setDropAction(Qt::CopyAction); else if (moveAction && result == moveAction) event->setDropAction(Qt::MoveAction); else if (linkAction && result == linkAction) event->setDropAction(Qt::LinkAction); else { event->setDropAction(Qt::IgnoreAction); return; } textBrowser->setPlainText(event->mimeData()->text()); mimeTypeCombo->clear(); mimeTypeCombo->addItems(event->mimeData()->formats()); } ================================================ FILE: doc/codesnippets/doc/src/snippets/dropactions/window.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include #include class QComboBox; class QFrame; class QTextBrowser; class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent = 0); protected: void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); private: QComboBox *mimeTypeCombo; QFrame *dropFrame; QTextBrowser *textBrowser; QString oldText; QStringList oldMimeTypes; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/droparea.cpp ================================================ /############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################/ from PySide.QtGui import * DropArea.DropArea(QWidget *parent) : QLabel(parent) { setMinimumSize(200, 200) setFrameStyle(QFrame.Sunken | QFrame::StyledPanel) setAlignment(Qt.AlignCenter) setAcceptDrops(True) setAutoFillBackground(True) clear() } void DropArea.dragEnterEvent(QDragEnterEvent *event) { setText(tr("")) setBackgroundRole(QPalette.Highlight) event.acceptProposedAction() emit changed(event.mimeData()) } void DropArea.dragMoveEvent(QDragMoveEvent *event) { event.acceptProposedAction() } void DropArea.dropEvent(QDropEvent *event) { const QMimeData *mimeData = event.mimeData() if (mimeData.hasImage()) { setPixmap(qvariant_cast(mimeData.imageData())) } else if (mimeData.hasHtml()) { setText(mimeData.html()) setTextFormat(Qt.RichText) } else if (mimeData.hasText()) { setText(mimeData.text()) setTextFormat(Qt.PlainText) } else { setText(tr("Cannot display data")) } setBackgroundRole(QPalette.Dark) event.acceptProposedAction() } //![0] def paste(self): clipboard = QApplication.clipboard() mimeData = clipboard.mimeData() if mimeData.hasImage(): setPixmap(mimeData.imageData()) elif mimeData.hasHtml(): setText(mimeData.html()) setTextFormat(Qt.RichText) elif (mimeData.hasText(): setText(mimeData.text()) setTextFormat(Qt.PlainText) else: setText(tr("Cannot display data")) //![0] emit changed(mimeData) setBackgroundRole(QPalette.Dark) //event.acceptProposedAction() } void DropArea.dragLeaveEvent(QDragLeaveEvent *event) { clear() event.accept() } void DropArea.clear() { setText(tr("")) setBackgroundRole(QPalette.Dark) emit changed() } QPixmap DropArea.extractPixmap(const QByteArray &data, const QString &format) { QList imageFormats = QImageReader.supportedImageFormats() QPixmap pixmap foreach (QByteArray imageFormat, imageFormats) { if (format.mid(6) == QString(imageFormat)) { pixmap.loadFromData(data, imageFormat) break } } return pixmap } ================================================ FILE: doc/codesnippets/doc/src/snippets/dropevents/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "window.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Window *window = new Window; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/dropevents/window.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "window.h" //! [0] Window::Window(QWidget *parent) : QWidget(parent) { //! [0] QLabel *textLabel = new QLabel(tr("Data:"), this); textBrowser = new QTextBrowser(this); QLabel *mimeTypeLabel = new QLabel(tr("MIME types:"), this); mimeTypeCombo = new QComboBox(this); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(textLabel); layout->addWidget(textBrowser); layout->addWidget(mimeTypeLabel); layout->addWidget(mimeTypeCombo); //! [1] setAcceptDrops(true); //! [1] setWindowTitle(tr("Drop Events")); //! [2] } //! [2] //! [3] void Window::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("text/plain")) event->acceptProposedAction(); } //! [3] //! [4] void Window::dropEvent(QDropEvent *event) { textBrowser->setPlainText(event->mimeData()->text()); mimeTypeCombo->clear(); mimeTypeCombo->addItems(event->mimeData()->formats()); event->acceptProposedAction(); } //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/dropevents/window.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include #include class QComboBox; class QFrame; class QTextBrowser; class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent = 0); protected: void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); private: QComboBox *mimeTypeCombo; QFrame *dropFrame; QTextBrowser *textBrowser; QString oldText; QStringList oldMimeTypes; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/droprectangle/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "window.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Window *window = new Window; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/droprectangle/window.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "window.h" Window::Window(QWidget *parent) : QWidget(parent) { QLabel *textLabel = new QLabel(tr("Data:"), this); textBrowser = new QTextBrowser(this); QLabel *mimeTypeLabel = new QLabel(tr("MIME types:"), this); mimeTypeCombo = new QComboBox(this); dropFrame = new QFrame(this); dropFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); QLabel *dropLabel = new QLabel(tr("Drop items here"), dropFrame); dropLabel->setAlignment(Qt::AlignHCenter); QVBoxLayout *dropFrameLayout = new QVBoxLayout(dropFrame); dropFrameLayout->addWidget(dropLabel); QHBoxLayout *dropLayout = new QHBoxLayout; dropLayout->addStretch(0); dropLayout->addWidget(dropFrame); dropLayout->addStretch(0); QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(textLabel); mainLayout->addWidget(textBrowser); mainLayout->addWidget(mimeTypeLabel); mainLayout->addWidget(mimeTypeCombo); mainLayout->addSpacing(32); mainLayout->addLayout(dropLayout); setAcceptDrops(true); setWindowTitle(tr("Drop Rectangle")); } //! [0] void Window::dragMoveEvent(QDragMoveEvent *event) { if (event->mimeData()->hasFormat("text/plain") && event->answerRect().intersects(dropFrame->geometry())) event->acceptProposedAction(); } //! [0] void Window::dropEvent(QDropEvent *event) { textBrowser->setPlainText(event->mimeData()->text()); mimeTypeCombo->clear(); mimeTypeCombo->addItems(event->mimeData()->formats()); event->acceptProposedAction(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/droprectangle/window.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include #include class QComboBox; class QFrame; class QTextBrowser; class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent = 0); protected: void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event); private: QComboBox *mimeTypeCombo; QFrame *dropFrame; QTextBrowser *textBrowser; QString oldText; QStringList oldMimeTypes; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/eventfilters/filterobject.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "filterobject.h" FilterObject::FilterObject(QObject *parent) : QObject(parent), target(0) { } //! [0] bool FilterObject::eventFilter(QObject *object, QEvent *event) { if (object == target && event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); if (keyEvent->key() == Qt::Key_Tab) { // Special tab handling return true; } else return false; } return false; } //! [0] void FilterObject::setFilteredObject(QObject *object) { if (target) target->removeEventFilter(this); target = object; if (target) target->installEventFilter(this); } ================================================ FILE: doc/codesnippets/doc/src/snippets/eventfilters/filterobject.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef FILTEROBJECT_H #define FILTEROBJECT_H #include class FilterObject : public QObject { Q_OBJECT public: FilterObject(QObject *parent = 0); bool eventFilter(QObject *object, QEvent *event); void setFilteredObject(QObject *object); private: QObject *target; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/eventfilters/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "filterobject.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextEdit editor; FilterObject filter; filter.setFilteredObject(&editor); editor.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/events/events.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include class MyCheckBox : public QCheckBox { public: void mousePressEvent(QMouseEvent *event); }; //! [0] void MyCheckBox::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { // handle left mouse button here } else { // pass on other buttons to base class QCheckBox::mousePressEvent(event); } } //! [0] class MyWidget : public QWidget { public: bool event(QEvent *event); }; static const int MyCustomEventType = 1099; class MyCustomEvent : public QEvent { public: MyCustomEvent() : QEvent((QEvent::Type)MyCustomEventType) {} }; //! [1] bool MyWidget::event(QEvent *event) { if (event->type() == QEvent::KeyPress) { QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Tab) { // special tab handling here return true; } } else if (event->type() == MyCustomEventType) { MyCustomEvent *myEvent = static_cast(event); // custom event handling here return true; } return QWidget::event(event); } //! [1] int main() { } ================================================ FILE: doc/codesnippets/doc/src/snippets/explicitlysharedemployee/employee.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "employee.h" //! [0] EmployeeData::EmployeeData() { id = -1; name = 0; } //! [0] //! [1] EmployeeData::EmployeeData(const EmployeeData &other) //! [1] //! [2] : QSharedData(other) { id = other.id; if (other.name) { name = new QString(*other.name); } else { name = 0; } } //! [2] //! [3] EmployeeData::~EmployeeData() //! [3] //! [4] { delete name; } //! [4] //! [5] Employee::Employee() //! [5] //! [6] { d = new EmployeeData; } //! [6] //! [7] Employee::Employee(int id, const QString &name) //! [7] //! [8] { d = new EmployeeData; setId(id); setName(name); } //! [8] //! [9] void Employee::setName(const QString &name) //! [9] //! [10] { if (!d->name) d->name = new QString; *d->name = name; } //! [10] //! [11] QString Employee::name() const //! [11] //! [12] { if (!d->name) return QString(); return *d->name; } //! [12] ================================================ FILE: doc/codesnippets/doc/src/snippets/explicitlysharedemployee/employee.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef EMPLOYEE_H #define EMPLOYEE_H #include #include class EmployeeData : public QSharedData { public: EmployeeData(); EmployeeData(const EmployeeData &other); ~EmployeeData(); int id; QString *name; }; class Employee { public: Employee(); Employee(int id, const QString &name); void setId(int id) { d->id = id; } void setName(const QString &name); int id() const { return d->id; } QString name() const; private: QExplicitlySharedDataPointer d; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/explicitlysharedemployee/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "employee.h" int main() { { Employee e1(10, "Albrecht Durer"); Employee e2 = e1; e1.setName("Hans Holbein"); } } ================================================ FILE: doc/codesnippets/doc/src/snippets/file/file.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include static void process_line(const QByteArray &) { } static void process_line(const QString &) { } static void noStream_snippet() { //! [0] file = QFile("in.txt") if not file.open(QIODevice.ReadOnly | QIODevice.Text): return while not file.atEnd(): line = file.readLine() # A QByteArray process_line(line) //! [0] } static void readTextStream_snippet() { //! [1] file = QFile("in.txt") if not file.open(QIODevice.ReadOnly | QIODevice.Text): return in = QTextStream(file) while not in.atEnd(): line = in.readLine() # A QByteArray process_line(line) //! [1] } static void writeTextStream_snippet() { //! [2] file = QFile("out.txt") if not file.open(QIODevice.WriteOnly | QIODevice.Text): return out = QTextStream(file) out << "The magic number is: " << 49 << "\n" //! [2] } static void writeTextStream_snippet() { QFile file("out.dat"); if (!file.open(QIODevice.WriteOnly)) return; QDataStream out(&file); out << "The magic number is: " << 49 << "\n"; } static void readRegularEmptyFile_snippet() { //! [3] file = QFile("/proc/modules") if not file.open(QIODevice.ReadOnly | QIODevice.Text): return in = QTextStream(file) line = in.readLine() while not line.isNull(): process_line(line) line = in.readLine() //! [3] } int main() { lineByLine_snippet(); writeStream_snippet(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/filedialogurls.cpp ================================================ #include int main(int argv, char **args) { QApplication app(argv, args); //![0] QList urls; urls << QUrl::fromLocalFile("/home/gvatteka/dev/qt-45") << QUrl::fromLocalFile(QDesktopServices::storageLocation(QDesktopServices::MusicLocation)); QFileDialog dialog; dialog.setSidebarUrls(urls); dialog.setFileMode(QFileDialog::AnyFile); if(dialog.exec()) { // ... } //![0] return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/fileinfo/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); //! [0] fileInfo1 = QFileInfo("~/examples/191697/.") fileInfo2 = QFileInfo("~/examples/191697/..") fileInfo3 = QFileInfo("~/examples/191697/main.cpp") //! [0] //! [1] fileInfo4 = QFileInfo(".") fileInfo5 = QFileInfo("..") fileInfo6 = QFileInfo("main.cpp") //! [1] qDebug() << fileInfo1.fileName(); qDebug() << fileInfo2.fileName(); qDebug() << fileInfo3.fileName(); qDebug() << fileInfo4.fileName(); qDebug() << fileInfo5.fileName(); qDebug() << fileInfo6.fileName(); QPushButton* button1 = new QPushButton(fileInfo1.dir().path()); QPushButton* button2 = new QPushButton(fileInfo2.dir().path()); QPushButton* button3 = new QPushButton(fileInfo3.dir().path()); QPushButton* button4 = new QPushButton(fileInfo4.dir().path()); QPushButton* button5 = new QPushButton(fileInfo5.dir().path()); QPushButton* button6 = new QPushButton(fileInfo6.dir().path()); QVBoxLayout* vbox = new QVBoxLayout; vbox->addWidget(button1); vbox->addWidget(button2); vbox->addWidget(button3); vbox->addWidget(button4); vbox->addWidget(button5); vbox->addWidget(button6); vbox->addStretch(1); QGroupBox *groupBox = new QGroupBox("QFileInfo::dir() test"); groupBox->setLayout(vbox); groupBox->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/graphicssceneadditemsnippet.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class CustomScene : public QGraphicsScene { public: CustomScene() { addItem(new QGraphicsEllipseItem(QRect(10, 10, 30, 30))); } void drawItems(QPainter *painter, int numItems, QGraphicsItem *items[], const QStyleOptionGraphicsItem options[], QWidget *widget = 0); }; //! [0] void CustomScene::drawItems(QPainter *painter, int numItems, QGraphicsItem *items[], const QStyleOptionGraphicsItem options[], QWidget *widget) { for (int i = 0; i < numItems; ++i) { // Draw the item painter->save(); painter->setMatrix(items[i]->sceneMatrix(), true); items[i]->paint(painter, &options[i], widget); painter->restore(); } } //! [0] int main(int argv, char **args) { QApplication app(argv, args); CustomScene scene; QGraphicsView view(&scene); view.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/i18n-non-qt-class/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "myclass.h" int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QTranslator translator; translator.load(":/translations/i18n-non-qt-class_" + QLocale::system().name()); app.installTranslator(&translator); MyClass instance; return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/i18n-non-qt-class/myclass.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "myclass.h" MyClass::MyClass() { std::cout << tr("Hello Qt!\n").toLocal8Bit().constData(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/i18n-non-qt-class/myclass.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MYCLASS_H #define MYCLASS_H #include //! [0] class MyClass { Q_DECLARE_TR_FUNCTIONS(MyClass) public: MyClass(); //! [0] /* ... */ //! [1] }; //! [1] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/i18n-non-qt-class/myclass.ts ================================================ MyClass Hello Qt! ================================================ FILE: doc/codesnippets/doc/src/snippets/i18n-non-qt-class/resources.qrc ================================================ translations/i18n-non-qt-class_en.qm translations/i18n-non-qt-class_fr.qm ================================================ FILE: doc/codesnippets/doc/src/snippets/i18n-non-qt-class/translations/i18n-non-qt-class_en.ts ================================================ MyClass Hello Qt! ================================================ FILE: doc/codesnippets/doc/src/snippets/i18n-non-qt-class/translations/i18n-non-qt-class_fr.ts ================================================ MyClass Hello Qt! Bonjour Qt! ================================================ FILE: doc/codesnippets/doc/src/snippets/image/image.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] image = QImage() ba = QByteArray() buffer(ba) buffer.open(QIODevice.WriteOnly) image.save(buffer, "PNG") # writes image into ba in PNG format //! [0] //! [1] pixmap = QPixmap() bytes = QByteArray() buffer(bytes) buffer.open(QIODevice.WriteOnly) pixmap.save(buffer, "PNG") # writes pixmap into bytes in PNG format //! [1] //! [2] alpha = QPixmap("image-with-alpha.png") alphacopy = alpha alphacopy.setMask(alphacopy.mask()) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/image/supportedformat.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] writer = QImageWriter() writer.setFormat("png") if writer.supportsOption(QImageIOHandler.Description): print "Png supports embedded text" //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/inherited-slot/button.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "button.h" Button::Button(QWidget *parent) : QPushButton(parent) { } void Button::animateClick() { qDebug() << "Extra code goes here..."; QPushButton::animateClick(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/inherited-slot/button.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include //! [Button class with reimplemented slot] class Button : public QPushButton { Q_OBJECT public: Button(QWidget *parent = 0); public slots: void animateClick(); }; //! [Button class with reimplemented slot] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/inherited-slot/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include "button.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; QHBoxLayout *layout = new QHBoxLayout(&window); QLineEdit *lineEdit = new QLineEdit; Button *button = new Button; QObject::connect(lineEdit, SIGNAL(returnPressed()), button, SLOT(animateClick())); layout->addWidget(lineEdit); layout->addWidget(button); window.show(); for (int i = 0; i < button->metaObject()->methodCount(); ++i) qDebug() << i << button->metaObject()->method(i).signature(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/itemselection/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* main.cpp A simple example that shows how selections can be used directly on a model. It shows the result of some selections made using a table view. */ #include #include #include #include #include "model.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); //! [0] TableModel *model = new TableModel(8, 4, &app); QTableView *table = new QTableView(0); table->setModel(model); QItemSelectionModel *selectionModel = table->selectionModel(); //! [0] //! [1] QModelIndex topLeft; QModelIndex bottomRight; topLeft = model->index(0, 0, QModelIndex()); bottomRight = model->index(5, 2, QModelIndex()); //! [1] //! [2] QItemSelection selection(topLeft, bottomRight); selectionModel->select(selection, QItemSelectionModel::Select); //! [2] //! [3] QItemSelection toggleSelection; topLeft = model->index(2, 1, QModelIndex()); bottomRight = model->index(7, 3, QModelIndex()); toggleSelection.select(topLeft, bottomRight); selectionModel->select(toggleSelection, QItemSelectionModel::Toggle); //! [3] //! [4] QItemSelection columnSelection; topLeft = model->index(0, 1, QModelIndex()); bottomRight = model->index(0, 2, QModelIndex()); columnSelection.select(topLeft, bottomRight); selectionModel->select(columnSelection, QItemSelectionModel::Select | QItemSelectionModel::Columns); QItemSelection rowSelection; topLeft = model->index(0, 0, QModelIndex()); bottomRight = model->index(1, 0, QModelIndex()); rowSelection.select(topLeft, bottomRight); selectionModel->select(rowSelection, QItemSelectionModel::Select | QItemSelectionModel::Rows); //! [4] table->setWindowTitle("Selected items in a table model"); table->show(); table->resize(460, 280); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/itemselection/model.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MODEL_H #define MODEL_H #include #include #include class TableModel : public QAbstractTableModel { Q_OBJECT public: TableModel(int rows = 1, int columns = 1, QObject *parent = 0); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool insertColumns(int position, int columns, const QModelIndex &parent = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool removeColumns(int position, int columns, const QModelIndex &parent = QModelIndex()); private: QList rowList; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/javastyle.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "javastyle.h" #include static const int windowsItemFrame = 2; static const int windowsSepHeight = 2; static const int windowsItemHMargin = 3; static const int windowsItemVMargin = 2; static const int windowsArrowHMargin = 6; static const int windowsTabSpacing = 12; static const int windowsCheckMarkHMargin = 2; static const int windowsRightBorder = 15; static const int windowsCheckMarkWidth = 12; JavaStyle::JavaStyle() { qApp->setPalette(standardPalette()); } inline QPoint JavaStyle::adjustScrollPoint(const QPoint &point, Qt::Orientation orientation, bool add) const { int adder = add ? -1 : 1; QPoint retPoint; if (orientation == Qt::Horizontal) { retPoint = QPoint(point.y() * adder, point.x()); } else { retPoint = QPoint(point.x(), point.y() * adder); } return retPoint; } QPalette JavaStyle::standardPalette() const { QPalette palette = QWindowsStyle::standardPalette(); palette.setBrush(QPalette::Active, QPalette::Button, QColor(184, 207, 229)); palette.setBrush(QPalette::Active, QPalette::WindowText, Qt::black); palette.setBrush(QPalette::Active, QPalette::Background, QColor(238, 238, 238)); palette.setBrush(QPalette::Active, QPalette::Window, QColor(238 ,238, 238)); palette.setBrush(QPalette::Active, QPalette::Base, Qt::white); palette.setBrush(QPalette::Active, QPalette::AlternateBase, QColor(238, 238, 238)); palette.setBrush(QPalette::Active, QPalette::Text, Qt::black); palette.setBrush(QPalette::Active, QPalette::BrightText, Qt::white); palette.setBrush(QPalette::Active, QPalette::Light, QColor(163, 184, 204)); // focusFrameColor palette.setBrush(QPalette::Active, QPalette::Midlight, QColor(99, 130, 191)); // tabBarBorderColor palette.setBrush(QPalette::Active, QPalette::Dark, QColor(106, 104, 100)); palette.setBrush(QPalette::Active, QPalette::Mid, QColor(122, 138, 153)); //defaultFrameColor palette.setBrush(QPalette::Active, QPalette::Shadow, QColor(122, 138, 153)); // defaultFrame palette.setBrush(QPalette::Active, QPalette::Highlight, QColor(184, 207, 229)); palette.setBrush(QPalette::Active, QPalette::HighlightedText, Qt::black); palette.setBrush(QPalette::Inactive, QPalette::Highlight, QColor(184, 207, 229)); palette.setBrush(QPalette::Inactive, QPalette::HighlightedText, Qt::black); palette.setBrush(QPalette::Disabled, QPalette::Button, QColor(238, 238, 238)); palette.setBrush(QPalette::Disabled, QPalette::WindowText, QColor(153, 153, 153)); palette.setBrush(QPalette::Disabled, QPalette::Background, QColor(238, 238, 238)); palette.setBrush(QPalette::Inactive, QPalette::Button, QColor(184, 207, 229)); palette.setBrush(QPalette::Inactive, QPalette::Background, QColor(238, 238, 238)); palette.setBrush(QPalette::Inactive, QPalette::Window, QColor(238 ,238, 238)); palette.setBrush(QPalette::Inactive, QPalette::Light, QColor(163, 184, 204)); // focusFrameColor palette.setBrush(QPalette::Inactive, QPalette::Midlight, QColor(99, 130, 191)); // tabBarBorderColor palette.setBrush(QPalette::Inactive, QPalette::Dark,QColor(106, 104, 100)); palette.setBrush(QPalette::Inactive, QPalette::Mid, QColor(122, 138, 153)); //defaultFrame palette.setBrush(QPalette::Inactive, QPalette::Shadow, QColor(122, 138, 153)); // defaultFrame return palette; } inline void JavaStyle::drawScrollBarArrow(const QRect &rect, QPainter *painter, const QStyleOptionSlider *option, bool add) const { painter->save(); Qt::Orientation orient = option->orientation; QPoint offset; if (add) { if (orient == Qt::Vertical) { offset = rect.bottomLeft(); } else { offset = rect.topRight(); } } else { offset = rect.topLeft(); } QPainterPath arrow; arrow.moveTo(offset + adjustScrollPoint(QPoint(4, 8), orient, add)); arrow.lineTo(offset + adjustScrollPoint(QPoint(7, 5), orient, add)); arrow.lineTo(offset + adjustScrollPoint(QPoint(8, 5), orient, add)); arrow.lineTo(offset + adjustScrollPoint(QPoint(11, 8), orient, add)); arrow.lineTo(offset + adjustScrollPoint(QPoint(4, 8), orient, add)); QColor fillColor; if (option->state & State_Sunken) fillColor = QColor(option->palette.color(QPalette::Button)); else fillColor = option->palette.color(QPalette::Background); painter->fillRect(rect, fillColor); painter->setPen(option->palette.color(QPalette::Base)); int adjust = option->state & State_Sunken ? 0 : 1; painter->drawRect(rect.adjusted(adjust, adjust, -1, -1)); painter->setPen(option->palette.color(QPalette::Mid)); painter->drawRect(rect.adjusted(0, 0, -1, -1)); painter->setPen(option->palette.color(QPalette::WindowText)); painter->setBrush(option->palette.color(QPalette::WindowText)); painter->drawPath(arrow); painter->restore(); } inline QPoint JavaStyle::adjustScrollHandlePoint(Qt::Orientation orig, const QPoint &point) const { QPoint retPoint; if (orig == Qt::Vertical) retPoint = point; else retPoint = QPoint(point.y(), point.x()); return retPoint; } void JavaStyle::drawControl(ControlElement control, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { painter->save(); switch (control) { case CE_ToolBoxTabShape: { const QStyleOptionToolBox *box = qstyleoption_cast(option); painter->save(); if (box->direction == Qt::RightToLeft) { painter->rotate(1); painter->translate(box->rect.width(), -box->rect.height()); } int textWidth = box->fontMetrics.width(box->text) + 20; QPolygon innerLine; innerLine << (box->rect.topLeft() + QPoint(0, 1)) << (box->rect.topLeft() + QPoint(textWidth, 1)) << (box->rect.bottomLeft() + QPoint(textWidth + 15, -3)) << (box->rect.bottomRight() + QPoint(0, -3)) << box->rect.bottomRight() << box->rect.bottomLeft() << box->rect.topLeft(); painter->setPen(box->palette.color(QPalette::Base)); painter->setBrush(QColor(200, 221, 242)); painter->drawPolygon(innerLine); QPolygon outerLine; outerLine << (box->rect.bottomRight() + QPoint(0, -3)) << box->rect.bottomRight() << box->rect.bottomLeft() << box->rect.topLeft() << (box->rect.topLeft() + QPoint(textWidth, 0)) << (box->rect.bottomLeft() + QPoint(textWidth + 15, -4)) << (box->rect.bottomRight() + QPoint(0, -4)); painter->setPen(box->palette.color(QPalette::Midlight)); painter->setBrush(Qt::NoBrush); painter->drawPolyline(outerLine); painter->restore(); break; } case CE_DockWidgetTitle: { const QStyleOptionDockWidgetV2 *docker = new QStyleOptionDockWidgetV2( *qstyleoption_cast(option)); QRect rect = docker->rect; QRect titleRect = rect; if (docker->verticalTitleBar) { QRect r = rect; QSize s = r.size(); s.transpose(); r.setSize(s); titleRect = QRect(r.left() + rect.bottom() - titleRect.bottom(), r.top() + titleRect.left() - rect.left(), titleRect.height(), titleRect.width()); painter->translate(r.left(), r.top() + r.width()); painter->rotate(-90); painter->translate(-r.left(), -r.top()); rect = r; } QLinearGradient gradient(rect.topLeft(), rect.bottomLeft()); gradient.setColorAt(1.0, QColor(191, 212, 231)); gradient.setColorAt(0.3, Qt::white); gradient.setColorAt(0.0, QColor(221, 232, 243)); painter->setPen(Qt::NoPen); painter->setBrush(gradient); painter->drawRect(rect.adjusted(0, 0, -1, -1)); if (!docker->title.isEmpty()) { QRect textRect = docker->fontMetrics.boundingRect(docker->title); textRect.moveCenter(rect.center()); QFont font = painter->font(); font.setPointSize(font.pointSize() - 1); painter->setFont(font); painter->setPen(docker->palette.text().color()); painter->drawText(textRect, docker->title, QTextOption(Qt::AlignHCenter | Qt::AlignVCenter)); } break; } case CE_RubberBand: { painter->setPen(option->palette.color(QPalette::Active, QPalette::WindowText)); painter->drawRect(option->rect.adjusted(0, 0, -1, -1)); break; } case CE_SizeGrip: { break; } case CE_HeaderSection: { const QStyleOptionHeader *header = qstyleoption_cast(option); painter->setPen(Qt::NoPen); painter->setBrush(option->palette.color(QPalette::Active, QPalette::Background)); painter->drawRect(option->rect); painter->setPen(header->palette.color(QPalette::Mid)); if (header->orientation == Qt::Horizontal) { if (header->position == QStyleOptionHeader::Beginning || header->position == QStyleOptionHeader::OnlyOneSection) { painter->drawRect(header->rect.adjusted(0, 0, -1, -1)); painter->setPen(header->palette.color(QPalette::Base)); painter->drawLine(header->rect.bottomLeft() + QPoint(1, -1), header->rect.topLeft() + QPoint(1, 1)); painter->drawLine(header->rect.topLeft() + QPoint(1, 1), header->rect.topRight() + QPoint(-1, 1)); } else { painter->drawLine(header->rect.bottomRight(), header->rect.topRight()); painter->drawLine(header->rect.topLeft(), header->rect.topRight()); painter->drawLine(header->rect.bottomLeft(), header->rect.bottomRight()); painter->setPen(option->palette.color(QPalette::Base)); painter->drawLine(header->rect.bottomLeft() + QPoint(0, -1), header->rect.topLeft() + QPoint(0, 1)); painter->drawLine(header->rect.topLeft() + QPoint(1, 1), header->rect.topRight() + QPoint(-1, 1)); } } else { // Vertical if (header->position == QStyleOptionHeader::Beginning || header->position == QStyleOptionHeader::OnlyOneSection) { painter->drawRect(header->rect.adjusted(0, 0, -1, -1)); painter->setPen(header->palette.color(QPalette::Base)); painter->drawLine(header->rect.bottomLeft() + QPoint(1, -1), header->rect.topLeft() + QPoint(1, 1)); painter->drawLine(header->rect.topLeft() + QPoint(1, 1), header->rect.topRight() + QPoint(-1, 1)); } else { painter->drawLine(header->rect.bottomLeft(), header->rect.bottomRight()); painter->drawLine(header->rect.topLeft(), header->rect.bottomLeft()); painter->drawLine(header->rect.topRight(), header->rect.bottomRight()); painter->setPen(header->palette.color(QPalette::Base)); painter->drawLine(header->rect.topLeft(), header->rect.topRight() + QPoint(-1, 0)); painter->drawLine(header->rect.bottomLeft() + QPoint(1, -1), header->rect.topLeft() + QPoint(1, 0)); } } break; } case CE_ToolBar: { QRect rect = option->rect; QLinearGradient gradient(rect.topLeft(), rect.bottomLeft()); gradient.setColorAt(1.0, QColor(221, 221, 221)); gradient.setColorAt(0.0, QColor(241, 241, 241)); if (option->state & State_Horizontal) { painter->setPen(QColor(204, 204, 204)); painter->setBrush(gradient); } else { painter->setPen(Qt::NoPen); painter->setBrush(option->palette.color(QPalette::Background)); } painter->drawRect(rect.adjusted(0, 0, -1, -1)); break; } case CE_ProgressBar: { const QStyleOptionProgressBar *bar1 = qstyleoption_cast(option); QStyleOptionProgressBarV2 *bar = new QStyleOptionProgressBarV2(*bar1); QRect rect = bar->rect; if (bar->orientation == Qt::Vertical) { rect = QRect(rect.left(), rect.top(), rect.height(), rect.width()); QMatrix m; m.translate(rect.height()-1, 0); m.rotate(90.0); painter->setMatrix(m); } painter->setPen(bar->palette.color(QPalette::Mid)); painter->drawRect(rect.adjusted(0, 0, -1, -1)); QRect grooveRect = subElementRect(SE_ProgressBarGroove, bar, widget); if (bar->orientation == Qt::Vertical) { grooveRect = QRect(grooveRect.left(), grooveRect.top(), grooveRect.height(), grooveRect.width()); } QStyleOptionProgressBar grooveBar = *bar; grooveBar.rect = grooveRect; drawControl(CE_ProgressBarGroove, &grooveBar, painter, widget); QRect progressRect = subElementRect(SE_ProgressBarContents, bar, widget); if (bar->orientation == Qt::Vertical) { progressRect = QRect(progressRect.left(), progressRect.top(), progressRect.height(), progressRect.width()); progressRect.adjust(0, 0, 0, -1); } QStyleOptionProgressBar progressOpt = *bar; progressOpt.rect = progressRect; drawControl(CE_ProgressBarContents, &progressOpt, painter, widget); QRect labelRect = subElementRect(SE_ProgressBarLabel, bar, widget); if (bar->orientation == Qt::Vertical) { labelRect = QRect(labelRect.left(), labelRect.top(), labelRect.height(), labelRect.width()); } QStyleOptionProgressBar subBar = *bar; subBar.rect = labelRect; if (bar->textVisible) drawControl(CE_ProgressBarLabel, &subBar, painter, widget); delete bar; break; } case CE_ProgressBarGroove: { painter->setBrush(option->palette.color(QPalette::Background)); painter->setPen(Qt::NoPen); painter->drawRect(option->rect.adjusted(0, 0, -1, -1)); painter->setPen(option->palette.color(QPalette::Button)); painter->drawLine(option->rect.topLeft() + QPoint(0, 0), option->rect.topRight() + QPoint(0, 0)); break; } case CE_ProgressBarContents: { const QStyleOptionProgressBar *bar = qstyleoption_cast(option); int progress = int((double(bar->progress) / double(bar->maximum - bar->minimum)) * bar->rect.width()); painter->setBrush(bar->palette.color(QPalette::Light)); painter->setPen(Qt::NoPen); QRect progressRect = QRect(bar->rect.topLeft(), QPoint(progress, bar->rect.bottom())); painter->drawRect(progressRect); painter->setPen(bar->palette.color(QPalette::Midlight)); painter->setBrush(Qt::NoBrush); painter->drawLine(bar->rect.bottomLeft(), bar->rect.topLeft()); painter->drawLine(bar->rect.topLeft(), QPoint(progress, bar->rect.top())); break; } case CE_ProgressBarLabel: { painter->save(); const QStyleOptionProgressBar *bar = qstyleoption_cast(option); QRect rect = bar->rect; QRect leftRect; int progressIndicatorPos = int((double(bar->progress) / double(bar->maximum - bar->minimum)) * bar->rect.width()); QFont font; font.setBold(true); painter->setFont(font); painter->setPen(bar->palette.color(QPalette::Midlight)); if (progressIndicatorPos >= 0 && progressIndicatorPos <= rect.width()) { leftRect = QRect(bar->rect.topLeft(), QPoint(progressIndicatorPos, bar->rect.bottom())); } else if (progressIndicatorPos > rect.width()) { painter->setPen(bar->palette.color(QPalette::Base)); } else { painter->setPen(bar->palette.color(QPalette::Midlight)); } QRect textRect = QFontMetrics(font).boundingRect(bar->text); textRect.moveCenter(option->rect.center()); painter->drawText(textRect, bar->text, QTextOption(Qt::AlignCenter)); if (!leftRect.isNull()) { painter->setPen(bar->palette.color(QPalette::Base)); painter->setClipRect(leftRect, Qt::IntersectClip); painter->drawText(textRect, bar->text, QTextOption(Qt::AlignCenter)); } painter->restore(); break; } case CE_MenuBarEmptyArea: { QRect emptyArea = option->rect.adjusted(0, 0, -1, -1); QLinearGradient gradient(emptyArea.topLeft(), emptyArea.bottomLeft() - QPoint(0, 1)); gradient.setColorAt(0.0, option->palette.color(QPalette::Base)); gradient.setColorAt(1.0, QColor(223, 223, 223)); painter->setPen(QColor(238, 238, 238)); painter->setBrush(gradient); painter->drawRect(emptyArea.adjusted(0, 0, 0, -1)); break; } case CE_MenuBarItem: { if (!(option->state & State_Sunken)) { QLinearGradient gradient(option->rect.topLeft(), option->rect.bottomLeft()); gradient.setColorAt(0.0, Qt::white); gradient.setColorAt(1.0, QColor(223, 223, 223)); painter->setPen(Qt::NoPen); painter->setBrush(gradient); } else { painter->setBrush(option->palette.color(QPalette::Light)); } painter->drawRect(option->rect); if (option->state & State_Sunken) { painter->setPen(option->palette.color(QPalette::Mid)); painter->drawRect(option->rect.adjusted(0, 0, -1, -1)); painter->setPen(option->palette.color(QPalette::Base)); painter->setBrush(Qt::NoBrush); painter->drawLine(option->rect.bottomRight() + QPoint(0, -1), option->rect.topRight() + QPoint(0, -1)); } QCommonStyle::drawControl(control, option, painter, widget); break; } case CE_MenuItem: { const QStyleOptionMenuItem *menuItem = qstyleoption_cast(option); bool selected = menuItem->state & State_Selected; bool checkable = menuItem->checkType != QStyleOptionMenuItem::NotCheckable; bool checked = menuItem->checked; if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) { QPoint center = menuItem->rect.center(); painter->setPen(menuItem->palette.color(QPalette::Midlight)); painter->drawLine(QPoint(menuItem->rect.left() - 2, center.y()), QPoint(menuItem->rect.right(), center.y())); painter->setPen(menuItem->palette.color(QPalette::Base)); painter->drawLine(QPoint(menuItem->rect.left() - 2, center.y() + 1), QPoint(menuItem->rect.right(), center.y() + 1)); break; } if (selected) { painter->setBrush(menuItem->palette.color(QPalette::Light)); painter->setPen(Qt::NoPen); painter->drawRect(menuItem->rect); painter->setPen(menuItem->palette.color(QPalette::Midlight)); painter->drawLine(menuItem->rect.topLeft(), menuItem->rect.topRight()); painter->setPen(menuItem->palette.color(QPalette::Base)); painter->drawLine(menuItem->rect.bottomLeft(), menuItem->rect.bottomRight()); } if (checkable) { QRect checkRect(option->rect.left() + 5, option->rect.center().y() - 5, 10, 10); if (menuItem->checkType & QStyleOptionMenuItem::Exclusive) { QStyleOptionButton button; button.rect = checkRect; button.state = menuItem->state; if (button.state & State_Sunken) button.state ^= State_Sunken; if (checked) button.state |= State_On; button.palette = menuItem->palette; drawPrimitive(PE_IndicatorRadioButton, &button, painter, widget); } else { QBrush buttonBrush = gradientBrush(option->rect); painter->setBrush(buttonBrush); painter->setPen(option->palette.color(QPalette::Mid)); painter->drawRect(checkRect); if (checked) { QImage image(":/images/checkboxchecked.png"); painter->drawImage(QPoint(option->rect.left() + 5, option->rect.center().y() - 8), image); } } } bool dis = !(menuItem->state & State_Enabled); bool act = menuItem->state & State_Selected; const QStyleOption *opt = option; const QStyleOptionMenuItem *menuitem = menuItem; int checkcol = qMax(menuitem->maxIconWidth, 20); if (menuItem->icon.isNull()) checkcol = 0; QPainter *p = painter; QRect vCheckRect = visualRect(opt->direction, menuitem->rect, QRect(menuitem->rect.x(), menuitem->rect.y(), checkcol, menuitem->rect.height())); if (!menuItem->icon.isNull()) { QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal; if (act && !dis) mode = QIcon::Active; QPixmap pixmap; if (checked) pixmap = menuItem->icon.pixmap( pixelMetric(PM_SmallIconSize), mode, QIcon::On); else pixmap = menuItem->icon.pixmap( pixelMetric(PM_SmallIconSize), mode); int pixw = pixmap.width(); int pixh = pixmap.height(); int adjustedIcon = checkable ? 15 : 0; QRect pmr(0, 0, pixw, pixh); pmr.moveCenter(vCheckRect.center()); painter->setPen(menuItem->palette.text().color()); if (checkable && checked) painter->drawPixmap(QPoint(pmr.left() + adjustedIcon, pmr.top() + 1), pixmap); else painter->drawPixmap(pmr.topLeft() + QPoint(adjustedIcon, 0), pixmap); } if (selected) { painter->setPen(menuItem->palette.highlightedText().color()); } else { painter->setPen(menuItem->palette.text().color()); } int x, y, w, h; menuitem->rect.getRect(&x, &y, &w, &h); int tab = menuitem->tabWidth; QColor discol; if (dis) { discol = menuitem->palette.text().color(); p->setPen(discol); } int xm = windowsItemFrame + checkcol + windowsItemHMargin; int xpos = menuitem->rect.x() + xm; QRect textRect; if (!menuItem->icon.isNull()) textRect.setRect(xpos, y + windowsItemVMargin, w - xm - windowsRightBorder - tab + 1, h - 2 * windowsItemVMargin); else textRect.setRect(menuItem->rect.left() + 9, y + windowsItemVMargin, w - xm - windowsRightBorder - tab, h - 2 * windowsItemVMargin); if (checkable) textRect.adjust(10, 0, 10, 0); QRect vTextRect = visualRect(opt->direction, menuitem->rect, textRect); QString s = menuitem->text; if (!s.isEmpty()) { int t = s.indexOf(QLatin1Char('\t')); int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine; if (!styleHint(SH_UnderlineShortcut, menuitem, widget)) text_flags |= Qt::TextHideMnemonic; text_flags |= Qt::AlignLeft; if (t >= 0) { QRect vShortcutRect = visualRect(opt->direction, menuitem->rect, QRect(textRect.topRight(), QPoint(menuitem->rect.right(), textRect.bottom()))); if (dis && !act) { p->setPen(menuitem->palette.light().color()); p->drawText(vShortcutRect.adjusted(1, 1, 1, 1), text_flags, s.mid(t + 1)); p->setPen(discol); } p->drawText(vShortcutRect, text_flags, s.mid(t + 1)); s = s.left(t); } QFont font = menuitem->font; if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem) font.setBold(true); p->setFont(font); if (dis && !act) { p->setPen(menuitem->palette.light().color()); p->drawText(vTextRect.adjusted(1,1,1,1), text_flags, s.left(t)); p->setPen(discol); } p->drawText(vTextRect, text_flags, s.left(t)); } if (menuItem->menuItemType & QStyleOptionMenuItem::SubMenu) { QPoint center = menuItem->rect.center(); QPoint drawStart(menuItem->rect.right() - 6, center.y() + 4); QPainterPath arrow; arrow.moveTo(drawStart); arrow.lineTo(drawStart + QPoint(0, -8)); arrow.lineTo(drawStart + QPoint(4, -5)); arrow.lineTo(drawStart + QPoint(4, -4)); arrow.lineTo(drawStart + QPoint(0, 0)); painter->save(); painter->setBrush(menuItem->palette.color(QPalette::Text)); painter->setPen(Qt::NoPen); painter->drawPath(arrow); painter->restore(); } break; } case CE_MenuVMargin: { break; } case CE_MenuHMargin: { break; } case CE_Splitter: { drawSplitter(option, painter, option->state & State_Horizontal); break; } case CE_ScrollBarAddPage: { case CE_ScrollBarSubPage: const QStyleOptionSlider *scrollBar = qstyleoption_cast(option); QRect myRect; if (scrollBar->orientation == Qt::Horizontal) { myRect = QRect(option->rect.topLeft(), option->rect.bottomRight()).adjusted(0, 0, 1, -1); } else { myRect = option->rect; } painter->setPen(Qt::NoPen); painter->setBrush(option->palette.color(QPalette::Background)); painter->drawRect(myRect); painter->setBrush(Qt::NoBrush); painter->setPen(scrollBar->palette.color(QPalette::Mid)); painter->drawRect(myRect.adjusted(0, 0, -1, 0)); painter->setPen(scrollBar->palette.color(QPalette::Button)); painter->drawLine(myRect.bottomLeft() + QPoint(1, 0), myRect.topLeft() + QPoint(1, 1)); painter->drawLine(myRect.topLeft() + QPoint(1, 1), myRect.topRight() + QPoint(-1, 1)); break; } case CE_ScrollBarSubLine: { const QStyleOptionSlider *scrollBar = qstyleoption_cast(option); int scrollBarExtent = pixelMetric(PM_ScrollBarExtent); QRect scrollBarSubLine = option->rect; QRect button1; QRect button2; if (scrollBar->orientation == Qt::Horizontal) { button1.setRect(scrollBarSubLine.left(), scrollBarSubLine.top(), 16, scrollBarExtent); button2.setRect(scrollBarSubLine.right() - 15, scrollBarSubLine.top(), 16, scrollBarExtent); } else { button1.setRect(scrollBarSubLine.left(), scrollBarSubLine.top(), scrollBarExtent, 16); button2.setRect(scrollBarSubLine.left(), scrollBarSubLine.bottom() - 15, scrollBarExtent, 16); } painter->fillRect(button2, Qt::blue); drawScrollBarArrow(button1, painter, scrollBar); drawScrollBarArrow(button2, painter, scrollBar); break; } case CE_ScrollBarAddLine: { const QStyleOptionSlider *scrollBar = qstyleoption_cast(option); QRect button(option->rect.left(), option->rect.top(), 16, 16); drawScrollBarArrow(button, painter, scrollBar, true); break; } case CE_ScrollBarSlider: { const QStyleOptionSlider *scrollBar = qstyleoption_cast(option); painter->setPen(scrollBar->palette.color(QPalette::Midlight)); painter->drawRect(scrollBar->rect.adjusted(-1, 0, -3, -1)); QPoint g1, g2; if (scrollBar->orientation == Qt::Horizontal) { g1 = option->rect.topLeft(); g2 = option->rect.bottomLeft(); } else { g1 = option->rect.topLeft(); g2 = option->rect.topRight(); } if (scrollBar->state & State_Enabled) { QLinearGradient gradient(g1, g2); gradient.setColorAt(1.0, QColor(188, 210, 230)); gradient.setColorAt(0.3, Qt::white); gradient.setColorAt(0.0, QColor(223, 233, 243)); painter->setBrush(gradient); } else { painter->setPen(scrollBar->palette.buttonText().color()); painter->setBrush(scrollBar->palette.button()); } painter->drawRect(scrollBar->rect.adjusted(0, 0, -1, -1)); int sliderLength = option->rect.height(); int drawPos = scrollBar->orientation == Qt::Vertical ? (sliderLength / 2) + 1 : 1 - ((option->rect.width() / 2)); QPoint origin; if (scrollBar->orientation == Qt::Vertical) origin = option->rect.bottomLeft(); else origin = option->rect.topLeft(); painter->setPen(scrollBar->palette.color(QPalette::Base)); painter->drawLine(origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(4, -drawPos)), origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(13, -drawPos))); painter->drawLine(origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(4, 2 - drawPos)), origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(13, 2 - drawPos))); painter->drawLine(origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(4, 4 - drawPos)), origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(13, 4 - drawPos))); painter->setPen(option->palette.color(QPalette::Midlight)); painter->drawLine(origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(3, -(drawPos + 1))), origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(12, -(drawPos + 1)))); painter->drawLine(origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(3, 1 - drawPos)), origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(12, 1 - drawPos))); painter->drawLine(origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(3, 3 - drawPos)), origin + adjustScrollHandlePoint( scrollBar->orientation, QPoint(12, 3 - drawPos))); break; } case CE_TabBarTabLabel: { QStyleOptionTab copy = *qstyleoption_cast(option); if (copy.state & State_HasFocus) copy.state ^= State_HasFocus; painter->setBrush(Qt::NoBrush); QWindowsStyle::drawControl(CE_TabBarTabLabel, ©, painter, widget); break; } case CE_TabBarTabShape: { const QStyleOptionTab *tab = qstyleoption_cast(option); QRect myRect = option->rect; QPoint bottomLeft, bottomRight, topLeft, topRight; if ((tab->position == QStyleOptionTab::Beginning) || (tab->position == QStyleOptionTab::OnlyOneTab)) { if (tab->shape == QTabBar::RoundedSouth || tab->shape == QTabBar::RoundedNorth) { myRect = myRect.adjusted(2, 0, 0, 0); } else { myRect = myRect.adjusted(0, 2, 0, 0); } } switch (tab->shape) { case QTabBar::RoundedNorth: topLeft = myRect.topLeft(); topRight = myRect.topRight(); bottomLeft = myRect.bottomLeft(); bottomRight = myRect.bottomRight(); break; case QTabBar::RoundedSouth: topLeft = myRect.bottomLeft(); topRight = myRect.bottomRight(); bottomLeft = myRect.topLeft(); bottomRight = myRect.topRight(); break; case QTabBar::RoundedWest: topLeft = myRect.topLeft(); topRight = myRect.bottomLeft(); bottomLeft = myRect.topRight(); bottomRight = myRect.bottomRight(); break; case QTabBar::RoundedEast: topLeft = myRect.topRight(); topRight = myRect.bottomRight(); bottomLeft = myRect.topLeft(); bottomRight = myRect.bottomLeft(); break; default: ; } QPainterPath outerPath; outerPath.moveTo(bottomLeft + adjustTabPoint(QPoint(0, -2), tab->shape)); outerPath.lineTo(bottomLeft + adjustTabPoint(QPoint(0, -14), tab->shape)); outerPath.lineTo(topLeft + adjustTabPoint(QPoint(6 , 0), tab->shape)); outerPath.lineTo(topRight + adjustTabPoint(QPoint(0, 0), tab->shape)); outerPath.lineTo(bottomRight + adjustTabPoint(QPoint(0, -2), tab->shape)); if (tab->state & State_Selected || tab->position == QStyleOptionTab::OnlyOneTab) { QPainterPath innerPath; innerPath.moveTo(topLeft + adjustTabPoint(QPoint(6, 2), tab->shape)); innerPath.lineTo(topRight + adjustTabPoint(QPoint(-1, 2), tab->shape)); innerPath.lineTo(bottomRight + adjustTabPoint(QPoint(-1 , -2), tab->shape)); innerPath.lineTo(bottomLeft + adjustTabPoint(QPoint(2 , -2), tab->shape)); innerPath.lineTo(bottomLeft + adjustTabPoint(QPoint(2 , -14), tab->shape)); innerPath.lineTo(topLeft + adjustTabPoint(QPoint(6, 2), tab->shape)); QPainterPath whitePath; whitePath.moveTo(bottomLeft + adjustTabPoint(QPoint(1, -2), tab->shape)); whitePath.lineTo(bottomLeft + adjustTabPoint(QPoint(1, -14), tab->shape)); whitePath.lineTo(topLeft + adjustTabPoint(QPoint(6, 1), tab->shape)); whitePath.lineTo(topRight + adjustTabPoint(QPoint(-1, 1), tab->shape)); painter->setPen(tab->palette.color(QPalette::Midlight)); painter->setBrush(QColor(200, 221, 242)); painter->drawPath(outerPath); painter->setPen(QColor(200, 221, 242)); painter->drawRect(QRect(bottomLeft + adjustTabPoint( QPoint(2, -3), tab->shape), bottomRight + adjustTabPoint( QPoint(-2, 0), tab->shape))); painter->setPen(tab->palette.color(QPalette::Base)); painter->setBrush(Qt::NoBrush); painter->drawPath(whitePath); if (option->state & State_HasFocus) { painter->setPen(option->palette.color(QPalette::Mid)); painter->drawPath(innerPath); } } else { painter->setPen(tab->palette.color(QPalette::Mid)); painter->drawPath(outerPath); } break; } case CE_PushButtonLabel: painter->save(); if (const QStyleOptionButton *button = qstyleoption_cast(option)) { QRect ir = button->rect; uint tf = Qt::AlignVCenter | Qt::TextShowMnemonic; if (!styleHint(SH_UnderlineShortcut, button, widget)) tf |= Qt::TextHideMnemonic; if (!button->icon.isNull()) { QPoint point; QIcon::Mode mode = button->state & State_Enabled ? QIcon::Normal : QIcon::Disabled; if (mode == QIcon::Normal && button->state & State_HasFocus) mode = QIcon::Active; QIcon::State state = QIcon::Off; if (button->state & State_On) state = QIcon::On; QPixmap pixmap = button->icon.pixmap(button->iconSize, mode, state); int w = pixmap.width(); int h = pixmap.height(); if (!button->text.isEmpty()) w += button->fontMetrics.width(button->text) + 2; point = QPoint(ir.x() + ir.width() / 2 - w / 2, ir.y() + ir.height() / 2 - h / 2); if (button->direction == Qt::RightToLeft) point.rx() += pixmap.width(); painter->drawPixmap(visualPos(button->direction, button->rect, point), pixmap); if (button->direction == Qt::RightToLeft) ir.translate(-point.x() - 2, 0); else ir.translate(point.x() + pixmap.width(), 0); if (!button->text.isEmpty()) tf |= Qt::AlignLeft; } else { tf |= Qt::AlignHCenter; } if (button->fontMetrics.height() > 14) ir.translate(0, 1); drawItemText(painter, ir, tf, button->palette, (button->state & State_Enabled), button->text, QPalette::ButtonText); } painter->restore(); break; default: QWindowsStyle::drawControl(control, option, painter, widget); } painter->restore(); } inline QPoint JavaStyle::adjustTabPoint(const QPoint &point, QTabBar::Shape shape) const { QPoint rPoint; switch (shape) { case QTabBar::RoundedWest: rPoint = QPoint(point.y(), point.x()); break; case QTabBar::RoundedSouth: rPoint = QPoint(point.x(), point.y() * -1); break; case QTabBar::RoundedEast: rPoint = QPoint(point.y() * -1, point.x()); break; default: rPoint = point; } return rPoint; } QRect JavaStyle::subControlRect(ComplexControl control, const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const { QRect rect = QWindowsStyle::subControlRect(control, option, subControl, widget); switch (control) { case CC_TitleBar: { const QStyleOptionTitleBar *bar = qstyleoption_cast(option); switch (subControl) { case SC_TitleBarMinButton: { rect = QRect(bar->rect.topRight() + QPoint(-68, 2), QSize(15, 15)); break; } case SC_TitleBarMaxButton: { rect = QRect(bar->rect.topRight() + QPoint(-43, 3), QSize(15, 15)); break; } case SC_TitleBarCloseButton: { rect = QRect(bar->rect.topRight() + QPoint(-18, 3), QSize(15, 15)); break; } case SC_TitleBarLabel: { QRect labelRect = bar->fontMetrics.boundingRect(bar->text); rect = labelRect; rect.translate(bar->rect.left() + 30, 0); rect.moveTop(bar->rect.top()); rect.adjust(0, 2, 2, 2); break; } case SC_TitleBarSysMenu: { rect = QRect(bar->rect.topLeft() + QPoint(6, 3), QSize(16, 16)); break; } default: ; } break; } case CC_GroupBox: { const QStyleOptionGroupBox *box = qstyleoption_cast(option); bool hasCheckbox = box->subControls & SC_GroupBoxCheckBox; int checkAdjust = 13; QRect textRect = box->fontMetrics.boundingRect(box->text); switch (subControl) { case SC_GroupBoxFrame: { rect = box->rect; break; } case SC_GroupBoxCheckBox: { if (hasCheckbox) { rect = QRect(box->rect.topLeft() + QPoint(7, 4 + (textRect.height() / 2 - checkAdjust / 2)), QSize(checkAdjust, checkAdjust)); } else { rect = QRect(); } break; } case SC_GroupBoxLabel: { rect = QRect(box->rect.topLeft() + QPoint(7 + (hasCheckbox ? checkAdjust + 2 : 0), 4), textRect.size()); break; } case SC_GroupBoxContents: { rect = box->rect.adjusted(10, 10 + textRect.height(), -10, -10); break; } default: ; } break; } case CC_SpinBox: { const QStyleOptionSpinBox *spinBox = qstyleoption_cast(option); int spinnerWidth = 16; QRect myRect = spinBox->rect; QPoint center = myRect.center(); int frameWidth = pixelMetric(PM_SpinBoxFrameWidth, spinBox, widget); switch (subControl) { case SC_SpinBoxUp: { rect = QRect(myRect.topRight() + QPoint(-16, 0), QSize(16, center.y() - myRect.topRight().y())); break; } case SC_SpinBoxDown: { rect = QRect(QPoint(myRect.bottomRight().x() - 16, center.y() + 1), QSize(16, myRect.bottomRight().y() - center.y() - 1)); break; } case SC_SpinBoxFrame: { rect = QRect(myRect.topLeft(), myRect.bottomRight() + QPoint(-16, 0)); break; } case SC_SpinBoxEditField: { rect = QRect(myRect.topLeft() + QPoint(2, 2), myRect.bottomRight() + QPoint(-15 - frameWidth, -2)); break; } default: ; } break; } case CC_ToolButton: { const QStyleOptionToolButton *button = qstyleoption_cast(option); switch (subControl) { case SC_ToolButton: { rect = option->rect.adjusted(1, 1, -1, -1); break; } case SC_ToolButtonMenu: { rect = QRect(option->rect.bottomRight() + QPoint(-11, -11), QSize(10, 10)); break; } } break; } case CC_ComboBox: { const QStyleOptionComboBox *combo = qstyleoption_cast(option); bool reverse = combo->direction == Qt::RightToLeft; switch (subControl) { case SC_ComboBoxFrame: rect = combo->rect; break; case SC_ComboBoxArrow: if (reverse) { rect = QRect(combo->rect.topLeft(), combo->rect.bottomLeft() + QPoint(17, 0)); } else { rect = QRect(combo->rect.topRight() + QPoint(-17, 0), combo->rect.bottomRight()); } break; case SC_ComboBoxEditField: if (reverse) { rect = QRect(combo->rect.topLeft() + QPoint(19, 2), combo->rect.bottomRight() + QPoint(-2, 2)); } else { rect = QRect(combo->rect.topLeft() + QPoint(2, 2), combo->rect.bottomRight() + QPoint(-19, -2)); } break; case SC_ComboBoxListBoxPopup: rect = combo->rect; break; } break; } case CC_ScrollBar: { const QStyleOptionSlider *scrollBar = qstyleoption_cast(option); int scrollBarExtent = pixelMetric(PM_ScrollBarExtent, scrollBar, widget); int sliderMaxLength = ((scrollBar->orientation == Qt::Horizontal) ? scrollBar->rect.width() : scrollBar->rect.height()) - (16 * 3); int sliderMinLength = pixelMetric(PM_ScrollBarSliderMin, scrollBar, widget); int sliderLength; if (scrollBar->maximum != scrollBar->minimum) { uint valueRange = scrollBar->maximum - scrollBar->minimum; sliderLength = (scrollBar->pageStep * sliderMaxLength) / (valueRange + scrollBar->pageStep); if (sliderLength < sliderMinLength || valueRange > INT_MAX / 2) sliderLength = sliderMinLength; if (sliderLength > sliderMaxLength) sliderLength = sliderMaxLength; } else { sliderLength = sliderMaxLength; } int sliderStart = 16 + sliderPositionFromValue(scrollBar->minimum, scrollBar->maximum, scrollBar->sliderPosition, sliderMaxLength - sliderLength, scrollBar->upsideDown); QRect scrollBarRect = scrollBar->rect; switch (subControl) { case SC_ScrollBarSubLine: if (scrollBar->orientation == Qt::Horizontal) { rect.setRect(scrollBarRect.left(), scrollBarRect.top(), scrollBarRect.width() - 16, scrollBarExtent); } else { rect.setRect(scrollBarRect.left(), scrollBarRect.top(), scrollBarExtent, scrollBarRect.height() - 16); } break; case SC_ScrollBarAddLine: if (scrollBar->orientation == Qt::Horizontal) { rect.setRect(scrollBarRect.right() - 15, scrollBarRect.top(), 16, scrollBarExtent); } else { rect.setRect(scrollBarRect.left(), scrollBarRect.bottom() - 15, scrollBarExtent, 16); } break; case SC_ScrollBarSubPage: if (scrollBar->orientation == Qt::Horizontal) { rect.setRect(scrollBarRect.left() + 16, scrollBarRect.top(), sliderStart - (scrollBarRect.left() + 16), scrollBarExtent); } else { rect.setRect(scrollBarRect.left(), scrollBarRect.top() + 16, scrollBarExtent, sliderStart - (scrollBarRect.left() + 16)); } break; case SC_ScrollBarAddPage: if (scrollBar->orientation == Qt::Horizontal) rect.setRect(sliderStart + sliderLength, 0, sliderMaxLength - sliderStart - sliderLength + 16, scrollBarExtent); else rect.setRect(0, sliderStart + sliderLength, scrollBarExtent, sliderMaxLength - sliderStart - sliderLength + 16); break; case SC_ScrollBarGroove: if (scrollBar->orientation == Qt::Horizontal) { rect = scrollBarRect.adjusted(16, 0, -32, 0); } else { rect = scrollBarRect.adjusted(0, 16, 0, -32); } break; case SC_ScrollBarSlider: if (scrollBar->orientation == Qt::Horizontal) { rect.setRect(sliderStart, 0, sliderLength, scrollBarExtent); } else { rect.setRect(0, sliderStart, scrollBarExtent, sliderLength); } break; default: return QWindowsStyle::subControlRect(control, option, subControl, widget); } break; } case CC_Slider: { const QStyleOptionSlider *slider = qstyleoption_cast(option); rect = slider->rect; int tickSize = pixelMetric(PM_SliderTickmarkOffset, option, widget); int handleSize = pixelMetric(PM_SliderControlThickness, option, widget); int dist = slider->orientation == Qt::Vertical ? slider->rect.height() : slider->rect.width(); int pos = QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, slider->sliderValue, dist - handleSize); switch (subControl) { case SC_SliderGroove: { QPoint center = rect.center(); if (slider->orientation == Qt::Horizontal) { rect.setHeight(handleSize); if (slider->tickPosition == QSlider::TicksBelow) { center.ry() -= tickSize; } } else { rect.adjust(0, 0, 0, 0); rect.setWidth(handleSize); if (slider->tickPosition == QSlider::TicksBelow) { center.rx() -= tickSize; } } rect.moveCenter(center); break; } case SC_SliderHandle: { QPoint center = rect.center(); if (slider->orientation == Qt::Horizontal) { rect.setHeight(handleSize); if (slider->tickPosition == QSlider::TicksBelow) { center.ry() -= tickSize; } rect.moveCenter(center); if (slider->upsideDown) rect.setLeft(slider->rect.right() - pos - (handleSize - 1)); else rect.setLeft(pos); rect.setWidth(handleSize - 1); } else { rect.setWidth(handleSize); if (slider->tickPosition == QSlider::TicksBelow) { center.rx() -= tickSize; } rect.moveCenter(center); if (slider->upsideDown) rect.setTop(slider->rect.bottom() - ((pos + handleSize) - 2)); else rect.setTop(slider->rect.top() + pos); rect.setHeight(handleSize); } break; } case SC_SliderTickmarks: { QPoint center = slider->rect.center(); if (slider->tickPosition & QSlider::TicksBelow) { if (slider->orientation == Qt::Horizontal) { rect.setHeight(tickSize); center.ry() += tickSize / 2; rect.adjust(6, 0, -10, 0); } else { rect.setWidth(tickSize); center.rx() += tickSize / 2; rect.adjust(0, 6, 0, -10); } } else { rect = QRect(); } rect.moveCenter(center); break; } default: ; } break; } default: return QWindowsStyle::subControlRect(control, option, subControl, widget); } return rect; } static const char * const sliderHandleImage[] = { "15 16 7 1", " c None", "+ c #FFFFFF", "@ c #FFFFFF", "$ c #FFFFFF", "( c #E5EDF5", ") c #F2F6FA", "[ c #FFFFFF", " +++++++++++++ ", "+@@@@@@@@@@@@@+", "+@(((((((((((@+", "+@(((((((((((@+", "+@)))))))))))@+", "+@[[[[[[[[[[[@+", "+@[[[[[[[[[[[@+", "+@)))))))))))@+", "+@)))))))))))@+", " +@)))))))))@+ ", " +@(((((((@+ ", " +@(((((@+ ", " +@(((@+ ", " +@(@+ ", " +@+ ", " + "}; void JavaStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { painter->save(); switch (control) { case CC_TitleBar: { const QStyleOptionTitleBar *bar = qstyleoption_cast(option); bool sunken = bar->state & State_Sunken; QLinearGradient gradient(bar->rect.bottomLeft(), bar->rect.topLeft()); gradient.setColorAt(0.0, QColor(191, 212, 231)); gradient.setColorAt(0.7, Qt::white); gradient.setColorAt(1.0, QColor(221, 232, 243)); painter->setPen(Qt::NoPen); if (bar->titleBarState & State_Active) { painter->setBrush(gradient); } else painter->setBrush(bar->palette.color(QPalette::Active, QPalette::Background)); painter->drawRect(bar->rect.adjusted(0, 0, -1, -1)); painter->setBrush(QColor(233, 233, 233)); painter->drawRect(QRect(bar->rect.bottomLeft() + QPoint(0, 1), bar->rect.bottomRight() + QPoint(0, 2))); QRect minButtonRect = subControlRect(control, bar, SC_TitleBarMinButton); QRect maxButtonRect = subControlRect(control, bar, SC_TitleBarMaxButton); QRect closeButtonRect = subControlRect(control, bar, SC_TitleBarCloseButton); QRect systemButtonRect = subControlRect(control, bar, SC_TitleBarSysMenu); QRect labelRect = subControlRect(control, bar, SC_TitleBarLabel); QRect gripRect = QRect(QPoint(labelRect.right() + 5, bar->rect.top() + 5), QPoint(minButtonRect.left() - 5, bar->rect.bottom() - 4)); QColor textColor = option->palette.color(QPalette::Text); painter->setPen(textColor); painter->setBrush(Qt::NoBrush); drawItemText(painter, labelRect, Qt::TextShowMnemonic | Qt::AlignHCenter | Qt::AlignCenter, bar->palette, bar->state & State_Enabled, bar->text, textColor.isValid() ? QPalette::NoRole : QPalette::WindowText); for (int i = 0; i < gripRect.width(); ++i) { painter->setPen(i % 2 ? bar->palette.color(QPalette::Midlight) : Qt::white); for (int j = 0; j < 4; ++j) { painter->drawPoint(i + gripRect.left(), gripRect.top() - 2 + i % 4 + 4 * j); } } QPixmap maximizePixmap(":/images/internalmaximize.png"); QPixmap minimizePixmap(":/images/internalminimize.png"); QPixmap closePixmap(":/images/internalclose.png"); QPixmap internalPixmap(":/images/internalsystem.png"); QPixmap internalCloseDownPixmap(":/images/internalclosedown.png"); QPixmap minimizeDownPixmap(":/images/internalminimizedown.png"); QPixmap maximizeDownPixmap(":/images/internalmaximizedown.png"); if (bar->activeSubControls & SC_TitleBarCloseButton && bar->state & State_Sunken) painter->drawPixmap(closeButtonRect.topLeft(), internalCloseDownPixmap); else painter->drawPixmap(closeButtonRect.topLeft(), closePixmap); if (bar->activeSubControls & SC_TitleBarMinButton && bar->state & State_Sunken) painter->drawPixmap(minButtonRect.topLeft(), minimizeDownPixmap); else painter->drawPixmap(minButtonRect.topLeft(), minimizePixmap); if (bar->activeSubControls & SC_TitleBarMaxButton && bar->state & State_Sunken) painter->drawPixmap(maxButtonRect.topLeft(), maximizeDownPixmap); else painter->drawPixmap(maxButtonRect.topLeft(), maximizePixmap); painter->drawPixmap(systemButtonRect.topLeft(), internalPixmap); break; } case CC_GroupBox: { const QStyleOptionGroupBox *box = qstyleoption_cast(option); QRect frameRect = subControlRect(control, box, SC_GroupBoxFrame); QRect labelRect = subControlRect(control, box, SC_GroupBoxLabel); QRect contentsRect = subControlRect(control, box, SC_GroupBoxContents); QRect checkerRect = subControlRect(control, box, SC_GroupBoxCheckBox); int y = labelRect.center().y(); painter->setPen(box->palette.color(QPalette::Button)); painter->drawRect(frameRect.adjusted(2, y - frameRect.top(), -2, -2)); painter->setPen(box->palette.color(QPalette::Background)); if (box->subControls & SC_GroupBoxCheckBox) { painter->drawLine(checkerRect.left() - 1, y, checkerRect.right() + 2, y); QStyleOptionButton checker; checker.QStyleOption::operator=(*box); checker.rect = checkerRect; drawPrimitive(PE_IndicatorCheckBox, &checker, painter, widget); } if (box->subControls & SC_GroupBoxLabel && !box->text.isEmpty()) { painter->drawLine(labelRect.left() - 1, y, labelRect.right() +1, y); QColor textColor = box->textColor; if (textColor.isValid()) painter->setPen(textColor); drawItemText(painter, labelRect, Qt::TextShowMnemonic | Qt::AlignHCenter | int(box->textAlignment), box->palette, box->state & State_Enabled, box->text, textColor.isValid() ? QPalette::NoRole : QPalette::WindowText); } break; } case CC_SpinBox: { const QStyleOptionSpinBox *spinner = qstyleoption_cast(option); QRect frameRect = subControlRect(control, spinner, SC_SpinBoxFrame); QRect upRect = subControlRect(control, spinner, SC_SpinBoxUp); QRect downRect = subControlRect(control, spinner, SC_SpinBoxDown); painter->setPen(Qt::white); painter->drawRect(frameRect.adjusted(1, 1, -1, -1)); painter->drawPoint(frameRect.bottomLeft()); painter->setPen(spinner->palette.color(QPalette::Mid)); painter->drawRect(frameRect.adjusted(0, 0, -1, -2)); bool isEnabled = (spinner->state & State_Enabled); bool hover = isEnabled && (spinner->state & State_MouseOver); bool sunken = (spinner->state & State_Sunken); bool upIsActive = (spinner->activeSubControls == SC_SpinBoxUp); bool downIsActive = (spinner->activeSubControls == SC_SpinBoxDown); bool stepUpEnabled = spinner->stepEnabled & QAbstractSpinBox::StepUpEnabled; bool stepDownEnabled = spinner->stepEnabled & QAbstractSpinBox::StepDownEnabled; painter->setBrush(spinner->palette.color(QPalette::Background)); painter->drawRect(upRect); if (upIsActive && stepUpEnabled) { if (sunken) { drawSunkenButtonShadow(painter, upRect, spinner->palette.color(QPalette::Mid)); } else if (hover) { drawButtonHoverFrame(painter, upRect, spinner->palette.color(QPalette::Mid), spinner->palette.color(QPalette::Button)); } } QStyleOptionSpinBox upSpin = *spinner; upSpin.rect = upRect; drawPrimitive(PE_IndicatorSpinUp, &upSpin, painter, widget); painter->drawRect(downRect); if (downIsActive && stepDownEnabled) { if (sunken) { drawSunkenButtonShadow(painter, downRect, spinner->palette.color(QPalette::Mid)); } else if (hover) { drawButtonHoverFrame(painter, downRect, spinner->palette.color(QPalette::Mid), spinner->palette.color(QPalette::Button)); } } QStyleOptionSpinBox downSpin = *spinner; downSpin.rect = downRect; drawPrimitive(PE_IndicatorSpinDown, &downSpin, painter, widget); break; } case CC_ToolButton: { const QStyleOptionToolButton *button = qstyleoption_cast(option); painter->setPen(Qt::white); painter->drawRect(button->rect.adjusted(1, 1, -1, -1)); QStyleOptionToolButton panelOption = *button; QRect panelRect; if (!(button->state & State_MouseOver) && !(button->state & State_On)) { painter->setPen(QColor(153, 153, 153)); painter->drawRect(button->rect.adjusted(0, 0, -2, -2)); panelRect = subControlRect(control, option, SC_ToolButton); panelOption.rect = panelRect; } else { panelOption.rect.adjust(0, 0, -1, -1); } QRect menuRect = subControlRect(control, option, SC_ToolButtonMenu); drawPrimitive(PE_PanelButtonTool, &panelOption, painter, widget); QStyleOptionToolButton menuOption = *button; menuOption.rect = menuRect; QStyleOptionToolButton label = *button; int fw = 5; drawControl(CE_ToolButtonLabel, &label, painter, widget); if (button->subControls & SC_ToolButtonMenu) { painter->setPen(button->palette.color(QPalette::WindowText)); drawPrimitive(PE_IndicatorArrowDown, &menuOption, painter, widget); } if (button->state & State_HasFocus) { QStyleOptionToolButton focusOption = *button; focusOption.rect = label.rect.adjusted(-1, -1, 1, 1); drawPrimitive(PE_FrameFocusRect, &focusOption, painter, widget); } break; } case CC_ComboBox: { const QStyleOptionComboBox *combo = qstyleoption_cast(option); QRect frameRect = subControlRect(control, option, SC_ComboBoxFrame, widget); painter->setPen(combo->palette.color(QPalette::Mid)); if (option->state & State_HasFocus) painter->setBrush(option->palette.color(QPalette::Light)); else painter->setBrush(combo->palette.color(QPalette::Background)); painter->drawRect(frameRect.adjusted(0, 0, -1, -1)); QRect arrowRect = subControlRect(control, option, SC_ComboBoxArrow, widget); painter->setPen(combo->palette.color(QPalette::Button)); painter->setBrush(Qt::NoBrush); if (combo->direction == Qt::LeftToRight) { painter->drawRect(QRect(frameRect.topLeft() + QPoint(1, 1), arrowRect.bottomLeft() + QPoint(-2, -2))); } else { painter->drawRect(QRect(arrowRect.topLeft() + QPoint(1, 1), frameRect.bottomRight() + QPoint(-2, -2))); } QStyleOptionButton button; button.rect = arrowRect; button.state = combo->state; button.palette = combo->palette; if (button.state & State_On) button.state ^= State_On; painter->save(); drawButtonBackground(&button, painter, false); painter->restore(); QPoint center = arrowRect.center(); QPoint offset = QPoint(arrowRect.bottomLeft().x() + 1, center.y() + 7); QPainterPath arrow; arrow.moveTo(offset + QPoint(4, -8)); arrow.lineTo(offset + QPoint(7, -5)); arrow.lineTo(offset + QPoint(8, -5)); arrow.lineTo(offset + QPoint(11, -8)); arrow.lineTo(offset + QPoint(4, -8)); painter->setBrush(combo->palette.color(QPalette::WindowText)); painter->setPen(combo->palette.color(QPalette::WindowText)); painter->drawPath(arrow); QRect fieldRect = subControlRect(control, option, SC_ComboBoxEditField, widget); break; } case CC_Slider: { const QStyleOptionSlider *slider = qstyleoption_cast(option); bool horizontal = slider->orientation == Qt::Horizontal; QRect groove = subControlRect(control, option, SC_SliderGroove, widget); QRect ticks = subControlRect(control, option, SC_SliderTickmarks, widget); QRect handle = subControlRect(control, option, SC_SliderHandle, widget); QRect afterHandle = QRect(handle.topLeft() + xySwitch(QPoint(4, 6), horizontal), groove.bottomRight() + xySwitch(QPoint(-4, -6), horizontal)); QRect beforeHandle = QRect(groove.topLeft() + xySwitch(QPoint(4, 6), horizontal), handle.bottomRight() + xySwitch(QPoint(-4, -6), horizontal)); if (slider->upsideDown || !horizontal) { QRect remember; remember = afterHandle; afterHandle = beforeHandle; beforeHandle = remember; } painter->setPen(slider->palette.color(QPalette::Mid)); painter->setBrush(option->palette.color(QPalette::Background)); painter->drawRect(afterHandle); painter->setPen(slider->palette.color(QPalette::Light)); painter->drawLine(afterHandle.topLeft() + xySwitch(QPoint(0, 1), horizontal), afterHandle.topRight() + xySwitch(QPoint(0, 1), horizontal)); painter->setPen(option->palette.color(QPalette::Midlight)); if (horizontal) { painter->setBrush(gradientBrush(QRect(QPoint(groove.x(), handle.y() + 1), QSize(groove.width(), handle.height() + 1)))); } else { QRect rect = QRect(QPoint(groove.x(), handle.x() - 1), QSize(groove.height(), handle.width() + 1)); QLinearGradient gradient(groove.bottomLeft(), groove.bottomRight()); gradient.setColorAt(1.0, QColor(188, 210, 230)); gradient.setColorAt(0.3, Qt::white); gradient.setColorAt(0.0, QColor(223, 233, 243)); painter->setBrush(gradient); } painter->drawRect(beforeHandle); QPainterPath handlePath; QPainterPath innerPath; QPoint topLeft, topRight, bottomLeft; if (horizontal) { topLeft = handle.topLeft(); topRight = handle.topRight(); bottomLeft = handle.bottomLeft(); } else { topLeft = handle.bottomLeft(); topRight = handle.topLeft(); bottomLeft = handle.topRight(); } if (horizontal) { QImage image(sliderHandleImage); image.setColor(1, option->palette.color(QPalette::Midlight).rgb()); image.setColor(2, option->palette.color(QPalette::Button).rgb()); if (!(slider->state & State_Enabled)) { image.setColor(4, slider->palette.color(QPalette::Background).rgb()); image.setColor(5, slider->palette.color(QPalette::Background).rgb()); image.setColor(6, slider->palette.color(QPalette::Background).rgb()); } painter->drawImage(handle.topLeft(), image); } else { QImage image(":/images/verticalsliderhandle.png"); painter->drawImage(handle.topLeft(), image); } if (slider->tickPosition & QSlider::TicksBelow) { painter->setPen(slider->palette.color(QPalette::Light)); int tickInterval = slider->tickInterval ? slider->tickInterval : slider->pageStep; for (int i = 0; i <= slider->maximum; i += tickInterval) { if (horizontal) { int pos = int(((i / double(slider->maximum)) * ticks.width()) - 1); painter->drawLine(QPoint(ticks.left() + pos, ticks.top() + 2), QPoint(ticks.left() + pos, ticks.top() + 8)); } else { int pos = int(((i / double(slider->maximum)) * ticks.height()) - 1); painter->drawLine(QPoint(ticks.left() + 2, ticks.bottom() - pos), QPoint(ticks.right() - 2, ticks.bottom() - pos)); } } if (horizontal) { painter->drawLine(QPoint(ticks.right(), ticks.top() + 2), QPoint(ticks.right(), ticks.top() + 8)); } else { painter->drawLine(QPoint(ticks.left() + 2, ticks.top()), QPoint(ticks.right() - 2, ticks.top())); } } break; } default: QWindowsStyle::drawComplexControl(control, option, painter, widget); } painter->restore(); } inline void JavaStyle::drawSunkenButtonShadow(QPainter *painter, QRect rect, const QColor &frameColor, bool reverse) const { painter->save(); painter->setPen(frameColor); if (!reverse) { painter->drawLine(QLine(QPoint(rect.x() + 1, rect.y() + 1), QPoint(rect.x() + rect.width() - 1, rect.y() + 1))); painter->drawLine(QLine(QPoint(rect.x() + 1, rect.y()), QPoint(rect.x() + 1, rect.y() + rect.height()))); } else { painter->drawLine(QLine(QPoint(rect.right(), rect.bottom()), QPoint(rect.right(), rect.top()))); painter->drawLine(QLine(QPoint(rect.left(), rect.top() + 1), QPoint(rect.right(), rect.top() + 1))); } painter->restore(); } inline void JavaStyle::drawButtonHoverFrame(QPainter *painter, QRect rect, const QColor &frameColor, const QColor &activeFrame) const { painter->save(); painter->setPen(activeFrame); painter->drawRect(rect); rect.adjust(1, 1, -1, -1); painter->setPen(frameColor); painter->drawRect(rect); rect.adjust(1, 1, -1, -1); painter->setPen(activeFrame); painter->drawRect(rect); painter->restore(); } QStyle::SubControl JavaStyle::hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option, const QPoint &pos, const QWidget *widget) const { SubControl ret = SC_None; switch (control) { case CC_TitleBar: { const QStyleOptionTitleBar *bar = qstyleoption_cast(option); QRect maximize = subControlRect(control, bar, SC_TitleBarMaxButton); if (maximize.contains(pos)) { ret = SC_TitleBarMaxButton; break; } QRect minimize = subControlRect(control, bar, SC_TitleBarMinButton); if (minimize.contains(pos)) { ret = SC_TitleBarMinButton; break; } QRect close = subControlRect(control, bar, SC_TitleBarCloseButton); if (close.contains(pos)) { ret = SC_TitleBarCloseButton; break; } QRect system = subControlRect(control, bar, SC_TitleBarSysMenu); if (system.contains(pos)) { ret = SC_TitleBarSysMenu; break; } ret = SC_TitleBarLabel; break; } case CC_ScrollBar: if (const QStyleOptionSlider *scrollBar = qstyleoption_cast(option)) { QRect slider = subControlRect(control, scrollBar, SC_ScrollBarSlider, widget); if (slider.contains(pos)) { ret = SC_ScrollBarSlider; break; } QRect scrollBarAddLine = subControlRect(control, scrollBar, SC_ScrollBarAddLine, widget); if (scrollBarAddLine.contains(pos)) { ret = SC_ScrollBarAddLine; break; } QRect scrollBarSubPage = subControlRect(control, scrollBar, SC_ScrollBarSubPage, widget); if (scrollBarSubPage.contains(pos)) { ret = SC_ScrollBarSubPage; break; } QRect scrollBarAddPage = subControlRect(control, scrollBar, SC_ScrollBarAddPage, widget); if (scrollBarAddPage.contains(pos)) { ret = SC_ScrollBarAddPage; break; } QRect scrollBarSubLine = subControlRect(control, scrollBar, SC_ScrollBarSubLine, widget); if (scrollBarSubLine.contains(pos)) { ret = SC_ScrollBarSubLine; break; } } break; default: ret = QWindowsStyle::hitTestComplexControl(control, option, pos, widget); } return ret; } void JavaStyle::polish(QWidget *widget) { if (qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget)) widget->setAttribute(Qt::WA_Hover, true); } void JavaStyle::unpolish(QWidget *widget) { if (qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget)) widget->setAttribute(Qt::WA_Hover, false); } void JavaStyle::drawSplitter(const QStyleOption *option, QPainter *painter, bool horizontal) const { QRect rect = option->rect; painter->setPen(Qt::NoPen); painter->setBrush(option->palette.color(QPalette::Background)); painter->drawRect(rect); QColor colors[] = { Qt::white, option->palette.color(QPalette::Mid) }; int iterations = horizontal ? rect.height() - 1 : rect.width() - 1; for (int i = 0; i < iterations; ++i) { painter->setPen(colors[i % 2]); painter->drawPoint(xySwitch(QPoint(rect.x() + 0 + (i % 4), rect.y() + i), horizontal)); } } inline QPoint JavaStyle::xySwitch(const QPoint &point, bool horizontal) const { QPoint retPoint = point; if (!horizontal) { retPoint = QPoint(point.y(), point.x()); } return retPoint; } void JavaStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { painter->save(); switch (element) { case PE_PanelButtonBevel: case PE_FrameButtonBevel: { painter->save(); painter->setBrush(option->palette.background()); painter->setPen(Qt::NoPen); painter->drawRect(option->rect); painter->restore(); break; } case PE_IndicatorBranch: { painter->save(); QColor lineColor(204, 204, 255); QPixmap openPixmap(":/images/jtreeopen.png"); QPixmap closedPixmap(":/images/jtreeclosed.png"); QRect pixmapRect(QPoint(0, 0), QSize(12, 12)); pixmapRect.moveCenter(option->rect.center()); pixmapRect.translate(2, 0); QPoint center = option->rect.center(); painter->setPen(lineColor); painter->setBrush(Qt::NoBrush); if (option->state & State_Item) { painter->drawLine(center, QPoint(option->rect.right(), center.y())); painter->drawLine(center, QPoint(center.x(), option->rect.top())); if (option->state & State_Sibling) { painter->drawLine(center, QPoint(center.x(), option->rect.bottom())); } if (option->state & State_Children) if (option->state & State_Open) painter->drawPixmap(pixmapRect.topLeft(), closedPixmap); else painter->drawPixmap(pixmapRect.topLeft(), openPixmap); } else if (option->state & State_Sibling) { painter->drawLine(center.x(), option->rect.top(), center.x(), option->rect.bottom()); } painter->restore(); break; } case PE_IndicatorViewItemCheck: { break; } case PE_FrameWindow: { painter->save(); bool active = option->state & State_Active; painter->setPen(Qt::NoPen); painter->setBrush(active ? option->palette.color(QPalette::Midlight) : option->palette.color(QPalette::Mid)); painter->drawRect(QRect(option->rect.topLeft(), option->rect.bottomLeft() + QPoint(5, 0))); painter->drawRect(QRect(option->rect.bottomLeft(), option->rect.bottomRight() + QPoint(0, -5))); painter->drawRect(QRect(option->rect.bottomRight() + QPoint(-5, 0), option->rect.topRight())); painter->drawRect(QRect(option->rect.topLeft(), option->rect.topRight() + QPoint(0, 4))); painter->setBrush(Qt::NoBrush); painter->setPen(option->palette.color(QPalette::Active, QPalette::WindowText)); painter->drawLine(option->rect.topLeft() + QPoint(2, 14), option->rect.bottomLeft() + QPoint(2, -14)); painter->drawLine(option->rect.topRight() + QPoint(-2, 14), option->rect.bottomRight() + QPoint(-2, -14)); painter->drawLine(option->rect.topLeft() + QPoint(14, 2), option->rect.topRight() + QPoint(-14, 2)); painter->drawLine(option->rect.bottomLeft() + QPoint(14, -2), option->rect.bottomRight() + QPoint(-14, -2)); painter->setPen(active ? option->palette.color(QPalette::Light) : option->palette.color(QPalette::Button)); painter->drawLine(option->rect.topLeft() + QPoint(3, 15), option->rect.bottomLeft() + QPoint(3, -13)); painter->drawLine(option->rect.topRight() + QPoint(-1, 15), option->rect.bottomRight() + QPoint(-1, -13)); painter->drawLine(option->rect.topLeft() + QPoint(15, 3), option->rect.topRight() + QPoint(-13, 3)); painter->drawLine(option->rect.bottomLeft() + QPoint(15, -1), option->rect.bottomRight() + QPoint(-13, -1)); painter->restore(); break; } case PE_IndicatorSpinUp: { const QStyleOptionSpinBox *spinner = qstyleoption_cast(option); int add = spinner->state & State_Sunken && spinner->activeSubControls & SC_SpinBoxUp ? 1 : 0; QPoint center = option->rect.center(); painter->drawLine(center.x() + add, center.y() + 1 + add, center.x() + 2 + add, center.y() + 1 + add); painter->drawPoint(center.x() + 1 + add, center.y() + add); break; } case PE_IndicatorSpinDown: { const QStyleOptionSpinBox *spinner = qstyleoption_cast(option); int add = spinner->state & State_Sunken && spinner->activeSubControls & SC_SpinBoxDown ? 1 : 0; QPoint center = option->rect.center(); painter->drawLine(center.x() + add, center.y() + add, center.x() + 2 + add, center.y() + add); painter->drawPoint(center.x() + 1 + add, center.y() + 1 + add); break; } case PE_FrameDockWidget: { drawPrimitive(PE_FrameWindow, option, painter, widget); break; } case PE_IndicatorToolBarHandle: { QPoint offset; bool horizontal = option->state & State_Horizontal; if (horizontal) offset = option->rect.topLeft(); else offset = option->rect.topLeft(); int iterations = horizontal ? option->rect.height() : option->rect.width(); for (int i = 0; i < iterations; ++i) { painter->setPen(i % 2 ? Qt::white : option->palette.color(QPalette::Mid)); int add = i % 4; painter->drawPoint(offset + xySwitch(QPoint(add, i), horizontal)); painter->drawPoint(offset + xySwitch(QPoint(add + 4, i), horizontal)); if (add + 8 < 10) painter->drawPoint(offset + xySwitch(QPoint(add + 8, i), horizontal)); } break; } case PE_IndicatorToolBarSeparator: { break; } case PE_PanelButtonTool: { const QStyleOptionToolButton *button = qstyleoption_cast(option); if (!button) { painter->setPen(Qt::red); if (!(option->state & State_Enabled)) painter->drawRect(option->rect.adjusted(0, 0, -1, -1)); drawButtonBackground(option, painter, false); break; } if (button->state & State_MouseOver || button->state & State_On) { QStyleOptionButton bevel; bevel.state = button->state; bevel.rect = button->rect; bevel.palette = button->palette; drawButtonBackground(&bevel, painter, false); } else { painter->setPen(Qt::NoPen); painter->setBrush(button->palette.color(QPalette::Background)); painter->drawRect(button->rect.adjusted(0, 0, -1, -1)); } break; } case PE_FrameMenu: { painter->setPen(option->palette.color(QPalette::Midlight)); painter->drawRect(option->rect.adjusted(0, 0, -1, -1)); break; } case PE_PanelButtonCommand: { const QStyleOptionButton *btn = qstyleoption_cast(option); bool hover = (btn->state & State_Enabled) && (btn->state & State_MouseOver); bool sunken = btn->state & State_Sunken; bool isDefault = btn->features & QStyleOptionButton::DefaultButton; bool on = option->state & State_On; drawButtonBackground(option, painter, false); QRect rect = option->rect.adjusted(0, 0, -1, -1); if (hover && !sunken && !isDefault && !on) { drawButtonHoverFrame(painter, rect, btn->palette.color(QPalette::Mid), btn->palette.color(QPalette::Button)); } else if (isDefault) { drawPrimitive(PE_FrameDefaultButton, option, painter, widget); } break; } case PE_FrameDefaultButton: { painter->setPen(option->palette.color(QPalette::Mid)); QRect rect = option->rect.adjusted(0, 0, -1, -1); painter->drawRect(rect); painter->drawRect(rect.adjusted(1, 1, -1, -1)); break; } //! [0] case PE_IndicatorCheckBox: { painter->save(); drawButtonBackground(option, painter, true); if (option->state & State_Enabled && option->state & State_MouseOver && !(option->state & State_Sunken)) { painter->setPen(option->palette.color(QPalette::Button)); QRect rect = option->rect.adjusted(1, 1, -2, -2); painter->drawRect(rect); rect = rect.adjusted(1, 1, -1, -1); painter->drawRect(rect); } if (option->state & State_On) { QImage image(":/images/checkboxchecked.png"); painter->drawImage(option->rect.topLeft(), image); } painter->restore(); break; //! [0] } case PE_IndicatorRadioButton: { painter->save(); QBrush radioBrush = option->palette.button(); if (!(option->state & State_Sunken) && option->state & State_Enabled) radioBrush = gradientBrush(option->rect); painter->setBrush(radioBrush); if (option->state & State_Enabled) painter->setPen(option->palette.color(QPalette::Mid)); else painter->setPen(option->palette.color(QPalette::Disabled, QPalette::WindowText)); painter->drawEllipse(option->rect.adjusted(0, 0, -1, -1)); if (option->state & State_MouseOver && option->state & State_Enabled && !(option->state & State_Sunken)) { gradientBrush(option->rect); painter->setPen(option->palette.color(QPalette::Button)); painter->setBrush(Qt::NoBrush); QRect rect = option->rect.adjusted(1, 1, -2, -2); painter->drawEllipse(rect); rect = rect.adjusted(1, 1, -1, -1); painter->drawEllipse(rect); } if (option->state & State_On) { painter->setBrush(option->palette.color(QPalette::Text)); painter->setPen(Qt::NoPen); painter->drawEllipse(option->rect.adjusted(3, 3, -3, -3)); } if (option->state & State_Sunken && option->state & State_Enabled) { painter->setPen(option->palette.color(QPalette::Mid)); painter->drawArc(option->rect.adjusted(1, 1, -2, -2), 80 * 16, 100 * 16); } painter->restore(); break; } case PE_FrameTabWidget: { painter->setPen(option->palette.color(QPalette::Midlight)); painter->drawRect(option->rect.adjusted(0, 0, -1, -1)); painter->setPen(Qt::white); painter->drawRect(option->rect.adjusted(1, 1, -2, -2)); break; } case PE_Frame: case PE_FrameLineEdit: { const QStyleOptionFrame *frame = qstyleoption_cast(option); const QStyleOptionFrameV2 frameV2(*frame); painter->setPen(frame->palette.color(QPalette::Mid)); painter->drawRect(frameV2.rect.adjusted(0, 0, -2, -2)); painter->setPen(Qt::white); painter->drawRect(frameV2.rect.adjusted(1, 1, -1, -1)); painter->setPen(frameV2.palette.color(QPalette::Active, QPalette::Background)); painter->drawLine(frameV2.rect.bottomLeft(), frameV2.rect.bottomLeft() + QPoint(1, -1)); painter->drawLine(frameV2.rect.topRight(), frameV2.rect.topRight() + QPoint(-1, 1)); break; } case PE_FrameFocusRect: { painter->setPen(option->palette.color(QPalette::Light)); painter->setBrush(Qt::NoBrush); QRect rect = option->rect; rect = rect.adjusted(0,0, -1, -1); painter->drawRect(rect); break; } default: QWindowsStyle::drawPrimitive(element, option, painter, widget); } painter->restore(); } //! [1] void JavaStyle::drawButtonBackground(const QStyleOption *option, QPainter *painter, bool isCheckbox) const { QBrush buttonBrush = option->palette.button(); bool sunken = option->state & State_Sunken; bool disabled = !(option->state & State_Enabled); bool on = option->state & State_On; if (!sunken && !disabled && (!on || isCheckbox)) buttonBrush = gradientBrush(option->rect); painter->fillRect(option->rect, buttonBrush); QRect rect = option->rect.adjusted(0, 0, -1, -1); if (disabled) painter->setPen(option->palette.color(QPalette::Disabled, QPalette::WindowText)); else painter->setPen(option->palette.color(QPalette::Mid)); painter->drawRect(rect); if (sunken && !disabled) { drawSunkenButtonShadow(painter, rect, option->palette.color(QPalette::Mid), option->direction == Qt::RightToLeft); } } //! [1] QBrush JavaStyle::gradientBrush(const QRect &rect) const { QLinearGradient gradient(rect.topLeft(), rect.bottomLeft()); gradient.setColorAt(1.0, QColor(188, 210, 230)); gradient.setColorAt(0.3, Qt::white); gradient.setColorAt(0.0, QColor(223, 233, 243)); return QBrush(gradient); } QRect JavaStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const { QRect rect; switch (element) { case SE_ToolBoxTabContents: { const QStyleOptionToolBox *box = qstyleoption_cast(option); rect.moveTopLeft(box->rect.topLeft() + QPoint(0, 2)); rect.setHeight(box->rect.height() - 4); rect.setWidth(box->fontMetrics.width(box->text) + 15); break; } case SE_ProgressBarLabel: case SE_ProgressBarGroove: case SE_ProgressBarContents: { rect = option->rect.adjusted(1, 1, -1, -1); break; } case SE_PushButtonFocusRect: { const QStyleOptionButton *btn = qstyleoption_cast(option); rect = btn->fontMetrics.boundingRect(btn->text); rect = QRect(0, 0, btn->fontMetrics.width(btn->text), rect.height()); if (!btn->icon.isNull()) { rect.adjust(0, 0, btn->iconSize.width(), btn->iconSize.height() > rect.height() ? btn->iconSize.height() - rect.height() : 0); rect.translate(-btn->iconSize.width(), 0); rect.adjust(-1, -1, 1, 1); } rect = QRect(int(ceil((btn->rect.width() - rect.width()) / 2.0)), int(ceil((btn->rect.height() - rect.height()) / 2.0)), rect.width() - 1, rect.height()); rect.adjust(-1, 0, 1, 0); break; } default: rect = QWindowsStyle::subElementRect(element, option, widget); } return rect; } int JavaStyle::pixelMetric(PixelMetric metric, const QStyleOption* /* option */, const QWidget* /*widget*/) const { int value = 0; switch (metric) { case PM_ButtonShiftHorizontal: case PM_ButtonShiftVertical: case PM_TabBarTabShiftHorizontal: case PM_ButtonDefaultIndicator: case PM_TabBarTabShiftVertical: value = 0; break; case PM_TabBarBaseOverlap: case PM_DefaultFrameWidth: value = 2; break; case PM_TabBarTabVSpace: value = 4; break; case PM_ScrollBarExtent: value = 16; break; case PM_ScrollBarSliderMin: value = 26; break; case PM_SplitterWidth: value = 8; break; case PM_SliderThickness: value = 16; break; case PM_SliderControlThickness: value = 16; break; case PM_SliderTickmarkOffset: value = 10; break; case PM_SliderSpaceAvailable: break; case PM_MenuPanelWidth: value = 1; break; case PM_MenuVMargin: value = 2; break; case PM_MenuBarPanelWidth: value = 1; break; case PM_MenuBarItemSpacing: value = 0; break; case PM_MenuBarHMargin: value = 3; break; case PM_MenuBarVMargin: value = 0; break; case PM_ComboBoxFrameWidth: value = 1; break; case PM_MenuButtonIndicator: value = 15; break; case PM_ToolBarItemMargin: value = 3; break; case PM_ToolBarHandleExtent: value = 13; break; case PM_SpinBoxFrameWidth: value = 2; break; case PM_TitleBarHeight: { value = 21; break; case PM_MDIFrameWidth: value = 6; break; } case PM_DockWidgetFrameWidth: { value = 5; break; } default: value = QWindowsStyle::pixelMetric(metric); } return value; } int JavaStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const { int ret; switch (hint) { case SH_Table_GridLineColor: { ret = static_cast(option->palette.color(QPalette::Mid).rgb()); break; } case QStyle::SH_Menu_Scrollable: ret = 1; break; default: ret = QWindowsStyle::styleHint(hint, option, widget, returnData); } return ret; } QPixmap JavaStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *option, const QWidget *widget) const { QPixmap pixmap = QWindowsStyle::standardPixmap(standardPixmap, option, widget); QPixmap maximizePixmap(":/images/internalmaximize.png"); QPixmap minimizePixmap(":/images/internalminimize.png"); QPixmap closePixmap(":/images/internalclose.png"); QPixmap internalPixmap(":/images/internalsystem.png"); QPixmap internalCloseDownPixmap(":/images/internalclosedown.png"); QPixmap minimizeDownPixmap(":/images/internalminimizedown.png"); QPixmap maximizeDownPixmap(":/images/internalmaximizedown.png"); QPixmap dirOpenPixmap(":/images/open24.png"); QPixmap filePixmap(":/images/file.png"); switch (standardPixmap) { case SP_DirLinkIcon: case SP_DirClosedIcon: case SP_DirIcon: case SP_DirOpenIcon: { pixmap = closePixmap; break; } case SP_FileIcon: { pixmap = filePixmap; break; } case SP_FileDialogBack: { pixmap = QPixmap(":/images/fileback.png"); break; } case SP_FileDialogToParent: { pixmap = QPixmap(":/images/fileparent.png"); break; } case SP_FileDialogNewFolder: { pixmap = QPixmap(":/images/open24.png"); break; } case SP_FileDialogListView: { pixmap = QPixmap(":/images/filelist.png"); break; } case SP_FileDialogDetailedView: { pixmap = QPixmap(":/images/filedetail.png"); break; } case SP_MessageBoxInformation: { pixmap = QPixmap(":/images/information.png"); break; } case SP_MessageBoxWarning: { pixmap = QPixmap(":/images/warning.png"); } case SP_MessageBoxCritical: { pixmap = QPixmap(":/images/critical.png"); break; } case SP_MessageBoxQuestion: { pixmap = QPixmap(":/images/question.png"); break; } case SP_TitleBarNormalButton: pixmap = maximizePixmap; break; case SP_TitleBarCloseButton: pixmap = closePixmap; break; default: ; } return pixmap; } QSize JavaStyle::sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const { switch (type) { case CT_ComboBox: { return QSize(contentsSize.width() + 27, contentsSize.height()); } case CT_Slider: { const QStyleOptionSlider *slider = qstyleoption_cast(option); if (slider->tickPosition == QSlider::TicksBelow) { return QSize(contentsSize.width(), contentsSize.height() + 15); } else { return contentsSize; } } case CT_MenuBarItem: { const QStyleOptionMenuItem *menuItem = qstyleoption_cast(option); QFontMetrics metrics(menuItem->font); QRect boundingRect = metrics.boundingRect(menuItem->text); int width = boundingRect.width() + 14; int height = boundingRect.height() + 3; if (height < 20) height = 20; return QSize(width, height); } case CT_MenuItem: { const QStyleOptionMenuItem *menuItem = qstyleoption_cast(option); QSize defaultSize = QWindowsStyle::sizeFromContents(type, option, contentsSize, widget); if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) return defaultSize; int width = 30; int height = 0; if (!menuItem->icon.isNull()) { width += 20; height += 20; } if (!menuItem->text.isEmpty()) { QFontMetrics metrics(menuItem->font); QString text = menuItem->text; text.remove(QLatin1Char('\t')); QRect textRect = metrics.boundingRect(text); width += textRect.width(); if (height < textRect.height()) height += textRect.height(); } if (menuItem->checkType != QStyleOptionMenuItem::NotCheckable) { width += 10; if (height < 10) height = 10; } return QSize(width, height); } default: return QWindowsStyle::sizeFromContents(type, option, contentsSize, widget); } } ================================================ FILE: doc/codesnippets/doc/src/snippets/layouts/layouts.cpp ================================================ /############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################/ //! [0] window = QWidget() //! [0] //! [1] button1 = QPushButton("One") //! [1] //! [2] button2 = QPushButton("Two") button3 = QPushButton("Three") button4 = QPushButton("Four") button5 = QPushButton("Five") //! [2] //! [3] layout = QHBoxLayout() //! [3] //! [4] layout.addWidget(button1) layout.addWidget(button2) layout.addWidget(button3) layout.addWidget(button4) layout.addWidget(button5) window.setLayout(layout) //! [4] //! [5] window.show() //! [5] //! [6] window = QWidget() //! [6] //! [7] button1 = QPushButton("One") //! [7] //! [8] button2 = QPushButton("Two") button3 = QPushButton("Three") button4 = QPushButton("Four") button5 = QPushButton("Five") //! [8] //! [9] layout = QVBoxLayout() //! [9] //! [10] layout.addWidget(button1) layout.addWidget(button2) layout.addWidget(button3) layout.addWidget(button4) layout.addWidget(button5) window.setLayout(layout) //! [10] //! [11] window.show() //! [11] //! [12] window = QWidget() //! [12] //! [13] button1 = QPushButton("One") //! [13] //! [14] button2 = QPushButton("Two") button3 = QPushButton("Three") button4 = QPushButton("Four") button5 = QPushButton("Five") //! [14] //! [15] layout = QGridLayout() //! [15] //! [16] layout.addWidget(button1, 0, 0) layout.addWidget(button2, 0, 1) layout.addWidget(button3, 1, 0, 1, 2) layout.addWidget(button4, 2, 0) layout.addWidget(button5, 2, 1) window.setLayout(layout) //! [16] //! [17] window.show() //! [17] ================================================ FILE: doc/codesnippets/doc/src/snippets/mainwindowsnippet.cpp ================================================ /############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################/ //! [0] dockWidget = QDockWidget(tr("Dock Widget"), self) dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) dockWidget.setWidget(dockWidgetContents) addDockWidget(Qt.LeftDockWidgetArea, dockWidget) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/matrix/matrix.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] def paintEvent(self, event): painter = QPainter(self) painter.setPen(QPen(Qt.blue, 1, Qt.DashLine)) painter.drawRect(0, 0, 100, 100) painter.rotate(45) painter.setFont(QFont("Helvetica", 24)) painter.setPen(QPen(Qt.black, 1)) painter.drawText(20, 10, "QMatrix") //! [0] //! [1] def paintEvent(self, event) painter = QPainter(self) painter.setPen(QPen(Qt.blue, 1, Qt.DashLine)) painter.drawRect(0, 0, 100, 100) matrix = QMatrix() matrix.translate(50, 50) matrix.rotate(45) matrix.scale(0.5, 1.0) painter.setMatrix(matrix) painter.setFont(QFont("Helvetica", 24)) painter.setPen(QPen(Qt.black, 1)) painter.drawText(20, 10, "QMatrix") //! [1] //! [2] def paintEvent(self, event) pi = 3.14 a = pi/180 * 45.0 sina = sin(a) cosa = cos(a) translationMatrix = QMatrix(1, 0, 0, 1, 50.0, 50.0) rotationMatrix = QMatrix(cosa, sina, -sina, cosa, 0, 0) scalingMatrix = QMatrix(0.5, 0, 0, 1.0, 0, 0) matrix = QMatrix() matrix = scalingMatrix * rotationMatrix * translationMatrix painter = QPainter(self) painter.setPen(QPen(Qt.blue, 1, Qt::DashLine)) painter.drawRect(0, 0, 100, 100) painter.setMatrix(matrix) painter.setFont(QFont("Helvetica", 24)) painter.setPen(QPen(Qt.black, 1)) painter.drawText(20, 10, "QMatrix") //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/mdiareasnippets.cpp ================================================ /############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################/ //! [0] mainWindow = QMainWindow() mainWindow.setCentralWidget(mdiArea) //! [0] //! [1] mdiArea = QMdiArea() subWindow1 = QMdiSubWindow() subWindow1.setWidget(internalWidget1) subWindow1.setAttribute(Qt.WA_DeleteOnClose) mdiArea.addSubWindow(subWindow1) subWindow2 = QMdiSubWindow() mdiArea.addSubWindow(internalWidget2) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/medianodesnippet.cpp ================================================ #include #include #include #include #include #include int main(int argv, char **args) { QApplication app(argv, args); //![0] Phonon::MediaObject *mediaObject = new Phonon::MediaObject; Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput; Phonon::VideoWidget *videoWidget = new Phonon::VideoWidget; Phonon::createPath(mediaObject, audioOutput); Phonon::createPath(mediaObject, videoWidget); QList inputPaths = audioOutput->inputPaths(); // inputPaths = [ mediaObject ] QList outputPaths = mediaObject->outputPaths(); // outputPaths = [ audioOutput, videoWidget ] //![0] return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/moc/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "myclass1.h" MyClass::MyClass(QObject *) {} MyClass::~MyClass() {} void MyClass::mySlot() {} #undef MyClass #include "myclass2.h" MyClass::MyClass(QObject *) {} MyClass::~MyClass() {} void MyClass::setPriority(Priority) {} MyClass::Priority MyClass::priority() const { return High; } #undef MyClass #include "myclass3.h" MyClass::MyClass(QObject *) {} MyClass::~MyClass() {} #undef MyClass int main() { return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/moc/myclass1.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MYCLASS1_H #define MYCLASS1_H #include #define MyClass MyClass1 //! [0] class MyClass : public QObject { Q_OBJECT public: MyClass(QObject *parent = 0); ~MyClass(); signals: void mySignal(); public slots: void mySlot(); }; //! [0] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/moc/myclass2.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MYCLASS2_H #define MYCLASS2_H #include #define MyClass MyClass2 //! [0] class MyClass : public QObject { Q_OBJECT Q_PROPERTY(Priority priority READ priority WRITE setPriority) Q_ENUMS(Priority) public: enum Priority { High, Low, VeryHigh, VeryLow }; MyClass(QObject *parent = 0); ~MyClass(); void setPriority(Priority priority); Priority priority() const; }; //! [0] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/moc/myclass3.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MYCLASS3_H #define MYCLASS3_H #include //! [0] class MyClass : public QObject { Q_OBJECT Q_CLASSINFO("Author", "Oscar Peterson") Q_CLASSINFO("Status", "Active") public: MyClass(QObject *parent = 0); ~MyClass(); }; //! [0] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/modelview-subclasses/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* main.cpp An example of a main window application that used a subclassed model and view to display data from sound files. */ #include #include "model.h" #include "view.h" #include "window.h" /*! The main function for the linear model example. This creates and populates a model with long integers then displays the contents of the model using a QListView widget. */ int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/modelview-subclasses/model.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* model.cpp A simple model that uses a QVector as its data source. */ #include "model.h" /*! Returns the number of items in the string list as the number of rows in the model. */ int LinearModel::rowCount(const QModelIndex &parent) const { Q_USING(parent); return values.count(); } /* Returns an appropriate value for the requested data. If the view requests an invalid index, an invalid variant is returned. If a header is requested then we just return the column or row number, depending on the orientation of the header. Any valid index that corresponds to a string in the list causes that string to be returned. */ /*! Returns a model index for other component to use when referencing the item specified by the given row, column, and type. The parent index is ignored. */ QModelIndex LinearModel::index(int row, int column, const QModelIndex &parent) const { if (parent == QModelIndex() && row >= 0 && row < rowCount() && column == 0) return createIndex(row, column, 0); else return QModelIndex(); } QVariant LinearModel::data(const QModelIndex &index, int role) const { Q_UNUSED(role); if (!index.isValid()) return QVariant(); return values.at(index.row()); } /*! Returns Qt::ItemIsEditable so that all items in the vector can be edited. */ Qt::ItemFlags LinearModel::flags(const QModelIndex &index) const { // all items in the model are editable return QAbstractListModel::flags(index) | Qt::ItemIsEditable; } /*! Changes an item in the string list, but only if the following conditions are met: * The index supplied is valid. * The index corresponds to an item to be shown in a view. * The role associated with editing text is specified. The dataChanged() signal is emitted if the item is changed. */ bool LinearModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid() || role != Qt::EditRole) return false; values.replace(index.row(), value.toInt()); emit dataChanged(index, index); return true; } /*! Inserts a number of rows into the model at the specified position. */ bool LinearModel::insertRows(int position, int rows, const QModelIndex &parent) { beginInsertRows(parent, position, position + rows - 1); values.insert(position, rows, 0); endInsertRows(); return true; } /*! Removes a number of rows from the model at the specified position. */ bool LinearModel::removeRows(int position, int rows, const QModelIndex &parent) { beginRemoveRows(QModelIndex(), position, position+rows-1); values.remove(position, rows); endRemoveRows(); return true; } ================================================ FILE: doc/codesnippets/doc/src/snippets/modelview-subclasses/model.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MODEL_H #define MODEL_H #include #include #include class LinearModel : public QAbstractListModel { Q_OBJECT public: LinearModel(QObject *parent = 0) : QAbstractListModel(parent) {} int rowCount(const QModelIndex &parent = QModelIndex()) const; QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex()); private: QVector values; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/modelview-subclasses/view.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! view.cpp Provides a view to represent a one-dimensional sequence of integers obtained from a list model as a series of rows. */ #include #include #include #include #include #include #include #include #include #include #include "view.h" LinearView::LinearView(QWidget *parent) : QAbstractItemView(parent) { setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); } /*! Returns the position of the item in viewport coordinates. */ QRect LinearView::itemViewportRect(const QModelIndex &index) const { QRect rect = itemRect(index); QRect result(rect.left() - horizontalScrollBar()->value(), rect.top() - verticalScrollBar()->value(), rect.width(), viewport()->height()); return result; } /*! Returns the rectangle of the item at position \a index in the model. The rectangle is in contents coordinates. */ QRect LinearView::itemRect(const QModelIndex &index) const { if (!index.isValid()) return QRect(); else return QRect(index.row(), 0, 1, 1); } void LinearView::ensureVisible(const QModelIndex &index) { QRect area = viewport()->rect(); QRect rect = itemViewportRect(index); if (rect.left() < area.left()) horizontalScrollBar()->setValue( horizontalScrollBar()->value() - rect.left()); else if (rect.right() > area.right()) horizontalScrollBar()->setValue( horizontalScrollBar()->value() + rect.left() - area.width()); } /*! Returns the item that covers the coordinate given in the view. */ QModelIndex LinearView::itemAt(int x, int /* y */) const { int row = x + horizontalScrollBar()->value(); return model()->index(row, 0, QModelIndex()); } //void LinearView::dataChanged(const QModelIndex &/* topLeft */, // const QModelIndex &/* bottomRight */) //{ // updateGeometries(); // if (isVisible()) // repaint(); //} void LinearView::rowsInserted(const QModelIndex &/* parent */, int /* start */, int /* end */) { updateGeometries(); if (isVisible()) repaint(); } void LinearView::rowsRemoved(const QModelIndex &/* parent */, int /* start */, int /* end */) { updateGeometries(); if (isVisible()) repaint(); } /* void LinearView::verticalScrollbarAction(int action) { } void LinearView::horizontalScrollbarAction(int action) { } */ /*! Select the items in the model that lie within the rectangle specified by \a rect, using the selection \a command. */ void LinearView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) { QModelIndex leftIndex = itemAt(rect.left(), 0); QModelIndex rightIndex = itemAt(rect.right(), 0); QItemSelection selection(leftIndex, rightIndex); selectionModel()->select(selection, command); } QModelIndex LinearView::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers) { QModelIndex current = currentIndex(); switch (cursorAction) { case MoveLeft:{ if (current.row() > 0) return model()->index(current.row() - 1, 0, QModelIndex()); else return model()->index(0, 0, QModelIndex()); break;} case MoveRight:{ if (current.row() < rows(current) - 1) return model()->index(current.row() + 1, 0, QModelIndex()); else return model()->index(rows(current) - 1, 0,QModelIndex()); break;} case MoveUp: return current; case MoveDown: return current; case MovePageUp: return current; case MovePageDown: return current; case MoveHome: return model()->index(0, 0, QModelIndex()); case MoveEnd: return model()->index(rows(current) - 1, 0, QModelIndex()); default: return current; } } int LinearView::horizontalOffset() const { return horizontalScrollBar()->value(); } int LinearView::verticalOffset() const { return verticalScrollBar()->value(); } /*! Returns a rectangle corresponding to the selection in viewport cooridinates. */ QRect LinearView::selectionViewportRect(const QItemSelection &selection) const { int ranges = selection.count(); if (ranges == 0) return QRect(); // Note that we use the top and bottom functions of the selection range // since the data is stored in rows. int firstRow = selection.at(0).top(); int lastRow = selection.at(0).top(); for (int i = 0; i < ranges; ++i) { firstRow = qMin(firstRow, selection.at(i).top()); lastRow = qMax(lastRow, selection.at(i).bottom()); } QModelIndex firstItem = model()->index(qMin(firstRow, lastRow), 0, QModelIndex()); QModelIndex lastItem = model()->index(qMax(firstRow, lastRow), 0, QModelIndex()); QRect firstRect = itemViewportRect(firstItem); QRect lastRect = itemViewportRect(lastItem); return QRect(firstRect.left(), firstRect.top(), lastRect.right() - firstRect.left(), firstRect.height()); } void LinearView::paintEvent(QPaintEvent *event) { QPainter painter(viewport()); QRect updateRect = event->rect(); QBrush background(Qt::black); QPen foreground(Qt::white); painter.fillRect(updateRect, background); painter.setPen(foreground); QModelIndex firstItem = itemAt(updateRect.left(), updateRect.top()); if (!firstItem.isValid()) firstItem = model()->index(0, 0, QModelIndex()); QModelIndex lastItem = itemAt(updateRect.right(), updateRect.bottom()); if (!lastItem.isValid()) lastItem = model()->index(rows() - 1, 0, QModelIndex()); int x = updateRect.left(); //int top = updateRect.top(); //int bottom = updateRect.bottom(); int row = firstItem.row(); QModelIndex index = model()->index(row, 0, QModelIndex()); int value = model()->data(index, Qt::DisplayRole).toInt(); int midPoint = viewport()->height()/2; int y2 = midPoint - int(value * midPoint/255.0); while (row <= lastItem.row()) { QModelIndex index = model()->index(row, 0, QModelIndex()); int value = model()->data(index, Qt::DisplayRole).toInt(); int y1 = y2; y2 = midPoint - int(value * midPoint/255.0); painter.drawLine(x-1, y1, x, y2); ++row; ++x; } } void LinearView::resizeEvent(QResizeEvent * /* event */) { updateGeometries(); } void LinearView::updateGeometries() { if (viewport()->width() < rows()) { horizontalScrollBar()->setPageStep(viewport()->width()); horizontalScrollBar()->setRange(0, rows() - viewport()->width() - 1); } } QSize LinearView::sizeHint() const { return QSize(rows(), 200); } int LinearView::rows(const QModelIndex &index) const { return model()->rowCount(model()->parent(index)); } bool LinearView::isIndexHidden(const QModelIndex &index) const { return false; } ================================================ FILE: doc/codesnippets/doc/src/snippets/modelview-subclasses/view.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIEW_H #define VIEW_H #include #include #include #include #include #include #include class LinearView : public QAbstractItemView { Q_OBJECT public: LinearView(QWidget *parent = 0); QRect itemViewportRect(const QModelIndex &index) const; void ensureVisible(const QModelIndex &index); QModelIndex itemAt(int x, int y) const; protected slots: /*void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);*/ void rowsInserted(const QModelIndex &parent, int start, int end); void rowsRemoved(const QModelIndex &parent, int start, int end); /*void selectionChanged(const QItemSelection &deselected, const QItemSelection &selected); void verticalScrollbarAction(int action); void horizontalScrollbarAction(int action);*/ protected: void setSelection(const QRect&, QItemSelectionModel::SelectionFlags command); QRect selectionViewportRect(const QItemSelection &selection) const; QRect itemRect(const QModelIndex &item) const; bool isIndexHidden(const QModelIndex &index) const; int horizontalOffset() const; int verticalOffset() const; QModelIndex moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers); void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *event); QSize sizeHint() const; private: int rows(const QModelIndex &index = QModelIndex()) const; void updateGeometries(); }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/modelview-subclasses/window.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include "window.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle("Model/View example"); setupModelView(); QAction *openAction = new QAction(tr("&Open"), this); QAction *quitAction = new QAction(tr("E&xit"), this); QMenu *fileMenu = new QMenu(tr("&File"), this); fileMenu->addAction(openAction); fileMenu->addAction(quitAction); menuBar()->addMenu(fileMenu); connect(openAction, SIGNAL(triggered()), this, SLOT(selectOpenFile())); connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); setCentralWidget(view); } void MainWindow::setupModelView() { model = new LinearModel(this); view = new LinearView(this); view->setModel(model); } void MainWindow::selectOpenFile() { QString fileName = QFileDialog::getOpenFileName(this, tr("Select a file to open"), "", tr("Sound files (*.wav)")); if (!fileName.isEmpty()) openFile(fileName); } void MainWindow::openFile(const QString &fileName) { QFile file(fileName); int length = file.size(); if (file.open(QFile::ReadOnly)) { model->removeRows(0, model->rowCount()); int rows = (length - 0x2c)/2; model->insertRows(0, rows); // Perform some dodgy tricks to extract the data from the file. QDataStream stream(&file); stream.setByteOrder(QDataStream::LittleEndian); Q_INT16 left; Q_INT16 right; for (int row = 0; row < rows; ++row) { QModelIndex index = model->index(row); stream >> left >> right; model->setData(index, int(left / 256)); } } } ================================================ FILE: doc/codesnippets/doc/src/snippets/modelview-subclasses/window.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include #include #include "model.h" #include "view.h" class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow::MainWindow(QWidget *parent = 0); public slots: void selectOpenFile(); private: void setupModelView(); void openFile(const QString &fileName); LinearModel *model; LinearView *view; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/myscrollarea.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ from PySide.QtCore import * from PySide.QtGui import * import sys class MyScrollArea (QAbstractScrollArea): widget = None def __init__(widget): self.setWidget(widget); def setWidget(w): self.widget = w; self.widget.setParent(viewport()); if not self.widget.testAttribute(Qt.WA_Resized): self.widget.resize(widget.sizeHint()) self.verticalScrollBar().setValue(0) self.verticalScrollBar().setValue(0) self.updateArea() def updateWidgetPosition(): //! [0] hvalue = self.horizontalScrollBar().value() vvalue = self.verticalScrollBar().value() topLeft = self.viewport().rect().topLeft() self.widget.move(topLeft.x() - hvalue, topLeft.y() - vvalue) //! [0] def scrollContentsBy(dx, dy): self.updateWidgetPosition() def updateArea(): //! [1] areaSize = viewport().size() widgetSize = widget.size() self.verticalScrollBar().setPageStep(widgetSize.height()) self.horizontalScrollBar().setPageStep(widgetSize.width()) self.verticalScrollBar().setRange(0, widgetSize.height() - areaSize.height()) self.horizontalScrollBar().setRange(0, widgetSize.width() - areaSize.width()) self.updateWidgetPosition() //! [1] def resizeEvent(QResizeEvent): self.updateArea() app = QApplication(sys.argv) pixmap = QPixmap("mypixmap.png") label = QLabel() label.setPixmap(pixmap) area = MyScrollArea(label) area.resize(300, 300) area.show() area.setWidget(label) app.exec_(); ================================================ FILE: doc/codesnippets/doc/src/snippets/network/tcpwait.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ from PySide.QtGui import * from PySide.QtNetwork import QTcpSocket def main(): app = QCoreApplication() socket = QTcpSocket() socket.connectToHost("localhost", 1025) //! [0] numRead = 0 numReadTotal = 0 while(True): buffer = socket.read(50) # do whatever with array numReadTotal += buffer.size() if (buffer.size() == 0 && !socket.waitForReadyRead()): break //! [0] return app.exec_() ================================================ FILE: doc/codesnippets/doc/src/snippets/ntfsp.cpp ================================================ //! [0] extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; //! [0] //! [1] qt_ntfs_permission_lookup += 1 // turn checking on qt_ntfs_permission_lookup += 1 // turn it off again //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/painterpath/painterpath.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argc, char **argv) { QApplication app(argc, argv); QImage image(100, 100, QImage::Format_RGB32); QPainterPath path; path.addRect(20, 20, 60, 60); path.moveTo(0, 0); path.cubicTo(99, 0, 50, 50, 99, 99); path.cubicTo(0, 99, 50, 50, 0, 0); QPainter painter(&image); painter.fillRect(0, 0, 100, 100, Qt::white); painter.save(); painter.translate(0.5, 0.5); painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); painter.setBrush(QColor(122, 163, 39)); painter.setRenderHint(QPainter::Antialiasing); painter.drawPath(path); painter.restore(); painter.end(); QLabel lab; lab.setPixmap(QPixmap::fromImage(image)); lab.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/anyHTMLElement.xq ================================================ doc('data.xml')/*:body ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/anyXLinkAttribute.xq ================================================ declare namespace xlink = "http://www.w3.org/1999/xlink"; doc('image.svg')//@xlink:* ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/bracesIncluded.xq ================================================ {sum((1, 2, 3))} ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/bracesIncludedResult.xml ================================================ 6 ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/bracesOmitted.xq ================================================ sum({(1, 2, 3)}) ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/bracesOmittedResult.xml ================================================ sum(1 2 3) ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/computedTreeFragment.xq ================================================ declare default element namespace "http://example.com/Namespace"; declare variable $documentElementName := "doc"; element {$documentElementName} { attribute xml:base {"http://example.com/"}, element anotherElement { comment {" a comment "}, processing-instruction target {"data"}, element anotherElement {()}, text {"some text"} } } ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/copyAttribute.xq ================================================

{ doc('feed.rss')/rss/@version }

================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/copyID.xq ================================================ (: Copy the value of xml:id attribute from other.html. This is a comment by the way! :) ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/directTreeFragment.xq ================================================ some text ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/doc.txt ================================================

1 2

3 4

5 6

7 8

9 a

b c

d e

f 0

================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/docPlainHTML.xq ================================================ doc("myPlainHTML.html")/body ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/docPlainHTML2.xq ================================================ doc("myPlainHTML.html")/html/body ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/embedDataInXHTML.xq ================================================ declare default element namespace "http://www.w3.org/1999/xhtml"; { for $i in doc("testResult.xml")/tests/test[@status = "failure"] order by $i/@name return

{$i/@name}

} ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/embedDataInXHTML2.xq ================================================ declare namespace x = "http://www.w3.org/1998/xhtml"; { for $i in doc("testResult.xml")/tests/test[@status = "failure"] order by $i/@name return {$i/@name} } ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/emptyParagraphs.xq ================================================ doc('index.html')//p[string-length(.) = 0] ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/escapeCurlyBraces.xq ================================================ This is one left followed by one right curly brace: {{ }} Here they are again, but with character references: { } ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/escapeStringLiterals.xml ================================================

"I hate quotations" -- Ralph Waldo Emerson" '"I hate quotations"" -- Ralph Waldo Emerson"', appeared above

================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/escapeStringLiterals.xq ================================================

{ """I hate quotations"" -- Ralph Waldo Emerson""", " ", '''"I hate quotations"" -- Ralph Waldo Emerson"'', appeared above' }

================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/expressionInsideAttribute.xq ================================================ declare variable $additionalClass := "example";

================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/filterOnPath.xq ================================================ let $doc := doc('doc.txt') return ($doc/doc/p/span)[1] ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/filterOnStep.xq ================================================ let $doc := doc('doc.txt') return $doc/doc/p/span[1] ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/firstParagraph.xq ================================================ doc("index.html")/html/body/p[@xml:id = "thatSpecialOne"] ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/fnStringOnAttribute.xq ================================================

{ string(doc('feed.rss')/rss/@version) }

================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/forClause.xq ================================================ for $i in(reverse(1 to 10)), $d in xs:integer(doc("numbers.xml")/numbers/number) return ($i + $d) ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/forClause2.xq ================================================ for $i in(reverse(1 to 10)), $d in xs:integer(doc("numbers.xml")/numbers/number) return $i + $d ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/forClauseOnFeed.xq ================================================ for $item in doc('feed.rss')//item return

{ $item/description/node() }

================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/indented.xml ================================================

Some Text

================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/introAcneRemover.xq ================================================ The following skin care products have shipped, ordered by shipping date(oldest first): { for $i in doc("myOrders.xml")/orders/order[@product = "Acme Skin Care"] order by xs:date($i/@shippingDate) descending return $i } ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/introExample2.xq ================================================ { doc($file)/bib/book[publisher = $publisher and @year > $year]/{title} } ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/introFileHierarchy.xml ================================================ ... ... ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/introNavigateFS.xq ================================================ declare variable $myRoot := ; (: This line is a dummy and shouldn't appear in the documentation. :) { $myRoot//file[@mimetype = 'text/xml' or @mimetype = 'application/xml'] / (if(doc-available(@uri)) then () else

Failed to parse file {@uri}.

) } ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/introductionExample.xq ================================================ {doc("library.xml")/bib/book[publisher="Addison-Wesley" and @year>1991]/{title}} ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/invalidLetOrderBy.xq ================================================ let $i := (2, 3, 1) order by $i[1] return $i ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/items.xq ================================================ , xs:base64Binary("FFFF"), current-date(), 3e3, (: A floating point value :) attribute {"name"} {()} ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/letOrderBy.xq ================================================ for $a in (8, -4, 2) let $b := ($a * -1, $a) order by $a return $b ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/literalsAndOperators.xq ================================================ declare variable $date := fn:current-date(); (: This line should not be part of the example. It exists in order to make the query valid. :) fn:current-date() - $date > xs:dayTimeDuration("P365D") ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/mobeyDick.xml ================================================ Mobey Dick ... ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/nextLastParagraph.xq ================================================ doc('index.html')//p[last() - 1] ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/nodeConstructorsAreExpressions.xq ================================================ let $docURI := 'maybeNotWellformed.xml' return if(doc-available($docURI)) then doc($docURI)//p/{./node()} else Failed to load {$docURI} ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/nodeConstructorsInPaths.xq ================================================ doc('feed.rss')//item/

{description/node()}

================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/nodeTestChildElement.xq ================================================ doc('index.html')/descendant-or-self::element(p)/child::element(span) ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/notIndented.xml ================================================

Some Text

================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/oneElementConstructor.xq ================================================ ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/paragraphsExceptTheFiveFirst.xq ================================================ doc('index.html')//p[position() > 5] ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/paragraphsWithTables.xq ================================================ doc('index.html')/html/body/p[table] ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/pathAB.xq ================================================ doc('index.html')//p/span ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/pathsAllParagraphs.xq ================================================ doc('index.html')//p ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/simpleHTML.xq ================================================ doc("index.html")/html/body/p[@class="example"] ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/simpleXHTML.xq ================================================ declare namespace x = "http://www.w3.org/1999/xhtml/"; doc("index.html")/x:html/x:body/x:p[@class="example"] ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/svgDocumentElement.xml ================================================ ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/tablesInParagraphs.xq ================================================ doc('index.html')/html/body/p/table ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/twoSVGElements.xq ================================================ declare namespace s = "http://www.w3.org/2000/svg"; declare default element namespace "http://www.w3.org/2000/svg"; let $doc := doc('image.svg') return ($doc/svg, $doc/s:svg) ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/xmlStylesheet.xq ================================================ ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/xsBooleanTrue.xq ================================================ xs:boolean("true") ================================================ FILE: doc/codesnippets/doc/src/snippets/patternist/xsvgDocumentElement.xml ================================================ ================================================ FILE: doc/codesnippets/doc/src/snippets/persistentindexes/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/persistentindexes/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" #include "model.h" /*! The main window constructor creates and populates a model with values from a string list then displays the contents of the model using a QListView widget. */ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QMenu *fileMenu = new QMenu(tr("&File")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); QMenu *itemsMenu = new QMenu(tr("&Items")); insertAction = itemsMenu->addAction(tr("&Insert Item")); removeAction = itemsMenu->addAction(tr("&Remove Item")); menuBar()->addMenu(fileMenu); menuBar()->addMenu(itemsMenu); QStringList numbers; numbers << tr("One") << tr("Two") << tr("Three") << tr("Four") << tr("Five") << tr("Six") << tr("Seven") << tr("Eight") << tr("Nine") << tr("Ten"); model = new StringListModel(numbers); QListView *view = new QListView(this); view->setModel(model); selectionModel = view->selectionModel(); connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); connect(insertAction, SIGNAL(triggered()), this, SLOT(insertItem())); connect(removeAction, SIGNAL(triggered()), this, SLOT(removeItem())); connect(selectionModel, SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateMenus(const QModelIndex &))); setCentralWidget(view); setWindowTitle("View onto a string list model"); } void MainWindow::insertItem() { if (!selectionModel->currentIndex().isValid()) return; QString itemText = QInputDialog::getText(this, tr("Insert Item"), tr("Input text for the new item:")); if (itemText.isNull()) return; int row = selectionModel->currentIndex().row(); if (model->insertRows(row, 1)) model->setData(model->index(row, 0), itemText, Qt::EditRole); } void MainWindow::removeItem() { if (!selectionModel->currentIndex().isValid()) return; int row = selectionModel->currentIndex().row(); model->removeRows(row, 1); } void MainWindow::updateMenus(const QModelIndex ¤tIndex) { insertAction->setEnabled(currentIndex.isValid()); removeAction->setEnabled(currentIndex.isValid()); } ================================================ FILE: doc/codesnippets/doc/src/snippets/persistentindexes/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include class QAbstractItemModel; class QAction; class QItemSelectionModel; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); private slots: void insertItem(); void removeItem(); void updateMenus(const QModelIndex ¤tIndex); private: QAbstractItemModel *model; QAction *insertAction; QAction *removeAction; QItemSelectionModel *selectionModel; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/persistentindexes/model.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MODEL_H #define MODEL_H #include #include #include class StringListModel : public QAbstractListModel { Q_OBJECT public: StringListModel(const QStringList &strings, QObject *parent = 0) : QAbstractListModel(parent), stringList(strings) {} int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex()); private: QStringList stringList; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/phonon/samplebackend/main.cpp ================================================ //! [snippet] QObject *Backend::createObject(BackendInterface::Class c, QObject *parent, const QList &args) { switch (c) { case MediaObjectClass: return new MediaObject(parent); case VolumeFaderEffectClass: return new VolumeFaderEffect(parent); case AudioOutputClass: return new AudioOutput(parent); case AudioDataOutputClass: return new AudioDataOutput(parent); case VisualizationClass: return new Visualization(parent); case VideoDataOutputClass: return new VideoDataOutput(parent); case EffectClass: return new Effect(args[0].toInt(), parent); case VideoWidgetClass: return new VideoWidget(qobject_cast(parent)); } return 0; } QSet Backend::objectDescriptionIndexes(ObjectDescriptionType type) const { QSet set; switch(type) { case Phonon::AudioOutputDeviceType: // use AudioDeviceEnumerator to list ALSA and OSS devices set << 10000 << 10001; break; case Phonon::AudioCaptureDeviceType: set << 20000 << 20001; break; case Phonon::VideoOutputDeviceType: break; case Phonon::VideoCaptureDeviceType: set << 30000 << 30001; break; case Phonon::VisualizationType: case Phonon::AudioCodecType: case Phonon::VideoCodecType: case Phonon::ContainerFormatType: break; case Phonon::EffectType: set << 0x7F000001; break; } return set; } QHash Backend::objectDescriptionProperties(ObjectDescriptionType type, int index) const { QHash ret; switch (type) { case Phonon::AudioOutputDeviceType: switch (index) { case 10000: ret.insert("name", QLatin1String("internal Soundcard")); break; case 10001: ret.insert("name", QLatin1String("USB Headset")); ret.insert("icon", KIcon("usb-headset")); ret.insert("available", false); break; } break; case Phonon::AudioCaptureDeviceType: switch (index) { case 20000: ret.insert("name", QLatin1String("Soundcard")); ret.insert("description", QLatin1String("first description")); break; case 20001: ret.insert("name", QLatin1String("DV")); ret.insert("description", QLatin1String("second description")); break; } break; case Phonon::VideoOutputDeviceType: break; case Phonon::VideoCaptureDeviceType: switch (index) { case 30000: ret.insert("name", QLatin1String("USB Webcam")); ret.insert("description", QLatin1String("first description")); break; case 30001: ret.insert("name", QLatin1String("DV")); ret.insert("description", QLatin1String("second description")); break; } break; case Phonon::VisualizationType: break; case Phonon::AudioCodecType: break; case Phonon::VideoCodecType: break; case Phonon::ContainerFormatType: break; case Phonon::EffectType: switch (index) { case 0x7F000001: ret.insert("name", QLatin1String("Delay")); ret.insert("description", QLatin1String("Simple delay effect with time, feedback and level controls.")); break; } break; } return ret; } //! [snippet] ================================================ FILE: doc/codesnippets/doc/src/snippets/phonon.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ Window::Window() { { //![0] Phonon::MediaObject *music = Phonon::createPlayer(Phonon::MusicCategory, Phonon::MediaSource("/path/mysong.wav")); music->play(); //![0] } { QWidget *parentWidget = new QWidget; QUrl url("Myfancymusic"); //![1] Phonon::VideoPlayer *player = new Phonon::VideoPlayer(Phonon::VideoCategory, parentWidget); player->play(url); //![1] } { //![2] Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this); mediaObject->setCurrentSource(Phonon::MediaSource("/mymusic/barbiegirl.wav")); Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); Phonon::Path path = Phonon::createPath(mediaObject, audioOutput); //![2] //![3] Phonon::Effect *effect = new Phonon::Effect( Phonon::BackendCapabilities::availableAudioEffects()[0], this); path.insertEffect(effect); //![3] } { //![4] Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this); Phonon::VideoWidget *videoWidget = new Phonon::VideoWidget(this); Phonon::createPath(mediaObject, videoWidget); Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::VideoCategory, this); Phonon::createPath(mediaObject, audioOutput); //![4] //![5] mediaObject->play(); //![5] } } ================================================ FILE: doc/codesnippets/doc/src/snippets/phononeffectparameter.cpp ================================================ #include #include #include #include #include #include int main(int argv, char **args) { QApplication app(argv, args); app.setApplicationName("effectsnippets"); QList effects = Phonon::BackendCapabilities::availableAudioEffects(); Phonon::Effect *effect = new Phonon::Effect(effects.at(3)); //![0] QList parameters = effect->parameters(); foreach(Phonon::EffectParameter parameter, parameters) { // Do something with parameter } //![0] //![1] Phonon::EffectWidget *effectWidget = new Phonon::EffectWidget(effect); //![1] effectWidget->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/phononobjectdescription.cpp ================================================ #include #include #include #include #include #include #include #include #include #include #include int main(int argv, char **args) { QApplication app(argv, args); //![0] QList effectDescriptions = Phonon::BackendCapabilities::availableAudioEffects(); //![1] QList audioOutputDevices = Phonon::BackendCapabilities::availableAudioOutputDevices(); //![1] foreach (Phonon::EffectDescription effectDescription, effectDescriptions) { Phonon::Effect *effect = new Phonon::Effect(effectDescription); // ... Do something with the effect, like insert it into a media graph } Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput; audioOutput->setOutputDevice(audioOutputDevices[0]); //![0] return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/picture/picture.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] picture = QPicture() painter = QPainter() painter.begin(picture) # paint in picture painter.drawEllipse(10,20, 80,70) # draw an ellipse painter.end() # painting done picture.save("drawing.pic") # save picture //! [0] //! [1] picture = QPicture() picture.load("drawing.pic") # load picture painter = QPainter() painter.begin(myImage) # paint in myImage painter.drawPicture(0, 0, picture) # draw the picture at (0,0) painter.end() # painting done //! [1] //! [2] list = QPicture.inputFormatList() for string in list: myProcessing(string) //! [2] //! [3] list = QPicture.outputFormatList() for string in list: myProcessing(string) //! [3] //! [4] iio = QPictureIO() pixmap = QPixmap() iio.setFileName("vegeburger.pic") if iio.read(): # OK picture = iio.picture() painter = QPainter(pixmap) painter.drawPicture(0, 0, picture) //! [4] //! [5] iio = QPictureIO() picture = QPicture() painter = QPainter(picture) painter.drawPixmap(0, 0, pixmap) iio.setPicture(picture) iio.setFileName("vegeburger.pic") iio.setFormat("PIC") if iio.write(): return True # returned true if written successfully //! [5] //! [6] def readSVG(picture): # read the picture using the picture.ioDevice() //! [6] //! [7] def writeSVG(picture): # write the picture using the picture.ioDevice() //! [7] //! [8] # add the SVG picture handler # ... //! [8] ================================================ FILE: doc/codesnippets/doc/src/snippets/plaintextlayout/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "window.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Window *window = new Window; window->resize(337, 343); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/plaintextlayout/window.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "window.h" Window::Window(QWidget *parent) : QWidget(parent) { text = QString("Support for text rendering and layout in Qt 4 has been " "redesigned around a system that allows textual content to " "be represented in a more flexible way than was possible " "with Qt 3. Qt 4 also provides a more convenient " "programming interface for editing documents. These " "improvements are made available through a reimplementation " "of the existing text rendering engine, and the " "introduction of several new classes. " "See the relevant module overview for a detailed discussion " "of this framework. The following sections provide a brief " "overview of the main concepts behind Scribe."); setWindowTitle(tr("Plain Text Layout")); } void Window::paintEvent(QPaintEvent *event) { //! [0] QTextLayout textLayout(text, font); qreal margin = 10; qreal radius = qMin(width()/2.0, height()/2.0) - margin; QFontMetrics fm(font); qreal lineHeight = fm.height(); qreal y = 0; textLayout.beginLayout(); while (1) { // create a new line QTextLine line = textLayout.createLine(); if (!line.isValid()) break; qreal x1 = qMax(0.0, pow(pow(radius,2)-pow(radius-y,2), 0.5)); qreal x2 = qMax(0.0, pow(pow(radius,2)-pow(radius-(y+lineHeight),2), 0.5)); qreal x = qMax(x1, x2) + margin; qreal lineWidth = (width() - margin) - x; line.setLineWidth(lineWidth); line.setPosition(QPointF(x, margin+y)); y += line.height(); } textLayout.endLayout(); QPainter painter; painter.begin(this); painter.setRenderHint(QPainter::Antialiasing); painter.fillRect(rect(), Qt::white); painter.setBrush(QBrush(Qt::black)); painter.setPen(QPen(Qt::black)); textLayout.draw(&painter, QPoint(0,0)); painter.setBrush(QBrush(QColor("#a6ce39"))); painter.setPen(QPen(Qt::black)); painter.drawEllipse(QRectF(-radius, margin, 2*radius, 2*radius)); painter.end(); //! [0] } ================================================ FILE: doc/codesnippets/doc/src/snippets/plaintextlayout/window.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent = 0); protected: void paintEvent(QPaintEvent *event); private: QFont font; QString text; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/pointer/pointer.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); //! [0] QPointer label = new QLabel; label->setText("&Status:"); //! [0] //! [1] if (label) //! [1] //! [2] label->show(); //! [2] return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/polygon/polygon.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] polygon = QPolygon() polygon << QPoint(10, 20) << QPoint(20, 30) //! [0] //! [1] polygon = QPolygonF() polygon << QPointF(10.4, 20.5) << QPointF(20.2, 30.2) //! [1] //! [2] points = [ 10, 20, 30, 40 ] polygon = QPolygon() polygon.setPoints(2, points) //! [2] //! [3] polygon = QPolygon() polygon.setPoints(2, 10, 20, 30, 40) //! [3] //! [4] polygon = QPolygon(1) polygon[0] = QPoint(4, 5) polygon.putPoints(1, 2, 6,7, 8,9) //! [4] //! [5] polygon = QPolygon(3) polygon.putPoints(0, 3, 4,5, 0,0, 8,9) polygon.putPoints(1, 1, 6,7) //! [5] //! [6] polygon1 = QPolygon() polygon1.putPoints(0, 3, 1,2, 0,0, 5,6) # polygon1 is now the three-point polygon(1,2, 0,0, 5,6) polygon2 = QPolygon() polygon2.putPoints(0, 3, 4,4, 5,5, 6,6) # polygon2 is now (4,4, 5,5, 6,6) polygon1.putPoints(2, 3, polygon2) # polygon1 is now the five-point polygon(1,2, 0,0, 4,4, 5,5, 6,6) //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/porting4-dropevents/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "window.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget window; window.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/porting4-dropevents/window.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "window.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { QLabel *textLabel = new QLabel(tr("Data:"), this); dataLabel = new QLabel(this); dataLabel->setFixedSize(200, 200); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(textLabel); layout->addWidget(dataLabel); setAcceptDrops(true); setWindowTitle(tr("Drop Events")); } //! [0] void MyWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasText() || event->mimeData()->hasImage()) event->acceptProposedAction(); } //! [0] //! [1] void MyWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasText()) dataLabel->setText(event->mimeData()->text()); else if (event->mimeData()->hasImage()) { QVariant imageData = event->mimeData()->imageData(); dataLabel->setPixmap(qvariant_cast(imageData)); } event->acceptProposedAction(); } //! [1] //! [2] void MyWidget::mousePressEvent(QMouseEvent *event) { //! [2] QString text = dataLabel->text(); QPixmap iconPixmap(32, 32); iconPixmap.fill(qRgba(255, 0, 0, 127)); QImage image(100, 100, QImage::Format_RGB32); image.fill(qRgb(0, 0, 255)); //! [3] if (event->button() == Qt::LeftButton) { QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(text); mimeData->setImageData(image); drag->setMimeData(mimeData); drag->setPixmap(iconPixmap); Qt::DropAction dropAction = drag->exec(); //! [3] // ... //! [4] event->accept(); } //! [4] else if (event->button() == Qt::MidButton) { QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setImageData(image); drag->setMimeData(mimeData); drag->setPixmap(iconPixmap); Qt::DropAction dropAction = drag->exec(); // ... event->accept(); } //! [5] } //! [5] ================================================ FILE: doc/codesnippets/doc/src/snippets/porting4-dropevents/window.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include #include class QComboBox; class QFrame; class QLabel; class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = 0); protected: void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); void mousePressEvent(QMouseEvent *event); private: QComboBox *mimeTypeCombo; QFrame *dropFrame; QLabel *dataLabel; QString oldText; QStringList oldMimeTypes; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/printing-qprinter/errors.cpp ================================================ //! [0] printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName("/foobar/nonwritable.pdf") QPainter painter if painter.begin(printer): # failed to open file print "failed to open file, is it writable?" return 1 painter.drawText(10, 10, "Test") if !printer.Page(): print "failed in flushing page to disk, disk full?" return 1 painter.drawText(10, 10, "Test 2") painter.end() //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/printing-qprinter/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "object.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Object object; QTimer timer; timer.setSingleShot(true); timer.connect(&timer, SIGNAL(timeout()), &object, SLOT(print())); timer.start(0); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/printing-qprinter/object.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "object.h" Object::Object(QObject *parent) : QObject(parent) { } void Object::print() { int numberOfPages = 10; int lastPage = numberOfPages - 1; //! [0] QPrinter printer(QPrinter::HighResolution); printer.setOutputFileName("print.ps"); QPainter painter; painter.begin(&printer); for (int page = 0; page < numberOfPages; ++page) { // Use the painter to draw on the page. if (page != lastPage) printer.newPage(); } painter.end(); //! [0] qApp->quit(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/printing-qprinter/object.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class Object : public QObject { Q_OBJECT public: Object(QObject *parent = 0); public slots: void print(); }; ================================================ FILE: doc/codesnippets/doc/src/snippets/process/process.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include bool zip() { //! [0] gzip = QProcess() gzip.start("gzip", ["-c"]) if not gzip.waitForStarted(): return False gzip.write("Qt rocks!") gzip.closeWriteChannel() if not gzip.waitForFinished(): return False result = gzip.readAll() //! [0] gzip.start("gzip", QStringList() << "-d" << "-c"); gzip.write(result); gzip.closeWriteChannel(); if (!gzip.waitForFinished()) return false; qDebug("Result: %s", gzip.readAll().data()); return true; } int main() { zip(); return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qabstractsliderisnippet.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ QAbstractSliderPrivate::QAbstractSliderPrivate() : minimum(0), maximum(99), singleStep(1), pageStep(10), value(0), position(0), pressValue(-1), tracking(true), blocktracking(false), pressed(false), invertedAppearance(false), invertedControls(false), orientation(Qt::Horizontal), repeatAction(QAbstractSlider::SliderNoAction) { } QAbstractSliderPrivate::~QAbstractSliderPrivate() { } oid QAbstractSlider::setRange(int min, int max) { Q_D(QAbstractSlider); int oldMin = d->minimum; int oldMax = d->maximum; d->minimum = min; d->maximum = qMax(min, max); if (oldMin != d->minimum || oldMax != d->maximum) { sliderChange(SliderRangeChange); emit rangeChanged(d->minimum, d->maximum); setValue(d->value); // re-bound } } void QAbstractSliderPrivate::setSteps(int single, int page) { Q_Q(QAbstractSlider); singleStep = qAbs(single); pageStep = qAbs(page); q->sliderChange(QAbstractSlider::SliderStepsChange); } AbstractSlider::QAbstractSlider(QWidget *parent) :QWidget(*new QAbstractSliderPrivate, parent, 0) { } QAbstractSlider::QAbstractSlider(QAbstractSliderPrivate &dd, QWidget *parent) :QWidget(dd, parent, 0) { } QAbstractSlider::~QAbstractSlider() { } void QAbstractSlider::setOrientation(Qt::Orientation orientation) { Q_D(QAbstractSlider); if (d->orientation == orientation) return; d->orientation = orientation; if (!testAttribute(Qt::WA_WState_OwnSizePolicy)) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy(sp); setAttribute(Qt::WA_WState_OwnSizePolicy, false); } update(); updateGeometry(); } Qt::Orientation QAbstractSlider::orientation() const { Q_D(const QAbstractSlider); return d->orientation; } void QAbstractSlider::setMinimum(int min) { Q_D(QAbstractSlider); setRange(min, qMax(d->maximum, min)); } int QAbstractSlider::minimum() const { Q_D(const QAbstractSlider); return d->minimum; } void QAbstractSlider::setMaximum(int max) { Q_D(QAbstractSlider); setRange(qMin(d->minimum, max), max); } int QAbstractSlider::maximum() const { Q_D(const QAbstractSlider); return d->maximum; } void QAbstractSlider::setSingleStep(int step) { Q_D(QAbstractSlider); d->setSteps(step, d->pageStep); } int QAbstractSlider::singleStep() const { Q_D(const QAbstractSlider); return d->singleStep; } void QAbstractSlider::setPageStep(int step) { Q_D(QAbstractSlider); d->setSteps(d->singleStep, step); } int QAbstractSlider::pageStep() const { Q_D(const QAbstractSlider); return d->pageStep; } oid QAbstractSlider::setTracking(bool enable) { Q_D(QAbstractSlider); d->tracking = enable; } bool QAbstractSlider::hasTracking() const { Q_D(const QAbstractSlider); return d->tracking; } void QAbstractSlider::setSliderDown(bool down) { Q_D(QAbstractSlider); bool doEmit = d->pressed != down; d->pressed = down; if (doEmit) { if (down) emit sliderPressed(); else emit sliderReleased(); } if (!down && d->position != d->value) triggerAction(SliderMove); } bool QAbstractSlider::isSliderDown() const { Q_D(const QAbstractSlider); return d->pressed; } void QAbstractSlider::setSliderPosition(int position) { Q_D(QAbstractSlider); position = d->bound(position); if (position == d->position) return; d->position = position; if (!d->tracking) update(); if (d->pressed) emit sliderMoved(position); if (d->tracking && !d->blocktracking) triggerAction(SliderMove); } int QAbstractSlider::sliderPosition() const { Q_D(const QAbstractSlider); return d->position; } int QAbstractSlider::value() const { Q_D(const QAbstractSlider); return d->value; } //! [0] void QAbstractSlider::setValue(int value) //! [0] { Q_D(QAbstractSlider); value = d->bound(value); if (d->value == value && d->position == value) return; d->value = value; if (d->position != value) { d->position = value; if (d->pressed) emit sliderMoved((d->position = value)); } #ifndef QT_NO_ACCESSIBILITY //! [1] QAccessible::updateAccessibility(this, 0, QAccessible::ValueChanged); //! [1] #endif sliderChange(SliderValueChange); emit valueChanged(value); //! [2] } //! [2] bool QAbstractSlider::invertedAppearance() const { Q_D(const QAbstractSlider); return d->invertedAppearance; } void QAbstractSlider::setInvertedAppearance(bool invert) { Q_D(QAbstractSlider); d->invertedAppearance = invert; update(); } bool QAbstractSlider::invertedControls() const { Q_D(const QAbstractSlider); return d->invertedControls; } void QAbstractSlider::setInvertedControls(bool invert) { Q_D(QAbstractSlider); d->invertedControls = invert; } void QAbstractSlider::triggerAction(SliderAction action) { Q_D(QAbstractSlider); d->blocktracking = true; switch (action) { case SliderSingleStepAdd: setSliderPosition(d->value + d->singleStep); break; case SliderSingleStepSub: setSliderPosition(d->value - d->singleStep); break; case SliderPageStepAdd: setSliderPosition(d->value + d->pageStep); break; case SliderPageStepSub: setSliderPosition(d->value - d->pageStep); break; case SliderToMinimum: setSliderPosition(d->minimum); break; case SliderToMaximum: setSliderPosition(d->maximum); break; case SliderMove: case SliderNoAction: break; }; emit actionTriggered(action); d->blocktracking = false; setValue(d->position); } void QAbstractSlider::setRepeatAction(SliderAction action, int thresholdTime, int repeatTime) { Q_D(QAbstractSlider); if ((d->repeatAction = action) == SliderNoAction) { d->repeatActionTimer.stop(); } else { d->repeatActionTime = repeatTime; d->repeatActionTimer.start(thresholdTime, this); } } QAbstractSlider::SliderAction QAbstractSlider::repeatAction() const { Q_D(const QAbstractSlider); return d->repeatAction; } void QAbstractSlider::timerEvent(QTimerEvent *e) { Q_D(QAbstractSlider); if (e->timerId() == d->repeatActionTimer.timerId()) { if (d->repeatActionTime) { // was threshold time, use repeat time next time d->repeatActionTimer.start(d->repeatActionTime, this); d->repeatActionTime = 0; } if (d->repeatAction == SliderPageStepAdd) d->setAdjustedSliderPosition(d->value + d->pageStep); else if (d->repeatAction == SliderPageStepSub) d->setAdjustedSliderPosition(d->value - d->pageStep); else triggerAction(d->repeatAction); } } oid QAbstractSlider::sliderChange(SliderChange) { update(); } #ifndef QT_NO_WHEELEVENT void QAbstractSlider::wheelEvent(QWheelEvent * e) { Q_D(QAbstractSlider); e->ignore(); if (e->orientation() != d->orientation && !rect().contains(e->pos())) return; static qreal offset = 0; static QAbstractSlider *offset_owner = 0; if (offset_owner != this){ offset_owner = this; offset = 0; } int step = qMin(QApplication::wheelScrollLines() * d->singleStep, d->pageStep); if ((e->modifiers() & Qt::ControlModifier) || (e->modifiers() & Qt::ShiftModifier)) step = d->pageStep; offset += e->delta() * step / 120; if (d->invertedControls) offset = -offset; if (qAbs(offset) < 1) return; int prevValue = d->value; d->position = d->value + int(offset); // value will be updated by triggerAction() triggerAction(SliderMove); if (prevValue == d->value) { offset = 0; } else { offset -= int(offset); e->accept(); } } #endif void QAbstractSlider::keyPressEvent(QKeyEvent *ev) { Q_D(QAbstractSlider); SliderAction action = SliderNoAction; switch (ev->key()) { #ifdef QT_KEYPAD_NAVIGATION case Qt::Key_Select: if (QApplication::keypadNavigationEnabled()) setEditFocus(!hasEditFocus()); else ev->ignore(); break; case Qt::Key_Back: if (QApplication::keypadNavigationEnabled() && hasEditFocus()) { setValue(d->origValue); setEditFocus(false); } else ev->ignore(); break; #endif // It seems we need to use invertedAppearance for Left and right, otherwise, things look weird. case Qt::Key_Left: #ifdef QT_KEYPAD_NAVIGATION if (QApplication::keypadNavigationEnabled() && !hasEditFocus()) { ev->ignore(); return; } if (QApplication::keypadNavigationEnabled() && d->orientation == Qt::Vertical) action = d->invertedControls ? SliderSingleStepSub : SliderSingleStepAdd; else #endif action = !d->invertedAppearance ? SliderSingleStepSub : SliderSingleStepAdd; break; case Qt::Key_Right: #ifdef QT_KEYPAD_NAVIGATION if (QApplication::keypadNavigationEnabled() && !hasEditFocus()) { ev->ignore(); return; } if (QApplication::keypadNavigationEnabled() && d->orientation == Qt::Vertical) action = d->invertedControls ? SliderSingleStepAdd : SliderSingleStepSub; else #endif action = !d->invertedAppearance ? SliderSingleStepAdd : SliderSingleStepSub; break; case Qt::Key_Up: #ifdef QT_KEYPAD_NAVIGATION if (QApplication::keypadNavigationEnabled()) { ev->ignore(); break; } #endif action = d->invertedControls ? SliderSingleStepSub : SliderSingleStepAdd; break; case Qt::Key_Down: #ifdef QT_KEYPAD_NAVIGATION if (QApplication::keypadNavigationEnabled()) { ev->ignore(); break; } #endif action = d->invertedControls ? SliderSingleStepAdd : SliderSingleStepSub; break; case Qt::Key_PageUp: action = d->invertedControls ? SliderPageStepSub : SliderPageStepAdd; break; case Qt::Key_PageDown: action = d->invertedControls ? SliderPageStepAdd : SliderPageStepSub; break; case Qt::Key_Home: action = SliderToMinimum; break; case Qt::Key_End: action = SliderToMaximum; break; default: ev->ignore(); break; } if (action) triggerAction(action); } void QAbstractSlider::changeEvent(QEvent *ev) { Q_D(QAbstractSlider); switch (ev->type()) { case QEvent::EnabledChange: if (!isEnabled()) { d->repeatActionTimer.stop(); setSliderDown(false); } // fall through... default: QWidget::changeEvent(ev); } } bool QAbstractSlider::event(QEvent *e) { #ifdef QT_KEYPAD_NAVIGATION Q_D(QAbstractSlider); switch (e->type()) { case QEvent::FocusIn: d->origValue = d->value; break; default: break; } #endif return QWidget::event(e); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qcalendarwidget/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include int main(int argc, char **argv) { QApplication app(argc, argv); QCalendarWidget calendar; calendar.setSelectedDate(calendar.selectedDate().addDays(3)); calendar.setGridVisible(true); calendar.show(); QCalendarWidget calendarMin; calendarMin.setMinimumDate(calendarMin.selectedDate().addDays(-7)); calendarMin.setGridVisible(true); calendarMin.show(); QCalendarWidget calendarMax; calendarMax.setMaximumDate(calendarMax.selectedDate().addDays(7)); calendarMax.setGridVisible(true); calendarMax.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qcolumnview/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QStandardItemModel model; QStandardItem *name = new QStandardItem("Name"); QStandardItem *firstName = new QStandardItem("First Name"); QStandardItem *lastName = new QStandardItem("Last Name"); name->appendRow(firstName); name->appendRow(lastName); model.appendRow(name); QStandardItem *john = new QStandardItem("John"); QStandardItem *smith = new QStandardItem("Smith"); firstName->appendRow(john); lastName->appendRow(smith); QStandardItem *address = new QStandardItem("Address"); QStandardItem *street = new QStandardItem("Street"); QStandardItem *city = new QStandardItem("City"); QStandardItem *state = new QStandardItem("State"); QStandardItem *country = new QStandardItem("Country"); address->appendRow(street); address->appendRow(city); address->appendRow(state); address->appendRow(country); model.appendRow(address); QColumnView columnView; columnView.setModel(&model); columnView.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qdebug/qdebugsnippet.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include class Coordinate : public QObject { public: int myX, myY; int x() const { return myX; }; int y() const { return myY; }; }; //! [0] QDebug operator<<(QDebug dbg, const Coordinate &c) { dbg.nospace() << "(" << c.x() << ", " << c.y() << ")"; return dbg.space(); } //! [0] int main(int argv, char **args) { Coordinate coordinate; coordinate.myX = 10; coordinate.myY = 44; //! [1] qDebug() << "Date:" << QDate::currentDate(); qDebug() << "Types:" << QString("String") << QChar('x') << QRect(0, 10, 50, 40); qDebug() << "Custom coordinate type:" << coordinate; //! [1] } ================================================ FILE: doc/codesnippets/doc/src/snippets/qdir-filepaths/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include int main(int argc, char *argv[]) { QDir directory("Documents/Letters"); QString path = directory.filePath("contents.txt"); QString absolutePath = directory.absoluteFilePath("contents.txt"); std::cout << qPrintable(directory.dirName()) << std::endl; std::cout << qPrintable(path) << std::endl; std::cout << qPrintable(absolutePath) << std::endl; return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qdir-listfiles/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] from PySide.QtCore import QDir, QCoreApplication import sys app = QCoreApplication(sys.argv) directory = QDir() directory.setFilter(QDir.Files | QDir.Hidden | QDir.NoSymLinks) directory.setSorting(QDir.Size | QDir.Reversed) for entry in directory.entryInfoList(): print "%s %s" % (entry.size(), entry.fileName()) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/qdir-namefilters/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ from PySide.QtCore import * def main(): dir_ = QDir() dir_.setFilter(QDir.Files | QDir.Hidden | QDir.NoSymLinks) dir_.setSorting(QDir.Size | QDir.Reversed) //! [0] filters = ["*.cpp", "*.cxx", "*.cc"] dir_.setNameFilters(filters) //! [0] // lst = d.entryInfoList() print " Bytes Filename" for fileInfo in lst: print '%d %s' % (fileInfo.size(), fileInfo.fileName()) ================================================ FILE: doc/codesnippets/doc/src/snippets/qelapsedtimer/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNetwork module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include void slowOperation1() { static char buf[256]; for (int i = 0; i < (1<<20); ++i) buf[i % sizeof buf] = i; } void slowOperation2(int) { slowOperation1(); } void startExample() { //![0] timer = QElapsedTimer() timer.start() slowOperation1() sys.stderr.write("The slow operation took" + timer.elapsed() + "milliseconds") //![0] } //![1] def executeSlowOperations(timeout): timer = QElapsedTimer() timer.start() slowOperation1() remainingTime = timeout - timer.elapsed() if remainingTime > 0: slowOperation2(remainingTime) //![1] //![2] def executeOperationsForTime(ms): timer = QElapsedTimer() timer.start() while not timer.hasExpired(ms): slowOperation1() //![2] int restartExample() { //![3] timer = QElapsedTimer() count = 1 timer.start() while True: count *= 2 slowOperation2(count) if timer.restart() < 250: break return count //![3] } int main(int argc, char **argv) { QCoreApplication app(argc, argv); startExample(); restartExample(); executeSlowOperations(5); executeOperationsForTime(5); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qfontdatabase/main.cpp ================================================ /############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################/ //! [0] database = QFontDatabase() fontTree = QTreeWidget() fontTree.setColumnCount(2) fontTree.setHeaderLabels(QStringList() << "Font" << "Smooth Sizes") for family in database.families(): familyItem = QTreeWidgetItem(fontTree) familyItem.setText(0, family) for style in database.styles(family): styleItem = QTreeWidgetItem(familyItem) styleItem.setText(0, style) sizes = 0 for points in database.smoothSizes(family, style): sizes += QString.number(points) + " " styleItem.setText(1, sizes.trimmed()) //! [0] //! [1] //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/qgl-namespace/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argc, char *argv[]) { return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlabel/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class Updater : public QObject { Q_OBJECT public: Updater(QWidget *widget); public slots: void adjustSize(); private: QWidget *widget; }; Updater::Updater(QWidget *widget) : widget(widget) { } void Updater::adjustSize() { widget->adjustSize(); } int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel *label = new QLabel("My label"); QLineEdit *editor = new QLineEdit("New text"); QWidget window; //Updater updater(&label); QObject::connect(editor, SIGNAL(textChanged(const QString &)), label, SLOT(setText(const QString &))); //QObject::connect(editor, SIGNAL(textChanged(const QString &)), // &updater, SLOT(adjustSize())); //editor.show(); //label.show(); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(label); layout->addWidget(editor); window.setLayout(layout); window.show(); return app.exec(); } #include "main.moc" ================================================ FILE: doc/codesnippets/doc/src/snippets/qlineargradient/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "paintwidget.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); PaintWidget window; window.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlineargradient/paintwidget.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "paintwidget.h" PaintWidget::PaintWidget(QWidget *parent) : QWidget(parent) { } void PaintWidget::paintEvent(QPaintEvent *event) { QLinearGradient gradient1(rect().topLeft(), rect().bottomRight()); gradient1.setColorAt(0, QColor("#ffffcc")); gradient1.setColorAt(1, QColor("#ccccff")); QRectF ellipseRect(width()*0.25, height()*0.25, width()*0.5, height()*0.5); QLinearGradient gradient2(ellipseRect.topLeft(), ellipseRect.bottomRight()); gradient2.setColorAt(0, QColor("#ccccff")); gradient2.setColorAt(1, QColor("#ffffcc")); QPainter painter; painter.begin(this); painter.setRenderHint(QPainter::Antialiasing); painter.fillRect(rect(), QBrush(gradient1)); painter.setBrush(QBrush(gradient2)); painter.drawEllipse(ellipseRect); painter.end(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlineargradient/paintwidget.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef PAINTWIDGET_H #define PAINTWIDGET_H #include class QPaintEvent; class PaintWidget : public QWidget { Q_OBJECT public: PaintWidget(QWidget *parent = 0); protected: void paintEvent(QPaintEvent *event); }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistview-dnd/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistview-dnd/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" #include "model.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); menuBar()->addMenu(fileMenu); // For convenient quoting: //! [0] QListView *listView = new QListView(this); listView->setSelectionMode(QAbstractItemView::ExtendedSelection); listView->setDragEnabled(true); listView->setAcceptDrops(true); listView->setDropIndicatorShown(true); //! [0] this->listView = listView; connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); setupListItems(); setCentralWidget(listView); setWindowTitle(tr("List View")); } void MainWindow::setupListItems() { QStringList items; items << tr("Oak") << tr("Fir") << tr("Pine") << tr("Birch") << tr("Hazel") << tr("Redwood") << tr("Sycamore") << tr("Chestnut") << tr("Mahogany"); DragDropListModel *model = new DragDropListModel(items, this); listView->setModel(model); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistview-dnd/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QListView; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); private: void setupListItems(); QListView *listView; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistview-dnd/model.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of an example program for Qt. ** EDITIONS: NOLIMITS ** ****************************************************************************/ /* model.cpp A simple model that uses a QStringList as its data source. */ #include #include "model.h" DragDropListModel::DragDropListModel(const QStringList &strings, QObject *parent) : QStringListModel(strings, parent) { } //! [0] bool DragDropListModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { if (action == Qt::IgnoreAction) return true; if (!data->hasFormat("application/vnd.text.list")) return false; if (column > 0) //! [0] //! [1] return false; //! [1] //! [2] int beginRow; if (row != -1) beginRow = row; //! [2] //! [3] else if (parent.isValid()) beginRow = parent.row(); //! [3] //! [4] else beginRow = rowCount(QModelIndex()); //! [4] //! [5] QByteArray encodedData = data->data("application/vnd.text.list"); QDataStream stream(&encodedData, QIODevice::ReadOnly); QStringList newItems; int rows = 0; while (!stream.atEnd()) { QString text; stream >> text; newItems << text; ++rows; } //! [5] //! [6] insertRows(beginRow, rows, QModelIndex()); foreach (QString text, newItems) { QModelIndex idx = index(beginRow, 0, QModelIndex()); setData(idx, text); beginRow++; } return true; } //! [6] //! [7] Qt::ItemFlags DragDropListModel::flags(const QModelIndex &index) const { Qt::ItemFlags defaultFlags = QStringListModel::flags(index); if (index.isValid()) return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags; else return Qt::ItemIsDropEnabled | defaultFlags; } //! [7] //! [8] def mimeData(self, indexes): mimeData = QMimeData() encodedData = QByteArray() stream = QDataStream(encodedData, QIODevice.WriteOnly) for index in indexes: if index.isValid(): stream << data(index, Qt.DisplayRole) mimeData.setData("application/vnd.text.list", encodedData) return mimeData; //! [8] //! [9] QStringList DragDropListModel::mimeTypes() const { QStringList types; types << "application/vnd.text.list"; return types; } //! [9] //! [10] Qt::DropActions DragDropListModel::supportedDropActions() const { return Qt::CopyAction | Qt::MoveAction; } //! [10] ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistview-dnd/model.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of an example program for Qt. ** EDITIONS: NOLIMITS ** ****************************************************************************/ #ifndef MODEL_H #define MODEL_H #include #include class DragDropListModel : public QStringListModel { Q_OBJECT public: DragDropListModel(const QStringList &strings, QObject *parent = 0); Qt::ItemFlags flags(const QModelIndex &index) const; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); QMimeData *mimeData(const QModelIndexList &indexes) const; QStringList mimeTypes() const; Qt::DropActions supportedDropActions() const; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistview-using/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistview-using/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" #include "model.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); QMenu *itemsMenu = new QMenu(tr("&Items")); insertAction = itemsMenu->addAction(tr("&Insert Item")); removeAction = itemsMenu->addAction(tr("&Remove Item")); QAction *ascendingAction = itemsMenu->addAction(tr("Sort in &Ascending Order")); QAction *descendingAction = itemsMenu->addAction(tr("Sort in &Descending Order")); menuBar()->addMenu(fileMenu); menuBar()->addMenu(itemsMenu); QStringList strings; strings << tr("Oak") << tr("Fir") << tr("Pine") << tr("Birch") << tr("Hazel") << tr("Redwood") << tr("Sycamore") << tr("Chestnut"); model = new StringListModel(strings, this); /* For convenient quoting: QListView *listView = new QListView(this); */ listView = new QListView(this); listView->setModel(model); listView->setSelectionMode(QAbstractItemView::SingleSelection); connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); connect(ascendingAction, SIGNAL(triggered()), this, SLOT(sortAscending())); connect(descendingAction, SIGNAL(triggered()), this, SLOT(sortDescending())); connect(insertAction, SIGNAL(triggered()), this, SLOT(insertItem())); connect(removeAction, SIGNAL(triggered()), this, SLOT(removeItem())); connect(listView->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateMenus(const QModelIndex &))); updateMenus(listView->selectionModel()->currentIndex()); setCentralWidget(listView); setWindowTitle(tr("List View")); } void MainWindow::sortAscending() { model->sort(0, Qt::AscendingOrder); } void MainWindow::sortDescending() { model->sort(0, Qt::DescendingOrder); } void MainWindow::insertItem() { QModelIndex currentIndex = listView->currentIndex(); if (!currentIndex.isValid()) return; QString itemText = QInputDialog::getText(this, tr("Insert Item"), tr("Input text for the new item:")); if (itemText.isNull()) return; if (model->insertRow(currentIndex.row(), QModelIndex())) { QModelIndex newIndex = model->index(currentIndex.row(), 0, QModelIndex()); model->setData(newIndex, itemText, Qt::EditRole); QString toolTipText = tr("Tooltip:") + itemText; QString statusTipText = tr("Status tip:") + itemText; QString whatsThisText = tr("What's This?:") + itemText; model->setData(newIndex, toolTipText, Qt::ToolTipRole); model->setData(newIndex, toolTipText, Qt::StatusTipRole); model->setData(newIndex, whatsThisText, Qt::WhatsThisRole); } } void MainWindow::removeItem() { QModelIndex currentIndex = listView->currentIndex(); if (!currentIndex.isValid()) return; model->removeRow(currentIndex.row(), QModelIndex()); } void MainWindow::updateMenus(const QModelIndex ¤t) { insertAction->setEnabled(current.isValid()); removeAction->setEnabled(current.isValid()); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistview-using/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include class QAction; class QListView; class StringListModel; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void insertItem(); void removeItem(); void sortAscending(); void sortDescending(); void updateMenus(const QModelIndex ¤t); private: QAction *insertAction; QAction *removeAction; QListView *listView; StringListModel *model; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistview-using/model.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of an example program for Qt. ** EDITIONS: NOLIMITS ** ****************************************************************************/ #ifndef MODEL_H #define MODEL_H #include #include #include class StringListModel : public QAbstractListModel { Q_OBJECT public: StringListModel(const QStringList &strings, QObject *parent = 0) : QAbstractListModel(parent), stringList(strings) {} int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex()); private: QStringList stringList; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistwidget-dnd/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistwidget-dnd/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); menuBar()->addMenu(fileMenu); // For convenient quoting: //! [0] QListWidget *listWidget = new QListWidget(this); listWidget->setSelectionMode(QAbstractItemView::SingleSelection); listWidget->setDragEnabled(true); listWidget->viewport()->setAcceptDrops(true); listWidget->setDropIndicatorShown(true); //! [0] //! [1] listWidget->setDragDropMode(QAbstractItemView::InternalMove); //! [1] this->listWidget = listWidget; connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); setupListItems(); setCentralWidget(listWidget); setWindowTitle(tr("List Widget")); } void MainWindow::setupListItems() { QListWidgetItem *item; item = new QListWidgetItem(tr("Oak"), listWidget); item = new QListWidgetItem(tr("Fir"), listWidget); item = new QListWidgetItem(tr("Pine"), listWidget); item = new QListWidgetItem(tr("Birch"), listWidget); item = new QListWidgetItem(tr("Hazel"), listWidget); item = new QListWidgetItem(tr("Redwood"), listWidget); item = new QListWidgetItem(tr("Sycamore"), listWidget); item = new QListWidgetItem(tr("Chestnut"), listWidget); item = new QListWidgetItem(tr("Mahogany"), listWidget); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistwidget-dnd/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QListWidget; class QListWidgetItem; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); private: void setupListItems(); QListWidget *listWidget; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistwidget-using/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistwidget-using/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); QMenu *itemsMenu = new QMenu(tr("&Items")); insertAction = itemsMenu->addAction(tr("&Insert Item")); removeAction = itemsMenu->addAction(tr("&Remove Item")); QAction *ascendingAction = itemsMenu->addAction(tr("Sort in &Ascending Order")); QAction *descendingAction = itemsMenu->addAction(tr("Sort in &Descending Order")); menuBar()->addMenu(fileMenu); menuBar()->addMenu(itemsMenu); /* For convenient quoting: //! [0] listWidget = QListWidget(self) //! [0] */ listWidget = new QListWidget(this); listWidget->setSelectionMode(QAbstractItemView::SingleSelection); connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); connect(ascendingAction, SIGNAL(triggered()), this, SLOT(sortAscending())); connect(descendingAction, SIGNAL(triggered()), this, SLOT(sortDescending())); connect(insertAction, SIGNAL(triggered()), this, SLOT(insertItem())); connect(removeAction, SIGNAL(triggered()), this, SLOT(removeItem())); connect(listWidget, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this, SLOT(updateMenus(QListWidgetItem *))); setupListItems(); updateMenus(listWidget->currentItem()); setCentralWidget(listWidget); setWindowTitle(tr("List Widget")); } void MainWindow::setupListItems() { //! [1] QListWidgetItem(tr("Oak"), listWidget) QListWidgetItem(tr("Fir"), listWidget) QListWidgetItem(tr("Pine"), listWidget) //! [1] new QListWidgetItem(tr("Birch"), listWidget); //! [2] QListWidgetItem(tr("Hazel"), listWidget) //! [2] new QListWidgetItem(tr("Redwood"), listWidget); //! [3] QListWidgetItem(tr("Sycamore"), listWidget) QListWidgetItem(tr("Chestnut"), listWidget) QListWidgetItem(tr("Mahogany"), listWidget) //! [3] } void MainWindow::sortAscending() { //! [4] listWidget.sortItems(Qt.AscendingOrder) //! [4] } void MainWindow::sortDescending() { //! [5] listWidget.sortItems(Qt.DescendingOrder) //! [5] } void MainWindow::insertItem() { if (!listWidget->currentItem()) return; QString itemText = QInputDialog::getText(this, tr("Insert Item"), tr("Input text for the new item:")); if (itemText.isNull()) return; //! [6] newItem = QListWidgetItem() newItem.setText(itemText) //! [6] int row = listWidget->row(listWidget->currentItem()); //! [7] listWidget.insertItem(row, newItem) //! [7] QString toolTipText = tr("Tooltip:") + itemText; QString statusTipText = tr("Status tip:") + itemText; QString whatsThisText = tr("What's This?:") + itemText; //! [8] newItem.setToolTip(toolTipText) newItem.setStatusTip(toolTipText) newItem.setWhatsThis(whatsThisText) //! [8] } void MainWindow::removeItem() { listWidget->takeItem(listWidget->row(listWidget->currentItem())); } void MainWindow::updateMenus(QListWidgetItem *current) { insertAction->setEnabled(current != 0); removeAction->setEnabled(current != 0); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qlistwidget-using/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QAction; class QListWidget; class QListWidgetItem; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void insertItem(); void removeItem(); void sortAscending(); void sortDescending(); void updateMenus(QListWidgetItem *current); private: void setupListItems(); QAction *insertAction; QAction *removeAction; QListWidget *listWidget; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qmacnativewidget/main.mm ================================================ #include #include #ifdef QT_MAC_USE_COCOA #import #else #include #endif int main(int argc, char **argv) { QApplication app(argc, argv); #ifdef QT_MAC_USE_COCOA //![0] NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(200, app.desktop()->height() - 200, 239, 200) styleMask:NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask backing:NSBackingStoreBuffered defer:NO]; QMacNativeWidget *nativeWidget = new QMacNativeWidget(); nativeWidget->move(0, 0); nativeWidget->setPalette(QPalette(Qt::red)); nativeWidget->setAutoFillBackground(true); QVBoxLayout *layout = new QVBoxLayout(); QPushButton *pushButton = new QPushButton("An Embedded Qt Button!", nativeWidget); pushButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // Don't use the layout rect calculated from QMacStyle. layout->addWidget(pushButton); nativeWidget->setLayout(layout); // Adjust Cocoa layouts NSView *nativeWidgetView = reinterpret_cast(nativeWidget->winId()); NSView *contentView = [window contentView]; [contentView setAutoresizesSubviews:YES]; [nativeWidgetView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; [nativeWidgetView setAutoresizesSubviews:YES]; NSView *pushButtonView = reinterpret_cast(pushButton->winId()); [pushButtonView setAutoresizingMask:NSViewWidthSizable]; // Add the nativeWidget to the window. [contentView addSubview:nativeWidgetView positioned:NSWindowAbove relativeTo:nil]; nativeWidget->show(); pushButton->show(); // Show the window. [window makeKeyAndOrderFront:window]; [pool release]; //![0] #else //![1] Rect contentRect; SetRect(&contentRect, 200, 200, 400, 400); HIWindowRef windowRef; CreateNewWindow(kDocumentWindowClass, kWindowStandardDocumentAttributes | kWindowCompositingAttribute | kWindowStandardHandlerAttribute | kWindowLiveResizeAttribute, &contentRect, &windowRef); HIViewRef contentView = 0; GetRootControl(windowRef, &contentView); QMacNativeWidget *nativeWidget = new QMacNativeWidget(); nativeWidget->move(0, 0); nativeWidget->setPalette(QPalette(Qt::red)); nativeWidget->setAutoFillBackground(true); QVBoxLayout *layout = new QVBoxLayout(); QPushButton *pushButton = new QPushButton("An Embedded Qt Button!", nativeWidget); pushButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // Don't use the layout rect calculated from QMacStyle. layout->addWidget(pushButton); nativeWidget->setLayout(layout); HIViewRef nativeWidgetView = reinterpret_cast(nativeWidget->winId()); // Add the nativeWidget to the window. HIViewAddSubview(contentView, nativeWidgetView); // Adjust Carbon layouts HILayoutInfo layoutInfo; layoutInfo.version = kHILayoutInfoVersionZero; HIViewGetLayoutInfo(nativeWidgetView, &layoutInfo); layoutInfo.binding.top.toView = contentView; layoutInfo.binding.top.kind = kHILayoutBindTop; layoutInfo.binding.left.toView = contentView; layoutInfo.binding.left.kind = kHILayoutBindLeft; layoutInfo.binding.right.toView = contentView; layoutInfo.binding.right.kind = kHILayoutBindRight; layoutInfo.binding.bottom.toView = contentView; layoutInfo.binding.bottom.kind = kHILayoutBindBottom; HIViewSetLayoutInfo(nativeWidgetView, &layoutInfo); HIViewApplyLayout(nativeWidgetView); pushButton->show(); nativeWidget->show(); // Show the window. ShowWindow(windowRef); //![1] #endif return app.exec(); // gives us the same behavior in both } ================================================ FILE: doc/codesnippets/doc/src/snippets/qmake/delegate.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ ================================================ FILE: doc/codesnippets/doc/src/snippets/qmake/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ ================================================ FILE: doc/codesnippets/doc/src/snippets/qmake/model.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ ================================================ FILE: doc/codesnippets/doc/src/snippets/qmake/model.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ ================================================ FILE: doc/codesnippets/doc/src/snippets/qmake/paintwidget_unix.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ int main(int argc, char *argv[]) { return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qmake/view.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ ================================================ FILE: doc/codesnippets/doc/src/snippets/qmetaobject-invokable/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "window.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Window window; qDebug() << window.metaObject()->methodCount(); window.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qmetaobject-invokable/window.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "window.h" Window::Window() { } void Window::normalMethod() { // Cannot be called by the meta-object system. show(); } void Window::invokableMethod() { // Can be called by the meta-object system. show(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qmetaobject-invokable/window.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include //! [Window class with invokable method] class Window : public QWidget { Q_OBJECT public: Window(); void normalMethod(); Q_INVOKABLE void invokableMethod(); }; //! [Window class with invokable method] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qprocess/qprocess-simpleexecution.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); //! [0] ... //! [0] parent = &app; //! [1] program = "./path/to/Qt/examples/widgets/analogclock" //! [1] program = "./../../../../examples/widgets/analogclock/analogclock"; //! [2] arguments = ["-style", "motif"] myProcess = QProcess(parent) myProcess.start(program, arguments) //! [2] return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qprocess-environment/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include void startProcess() { { //! [0] import re from PySide.QtCore import QProcess process = QProcess() env = QProcess.systemEnvironment() env.append("TMPDIR=C:\\MyApp\\temp") # Add an environment variable regex = re.compile(r'^PATH=(.*)', re.IGNORECASE) env = [regex.sub(r'PATH=\1;C:\\Bin', var) for var in env] process.setEnvironment(env) process.start("myapp") //! [0] } { //! [1] process = QProcess() env = QProcessEnvironment.systemEnvironment() env.insert("TMPDIR", "C:\\MyApp\\temp") # Add an environment variable env.insert("PATH", env.value("Path") + ";C:\\Bin") process.setProcessEnvironment(env) process.start("myapp") //! [1] } } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); startProcess(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qsignalmapper/buttonwidget.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "buttonwidget.h" //! [0] def __init__(self, texts, parent): QWidget.__init__(self, parent) self.signalMapper = QSignalMapper(self) layout = QGridLayout() for text, index in enumerate(texts): button = QPushButton(text) self.connect(SIGNAL("clicked()"), self.signalMapper, SLOT("map()")) //! [0] //! [1] self.signalMapper.setMapping(button, text) layout.addWidget(button, index / 3, index % 3) self.signalMapper.connect(SIGNAL("mapped(const QString &)"), //! [1] //! [2] self, SLOT("clicked(const QString &)")) self.setLayout(layout) //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/qsignalmapper/buttonwidget.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef BUTTONWIDGET_H #define BUTTONWIDGET_H #include class QSignalMapper; class QString; class QStringList; //! [0] class ButtonWidget(QWidget): def __init__(self, texts, parent=None): QWidget.__init__(self, parent) ... //! [0] //! [1] //! [1] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qsignalmapper/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "buttonwidget.h" #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QStringList texts; texts << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December"; MainWindow *mw = new MainWindow; ButtonWidget *buttons = new ButtonWidget(texts, mw); mw->setCentralWidget(buttons); mw->show(); QObject::connect(buttons, SIGNAL(clicked(const QString &)), mw, SLOT(buttonPressed(const QString &))); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qsignalmapper/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow() { statusBar()->showMessage(tr("Ready")); } public slots: void buttonPressed(const QString &text) { statusBar()->showMessage(tr("Chose %1").arg(text)); } }; ================================================ FILE: doc/codesnippets/doc/src/snippets/qsortfilterproxymodel/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QObject *parent = &app; QStringList numbers; numbers << "One" << "Two" << "Three" << "Four" << "Five"; QAbstractItemModel *stringListModel = new QStringListModel(numbers, parent); //! [0] QSortFilterProxyModel *filterModel = new QSortFilterProxyModel(parent); filterModel->setSourceModel(stringListModel); //! [0] QWidget *window = new QWidget; //! [1] QListView *filteredView = new QListView; filteredView->setModel(filterModel); //! [1] filteredView->setWindowTitle("Filtered view onto a string list model"); QLineEdit *patternEditor = new QLineEdit; QObject:: connect(patternEditor, SIGNAL(textChanged(const QString &)), filterModel, SLOT(setFilterRegExp(const QString &))); QVBoxLayout *layout = new QVBoxLayout(window); layout->addWidget(filteredView); layout->addWidget(patternEditor); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qsortfilterproxymodel-details/main.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] //! [1] treeView = QTreeView() //! [0] model = MyItemModel(self) treeView.setModel(model) //! [1] //! [2] sourceModel = MyItemModel(self) proxyModel = QSortFilterProxyModel(self) proxyModel.setSourceModel(sourceModel) treeView.setModel(proxyModel) //! [2] //! [3] treeView.setSortingEnabled(True) //! [3] //! [4] proxyModel.sort(2, Qt.AscendingOrder) //! [4] //! [5] proxyModel.setFilterRegExp(QRegExp(".png", Qt.CaseInsensitive, QRegExp.FixedString)) proxyModel.setFilterKeyColumn(1) //! [5] ================================================ FILE: doc/codesnippets/doc/src/snippets/qsplashscreen/main.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] def main(): app = QApplication(sys.argv) pixmap = QPixmap(":/splash.png") splash = QSplashScreen(pixmap) splash.show() app.processEvents() //! [0] //! [1] window = QMainWindow() window.show() splash.finish(&window) return app.exec_() //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/qsplashscreen/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" MainWindow::MainWindow() { QLabel *label = new QLabel(tr("This is the main window.")); label->setAlignment(Qt::AlignCenter); setCentralWidget(label); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qsplashscreen/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qsplashscreen/qsplashscreen.qrc ================================================ splash.png ================================================ FILE: doc/codesnippets/doc/src/snippets/qsql-namespace/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argc, char *argv[]) { return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qstack/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include using namespace std; int main(int argc, char *argv[]) { //! [0] QStack stack; stack.push(1); stack.push(2); stack.push(3); while (!stack.isEmpty()) cout << stack.pop() << endl; //! [0] } ================================================ FILE: doc/codesnippets/doc/src/snippets/qstackedlayout/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include class Widget : public QWidget { public: Widget(QWidget *parent = 0); }; Widget::Widget(QWidget *parent) : QWidget(parent) { //! [0] QWidget *firstPageWidget = new QWidget; QWidget *secondPageWidget = new QWidget; QWidget *thirdPageWidget = new QWidget; QStackedLayout *stackedLayout = new QStackedLayout; stackedLayout->addWidget(firstPageWidget); stackedLayout->addWidget(secondPageWidget); stackedLayout->addWidget(thirdPageWidget); //! [0] //! [1] QComboBox *pageComboBox = new QComboBox; pageComboBox->addItem(tr("Page 1")); pageComboBox->addItem(tr("Page 2")); pageComboBox->addItem(tr("Page 3")); connect(pageComboBox, SIGNAL(activated(int)), stackedLayout, SLOT(setCurrentIndex(int))); //! [1] //! [2] QVBoxLayout *mainLayout = new QVBoxLayout; //! [2] mainLayout->addWidget(pageComboBox); //! [3] mainLayout->addLayout(stackedLayout); setLayout(mainLayout); //! [3] } int main(int argc, char *argv[]) { QApplication app(argc, argv); Widget widget; widget.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qstackedwidget/main.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] firstPageWidget = QWidget() secondPageWidget = QWidget() thirdPageWidget = QWidget() stackedWidget = QStackedWidget() stackedWidget.addWidget(firstPageWidget) stackedWidget.addWidget(secondPageWidget) stackedWidget.addWidget(thirdPageWidget) //! [0] //! [1] pageComboBox = QComboBox() pageComboBox.addItem(tr("Page 1")) pageComboBox.addItem(tr("Page 2")) pageComboBox.addItem(tr("Page 3")) connect(pageComboBox, SIGNAL("activated(int)"), stackedWidget, SLOT("setCurrentIndex(int)")) //! [1] //! [2] layout = QVBoxLayout() //! [2] layout.addWidget(pageComboBox) //! [3] layout.addWidget(stackedWidget) setLayout(layout) //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/qstandarditemmodel/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include class Widget : public QWidget { public: Widget(QWidget *parentWidget = 0); }; Widget::Widget(QWidget *parentWidget) : QWidget(parentWidget) { QStandardItemModel *model = new QStandardItemModel(); QModelIndex parent; for (int i = 0; i < 4; ++i) { parent = model->index(0, 0, parent); model->insertRows(0, 1, parent); model->insertColumns(0, 1, parent); QModelIndex index = model->index(0, 0, parent); model->setData(index, i); } } int main(int argc, char *argv[]) { QApplication app(argc, argv); Widget widget; widget.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qstatustipevent/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] //! [1] def __init__(self, parent): QMainWindow.__init__(self, parent) //! [0] myWidget = QWidget() myWidget.setStatusTip(tr("This is my widget.")) setCentralWidget(myWidget) //! [1] //! [2] fileMenu = menuBar().addMenu(tr("File")) Act = QAction(self.tr("&New"), self) Act.setStatusTip(tr("Create a new file.")) fileMenu.addAction(Act) //! [2] statusBar().showMessage(self.tr("Ready")) setWindowTitle(tr("QStatusTipEvent")) //! [3] //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/qstringlistmodel/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class Widget : public QWidget { public: Widget(QWidget *parent = 0); }; Widget::Widget(QWidget *parent) : QWidget(parent) { //! [0] model = QStringListModel() list = QStringList() list.append("a") list.append("b") list.append("c") model.setStringList(list) //! [0] } int main(int argc, char *argv[]) { QApplication app(argc, argv); Widget widget; widget.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qstyleoption/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] def paintEvent(self, qpaintevent): option = QStyleOptionButton() option.initFrom(self) if isDown(): option.state = QStyle.State_Sunken else: option.state = QStyle.State_Raised if self.isDefault(): option.features = option.features or QStyleOptionButton.DefaultButton option.text = self.text() option.icon = self.icon() painter = QPainter(self) self.style().drawControl(QStyle.CE_PushButton, option, painter, self) //! [0] //! [1] option = QStyleOptionFrame() if isinstance(option, QStyleOptionFrameV2): frameOptionV2 = QStyleOptionFrameV2(option) # draw the frame using frameOptionV2 //! [1] //! [2] if isinstance(option, QStyleOptionProgressBarV2): progressBarV2 = QStyleOptionProgressBarV2(option) # draw the progress bar using progressBarV2 //! [2] //! [3] if isinstance(option, QStyleOptionTabV2): tabV2 = QStyleOptionTabV2(option) # draw the tab using tabV2 //! [3] //! [4] def drawPrimitive(self, element, option, painter, widget): if element == self.PE_FrameFocusRect: focusRectOption = QStyleOptionFocusRect(option) if focusRectOption: # ... # ... //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/qstyleplugin/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include class MyStylePlugin : public QStylePlugin { public: MyStylePlugin(QObject *parent = 0); QStyle *create(const QString &key); QStringList keys() const; }; class RocketStyle : public QCommonStyle { public: RocketStyle() {}; }; class StarBusterStyle : public QCommonStyle { public: StarBusterStyle() {}; }; MyStylePlugin::MyStylePlugin(QObject *parent) : QStylePlugin(parent) { } //! [0] QStringList MyStylePlugin::keys() const { return QStringList() << "Rocket" << "StarBuster"; } //! [0] //! [1] QStyle *MyStylePlugin::create(const QString &key) { QString lcKey = key; if (lcKey == "rocket") { return new RocketStyle; } else if (lcKey == "starbuster") { return new StarBusterStyle; } return 0; //! [1] //! [2] } //! [2] int main(int argc, char *argv[]) { QApplication app(argc, argv); MyStylePlugin plugin; return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qsvgwidget/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); //! [0] QSvgWidget window(":/files/spheres.svg"); window.show(); //! [0] QSvgRenderer *renderer = window.renderer(); QImage image(150, 150, QImage::Format_RGB32); QPainter painter; painter.begin(&image); renderer->render(&painter); painter.end(); image.save("spheres.png", "PNG", 9); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qsvgwidget/qsvgwidget.qrc ================================================ spheres.svg ================================================ FILE: doc/codesnippets/doc/src/snippets/qt-namespace/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argc, char *argv[]) { return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-dnd/images.qrc ================================================ Images/squared.png Images/cubed.png ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-dnd/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-dnd/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "math.h" #include "mainwindow.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); QMenu *itemsMenu = new QMenu(tr("&Items")); QAction *sumItemsAction = itemsMenu->addAction(tr("&Sum Items")); QAction *averageItemsAction = itemsMenu->addAction(tr("&Average Items")); menuBar()->addMenu(fileMenu); menuBar()->addMenu(itemsMenu); tableWidget = new QTableWidget(12, 3, this); tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); tableWidget->setDragEnabled(true); tableWidget->setAcceptDrops(true); tableWidget->setDropIndicatorShown(true); QTableWidgetItem *valuesHeaderItem = new QTableWidgetItem(tr("Values")); tableWidget->setHorizontalHeaderItem(0, valuesHeaderItem); valuesHeaderItem->setTextAlignment(Qt::AlignVCenter); QTableWidgetItem *squaresHeaderItem = new QTableWidgetItem(tr("Squares")); squaresHeaderItem->setIcon(QIcon(QPixmap(":/Images/squared.png"))); squaresHeaderItem->setTextAlignment(Qt::AlignVCenter); QTableWidgetItem *cubesHeaderItem = new QTableWidgetItem(tr("Cubes")); cubesHeaderItem->setIcon(QIcon(QPixmap(":/Images/cubed.png"))); cubesHeaderItem->setTextAlignment(Qt::AlignVCenter); tableWidget->setHorizontalHeaderItem(1, squaresHeaderItem); tableWidget->setHorizontalHeaderItem(2, cubesHeaderItem); connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); connect(sumItemsAction, SIGNAL(triggered()), this, SLOT(sumItems())); connect(averageItemsAction, SIGNAL(triggered()), this, SLOT(averageItems())); setupTableItems(); setCentralWidget(tableWidget); setWindowTitle(tr("Table Widget")); } void MainWindow::setupTableItems() { for (int row = 0; row < tableWidget->rowCount()-1; ++row) { for (int column = 0; column < tableWidget->columnCount(); ++column) { QTableWidgetItem *newItem = new QTableWidgetItem(tr("%1").arg( pow((float)row, (float)column+1))); tableWidget->setItem(row, column, newItem); } } for (int column = 0; column < tableWidget->columnCount(); ++column) { QTableWidgetItem *newItem = new QTableWidgetItem; newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); tableWidget->setItem(tableWidget->rowCount()-1, column, newItem); } } void MainWindow::averageItems() { QList selected = tableWidget->selectedItems(); QTableWidgetItem *item; int number = 0; double total = 0; foreach (item, selected) { bool ok; double value = item->text().toDouble(&ok); if (ok && !item->text().isEmpty()) { total += value; number++; } } if (number > 0) tableWidget->currentItem()->setText(QString::number(total/number)); } void MainWindow::sumItems() { QList selected = tableWidget->selectedItems(); QTableWidgetItem *item; int number = 0; double total = 0; foreach (item, selected) { bool ok; double value = item->text().toDouble(&ok); if (ok && !item->text().isEmpty()) { total += value; number++; } } if (number > 0) tableWidget->currentItem()->setText(QString::number(total)); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-dnd/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QAction; class QTableWidget; class QTableWidgetItem; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void averageItems(); void sumItems(); private: void setupTableItems(); QAction *removeAction; QTableWidget *tableWidget; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-resizing/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-resizing/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); QMenu *tableMenu = new QMenu(tr("&Table")); QAction *tableWidthAction = tableMenu->addAction(tr("Change Table &Width")); QAction *tableHeightAction = tableMenu->addAction(tr("Change Table &Height")); menuBar()->addMenu(fileMenu); menuBar()->addMenu(tableMenu); //! [0] tableWidget = QTableWidget() //! [0] tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); connect(tableWidthAction, SIGNAL(triggered()), this, SLOT(changeWidth())); connect(tableHeightAction, SIGNAL(triggered()), this, SLOT(changeHeight())); setupTableItems(); setCentralWidget(tableWidget); setWindowTitle(tr("Table Widget Resizing")); } void MainWindow::setupTableItems() { //! [1] tableWidget.setRowCount(10) tableWidget.setColumnCount(5) //! [1] for (int row = 0; row < tableWidget->rowCount(); ++row) { for (int column = 0; column < tableWidget->columnCount(); ++column) { //! [2] newItem = QTableWidgetItem(tr("%s" % ((row+1)*(column+1)))) tableWidget.setItem(row, column, newItem) //! [2] } } } void MainWindow::changeWidth() { bool ok; int newWidth = QInputDialog::getInteger(this, tr("Change table width"), tr("Input the number of columns required (1-20):"), tableWidget->columnCount(), 1, 20, 1, &ok); if (ok) tableWidget->setColumnCount(newWidth); } void MainWindow::changeHeight() { bool ok; int newHeight = QInputDialog::getInteger(this, tr("Change table height"), tr("Input the number of rows required (1-20):"), tableWidget->rowCount(), 1, 20, 1, &ok); if (ok) tableWidget->setRowCount(newHeight); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-resizing/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QAction; class QTableWidget; class QTableWidgetItem; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void changeHeight(); void changeWidth(); private: void setupTableItems(); QTableWidget *tableWidget; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-using/images.qrc ================================================ Images/squared.png Images/cubed.png ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-using/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-using/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "math.h" #include "mainwindow.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); QMenu *itemsMenu = new QMenu(tr("&Items")); QAction *sumItemsAction = itemsMenu->addAction(tr("&Sum Items")); QAction *averageItemsAction = itemsMenu->addAction(tr("&Average Items")); menuBar()->addMenu(fileMenu); menuBar()->addMenu(itemsMenu); //! [0] tableWidget = QTableWidget(12, 3, self) //! [0] tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //! [1] valuesHeaderItem = QTableWidgetItem(tr("Values")) tableWidget.setHorizontalHeaderItem(0, valuesHeaderItem) //! [1] valuesHeaderItem->setTextAlignment(Qt::AlignVCenter); QTableWidgetItem *squaresHeaderItem = new QTableWidgetItem(tr("Squares")); squaresHeaderItem->setIcon(QIcon(QPixmap(":/Images/squared.png"))); squaresHeaderItem->setTextAlignment(Qt::AlignVCenter); //! [2] cubesHeaderItem = QTableWidgetItem(tr("Cubes")) cubesHeaderItem.setIcon(QIcon(QPixmap(":/Images/cubed.png"))) cubesHeaderItem.setTextAlignment(Qt::AlignVCenter) //! [2] tableWidget->setHorizontalHeaderItem(1, squaresHeaderItem); tableWidget->setHorizontalHeaderItem(2, cubesHeaderItem); connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); connect(sumItemsAction, SIGNAL(triggered()), this, SLOT(sumItems())); connect(averageItemsAction, SIGNAL(triggered()), this, SLOT(averageItems())); setupTableItems(); setCentralWidget(tableWidget); setWindowTitle(tr("Table Widget")); } void MainWindow::setupTableItems() { for (int row = 0; row < tableWidget->rowCount()-1; ++row) { for (int column = 0; column < tableWidget->columnCount(); ++column) { //! [3] newItem = QTableWidgetItem(tr("%s" % pow(row, column+1))) tableWidget.setItem(row, column, newItem) //! [3] } } for (int column = 0; column < tableWidget->columnCount(); ++column) { QTableWidgetItem *newItem = new QTableWidgetItem; newItem->setFlags(Qt::ItemIsEnabled); tableWidget->setItem(tableWidget->rowCount()-1, column, newItem); } } void MainWindow::averageItems() { QList selected = tableWidget->selectedItems(); QTableWidgetItem *item; int number = 0; double total = 0; foreach (item, selected) { bool ok; double value = item->text().toDouble(&ok); if (ok && !item->text().isEmpty()) { total += value; number++; } } if (number > 0) tableWidget->currentItem()->setText(QString::number(total/number)); } void MainWindow::sumItems() { //! [4] QList selected = tableWidget->selectedItems(); QTableWidgetItem *item; int number = 0; double total = 0; foreach (item, selected) { bool ok; double value = item->text().toDouble(&ok); if (ok && !item->text().isEmpty()) { total += value; number++; } } //! [4] if (number > 0) tableWidget->currentItem()->setText(QString::number(total)); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtablewidget-using/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QAction; class QTableWidget; class QTableWidgetItem; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void averageItems(); void sumItems(); private: void setupTableItems(); QAction *removeAction; //! [0] QTableWidget *tableWidget; //! [0] }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtcast/qtcast.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "qtcast.h" MyWidget::MyWidget() { //! [0] QObject *obj = new MyWidget; //! [0] //! [1] QWidget *widget = qobject_cast(obj); //! [1] //! [2] MyWidget *myWidget = qobject_cast(obj); //! [2] //! [3] QLabel *label = qobject_cast(obj); //! [3] //! [4] // label is 0 //! [4] //! [5] if (QLabel *label = qobject_cast(obj)) { //! [5] //! [6] label->setText(tr("Ping")); } else if (QPushButton *button = qobject_cast(obj)) { button->setText(tr("Pong!")); } //! [6] } int main() { return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtcast/qtcast.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QTCAST_H #define QTCAST_H #include class MyWidget : public QWidget { Q_OBJECT public: MyWidget(); }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtest-namespace/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argc, char *argv[]) { QTest::qSleep(10); return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreeview-dnd/dragdropmodel.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of an example program for Qt. ** EDITIONS: NOLIMITS ** ****************************************************************************/ #ifndef DRAGDROPMODEL_H #define DRAGDROPMODEL_H #include "treemodel.h" class DragDropModel : public TreeModel { Q_OBJECT public: DragDropModel(const QStringList &strings, QObject *parent = 0); Qt::ItemFlags flags(const QModelIndex &index) const; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); QMimeData *mimeData(const QModelIndexList &indexes) const; QStringList mimeTypes() const; Qt::DropActions supportedDropActions() const; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreeview-dnd/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreeview-dnd/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" #include "dragdropmodel.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); menuBar()->addMenu(fileMenu); // For convenient quoting: QTreeView *treeView = new QTreeView(this); treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); treeView->setDragEnabled(true); treeView->setAcceptDrops(true); treeView->setDropIndicatorShown(true); this->treeView = treeView; connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); setupItems(); setCentralWidget(treeView); setWindowTitle(tr("Tree View")); } void MainWindow::setupItems() { QStringList items; items << tr("Widgets\tUser interface objects used to create GUI applications.") << tr(" QWidget\tThe basic building block for all other widgets.") << tr(" QDialog\tThe base class for dialog windows.") << tr("Tools\tUtilities and applications for Qt developers.") << tr(" Qt Designer\tA GUI form designer for Qt applications.") << tr(" Qt Assistant\tA documentation browser for Qt documentation."); DragDropModel *model = new DragDropModel(items, this); QModelIndex index = model->index(0, 0, QModelIndex()); model->insertRows(2, 3, index); index = model->index(0, 0, QModelIndex()); index = model->index(2, 0, index); model->setData(index, QVariant("QFrame")); model->removeRows(3, 2, index.parent()); treeView->setModel(model); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreeview-dnd/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QTreeView; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); private: void setupItems(); QTreeView *treeView; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreeview-dnd/treeitem.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* treeitem.cpp A container for items of data supplied by the simple tree model. */ #include #include "treeitem.h" TreeItem::TreeItem(const QList &data, TreeItem *parent) { parentItem = parent; itemData = data; } TreeItem::~TreeItem() { qDeleteAll(childItems); } void TreeItem::appendChild(TreeItem *item) { childItems.append(item); } TreeItem *TreeItem::child(int row) { return childItems.value(row); } int TreeItem::childCount() const { return childItems.count(); } int TreeItem::columnCount() const { return itemData.count(); } QVariant TreeItem::data(int column) const { return itemData.value(column); } bool TreeItem::insertChild(int row, TreeItem *item) { if (row < 0 || row > childItems.count()) return false; childItems.insert(row, item); return true; } TreeItem *TreeItem::parent() { return parentItem; } bool TreeItem::removeChild(int row) { if (row < 0 || row >= childItems.count()) return false; delete childItems.takeAt(row); return true; } int TreeItem::row() const { if (parentItem) return parentItem->childItems.indexOf(const_cast(this)); return 0; } bool TreeItem::setData(int column, const QVariant &data) { if (column < 0 || column >= itemData.count()) return false; itemData.replace(column, data); return true; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreeview-dnd/treeitem.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TREEITEM_H #define TREEITEM_H #include #include class TreeItem { public: TreeItem(const QList &data, TreeItem *parent = 0); ~TreeItem(); void appendChild(TreeItem *child); TreeItem *child(int row); int childCount() const; int columnCount() const; QVariant data(int column) const; bool insertChild(int row, TreeItem *item); TreeItem *parent(); bool removeChild(int row); int row() const; bool setData(int column, const QVariant &data); private: QList childItems; QList itemData; TreeItem *parentItem; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreeview-dnd/treemodel.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* treemodel.cpp Provides a simple tree model to show how to create and use hierarchical models. */ #include #include "treeitem.h" #include "treemodel.h" TreeModel::TreeModel(const QStringList &strings, QObject *parent) : QAbstractItemModel(parent) { QList rootData; rootData << "Title" << "Summary"; rootItem = new TreeItem(rootData); setupModelData(strings, rootItem); } TreeModel::~TreeModel() { delete rootItem; } int TreeModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) return static_cast(parent.internalPointer())->columnCount(); else return rootItem->columnCount(); } QVariant TreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (role != Qt::DisplayRole) return QVariant(); TreeItem *item = static_cast(index.internalPointer()); return item->data(index.column()); } Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::ItemIsEnabled; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) return rootItem->data(section); return QVariant(); } QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const { TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); TreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex(); } bool TreeModel::insertRows(int position, int rows, const QModelIndex &parent) { TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); if (position < 0 || position > parentItem->childCount()) return false; QList blankList; for (int column = 0; column < columnCount(); ++column) blankList << QVariant(""); beginInsertRows(parent, position, position + rows - 1); for (int row = 0; row < rows; ++row) { TreeItem *newItem = new TreeItem(blankList, parentItem); if (!parentItem->insertChild(position, newItem)) break; } endInsertRows(); return true; } QModelIndex TreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); TreeItem *childItem = static_cast(index.internalPointer()); TreeItem *parentItem = childItem->parent(); if (parentItem == rootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } bool TreeModel::removeRows(int position, int rows, const QModelIndex &parent) { TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); if (position < 0 || position > parentItem->childCount()) return false; beginRemoveRows(parent, position, position + rows - 1); for (int row = 0; row < rows; ++row) { if (!parentItem->removeChild(position)) break; } endRemoveRows(); return true; } int TreeModel::rowCount(const QModelIndex &parent) const { TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); return parentItem->childCount(); } bool TreeModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid() || role != Qt::EditRole) return false; TreeItem *item = static_cast(index.internalPointer()); if (item->setData(index.column(), value)) emit dataChanged(index, index); else return false; return true; } void TreeModel::setupModelData(const QStringList &lines, TreeItem *parent) { QList parents; QList indentations; parents << parent; indentations << 0; int number = 0; while (number < lines.count()) { int position = 0; while (position < lines[number].length()) { if (lines[number].mid(position, 1) != " ") break; position++; } QString lineData = lines[number].mid(position).trimmed(); if (!lineData.isEmpty()) { // Read the column data from the rest of the line. QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts); QList columnData; for (int column = 0; column < columnStrings.count(); ++column) columnData << columnStrings[column]; if (position > indentations.last()) { // The last child of the current parent is now the new parent // unless the current parent has no children. if (parents.last()->childCount() > 0) { parents << parents.last()->child(parents.last()->childCount()-1); indentations << position; } } else { while (position < indentations.last() && parents.count() > 0) { parents.pop_back(); indentations.pop_back(); } } // Append a new item to the current parent's list of children. parents.last()->appendChild(new TreeItem(columnData, parents.last())); } number++; } } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreeview-dnd/treemodel.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TREEMODEL_H #define TREEMODEL_H #include #include #include class TreeItem; class TreeModel : public QAbstractItemModel { Q_OBJECT public: TreeModel(const QStringList &strings, QObject *parent = 0); ~TreeModel(); QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); private: void setupModelData(const QStringList &lines, TreeItem *parent); TreeItem *rootItem; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreewidget-using/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreewidget-using/mainwindow.cpp ================================================ /############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################/ //! [0] treeWidget = QTreeWidget(self) //! [0] //! [1] treeWidget.setColumnCount(2) //! [1] //! [2] headers = QStringList() headers << tr("Subject") << tr("Default") treeWidget.setHeaderLabels(headers) //! [2] //! [3] cities = QTreeWidgetItem(treeWidget) cities.setText(0, tr("Cities")) osloItem = QTreeWidgetItem(cities) osloItem.setText(0, tr("Oslo")) osloItem.setText(1, tr("Yes")) //! [3] //! [4] //! [5] planets = QTreeWidgetItem(treeWidget, cities) //! [4] planets.setText(0, tr("Planets")) //! [5] //! [6] item = QTreeWidgetItem() //! [6] //! [7] found = treeWidget.findItems(itemText, Qt.MatchWildcard) for item in found: treeWidget.setItemSelected(item, True) # Show the item.text(0) for each item. //! [7] //! [8] parent = currentItem.parent() if parent: Item = QTreeWidgetItem(parent, treeWidget.currentItem()) else //! [8] //! [9] Item = QTreeWidgetItem(treeWidget, treeWidget.currentItem()) //! [9] //! [10] parent = currentItem.parent() if parent: index = parent.indexOfChild(treeWidget->currentItem()) delete parent.takeChild(index) else: index = treeWidget.indexOfTopLevelItem(treeWidget->currentItem()) delete treeWidget.takeTopLevelItem(index) //! [10] //! [11] //! [11] ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreewidget-using/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QAction; class QTreeWidget; class QTreeWidgetItem; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void findItems(); void insertItem(); void removeItem(); void sortAscending(); void sortDescending(); void updateMenus(QTreeWidgetItem *current); void updateSortItems(); private: void setupTreeItems(); QAction *ascendingAction; QAction *autoSortAction; QAction *descendingAction; QAction *insertAction; QAction *removeAction; QTreeWidget *treeWidget; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreewidgetitemiterator-using/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreewidgetitemiterator-using/mainwindow.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] it = QTreeWidgetItemIterator(treeWidget) while it: if it.text(0) == itemText: *it.setSelected(True) ++it //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/qtreewidgetitemiterator-using/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QAction; class QTreeWidget; class QTreeWidgetItem; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void findItems(); void insertItem(); void removeItem(); void sortAscending(); void sortDescending(); void updateMenus(QTreeWidgetItem *current); void updateSortItems(); private: void setupTreeItems(); QAction *ascendingAction; QAction *autoSortAction; QAction *descendingAction; QAction *insertAction; QAction *removeAction; QTreeWidget *treeWidget; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtscript/evaluation/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argc, char *argv[]) { //! [0] QScriptEngine engine; qDebug() << "the magic number is:" << engine.evaluate("1 + 2").toNumber(); //! [0] return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtscript/registeringobjects/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "myobject.h" int main(int argc, char *argv[]) { //! [0] QScriptEngine engine; QObject *someObject = new MyObject; QScriptValue objectValue = engine.newQObject(someObject); engine.globalObject().setProperty("myObject", objectValue); //! [0] qDebug() << "myObject's calculate() function returns" << engine.evaluate("myObject.calculate(10)").toNumber(); return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtscript/registeringobjects/myobject.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "myobject.h" MyObject::MyObject() { } int MyObject::calculate(int value) const { int total = 0; for (int i = 0; i <= value; ++i) total += i; return total; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtscript/registeringobjects/myobject.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MYOBJECT_H #define MYOBJECT_H #include class MyObject : public QObject { Q_OBJECT public: MyObject(); public slots: int calculate(int value) const; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qtscript/registeringvalues/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argc, char *argv[]) { QScriptEngine engine; //! [0] engine.globalObject().setProperty("foo", 123); qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber(); //! [0] return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtscript/scriptedslot/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "myobject.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QScriptEngine engine; QFile scriptFile(":/object.js"); scriptFile.open(QFile::ReadOnly); engine.evaluate(scriptFile.readAll()); scriptFile.close(); QTextEdit editor; QTimer timer; QScriptValue constructor = engine.evaluate("Object"); QScriptValueList arguments; arguments << engine.newQObject(&timer); arguments << engine.newQObject(&editor); QScriptValue object = constructor.construct(arguments); if (engine.hasUncaughtException()) { qDebug() << engine.uncaughtException().toString(); } editor.show(); timer.start(1000); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtscript/scriptedslot/object.js ================================================ function Object(timer, editor) { this.editor = editor; this.counter = 0; timer.timeout.connect(notify); timer.timeout.connect(this, this.addLine); } Object.prototype.addLine = function() { this.editor.append(this.counter); this.counter += 1; } function notify() { print("timeout() received"); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qtscript/scriptedslot/scriptedslot.qrc ================================================ object.js ================================================ FILE: doc/codesnippets/doc/src/snippets/quiloader/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "mywidget.h" //! [0] def loadCustomWidget(parent): loader = QUiLoader() availableWidgets = loader.availableWidgets() if availableWidgets.contains("AnalogClock"): myWidget = loader.createWidget("AnalogClock", parent) return myWidget //! [0] int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.show(); QWidget *customWidget = loadCustomWidget(0); customWidget->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/quiloader/myform.ui ================================================ Form 0 0 258 224 Export Document 8 6 Export Options 8 6 &DocBook &LaTeX true Include p&ictures true Qt::Vertical 20 40 &Compress &HTML &PostScript PD&F Include &metadata Create inde&x true ================================================ FILE: doc/codesnippets/doc/src/snippets/quiloader/mywidget.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "mywidget.h" //! [0] class MyWidget(QWidget): def __init__(self, parent): super(QWidget, self).__init__(parent) loader = QUiLoader() file = QFile(":/forms/myform.ui") file.open(QFile.ReadOnly) myWidget = loader.load(file, self) file.close() layout = QVBoxLayout() layout.addWidget(myWidget) self.setLayout(layout) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/quiloader/mywidget.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MYWIDGET_H #define MYWIDGET_H #include class MyWidget : public QWidget { public: MyWidget(QWidget *parent = 0); }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/quiloader/mywidget.qrc ================================================ myform.ui ================================================ FILE: doc/codesnippets/doc/src/snippets/qx11embedcontainer/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include //! [0] int main(int argc, char *argv[]) { QApplication app(argc, argv); if (app.arguments().count() != 2) { qFatal("Error - expected executable path as argument"); return 1; } QX11EmbedContainer container; container.show(); QProcess process(&container); QString executable(app.arguments()[1]); QStringList arguments; arguments << QString::number(container.winId()); process.start(executable, arguments); int status = app.exec(); process.close(); return status; } //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/qx11embedwidget/embedwidget.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "embedwidget.h" EmbedWidget::EmbedWidget(QWidget *parent) : QX11EmbedWidget(parent) { gradient = QRadialGradient(100, 100, 90, 60, 60); gradient.setColorAt(0.0, Qt::white); gradient.setColorAt(0.9, QColor(192, 192, 255)); gradient.setColorAt(1.0, QColor(0, 32, 64)); } QSize EmbedWidget::sizeHint() const { return QSize(200, 200); } void EmbedWidget::paintEvent(QPaintEvent *event) { QPainter painter; painter.begin(this); painter.setRenderHint(QPainter::Antialiasing); painter.fillRect(event->rect(), QBrush(gradient)); painter.end(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/qx11embedwidget/embedwidget.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef EMBEDWIDGET_H #define EMBEDWIDGET_H #include #include #include class QPaintEvent; class EmbedWidget : public QX11EmbedWidget { Q_OBJECT public: EmbedWidget(QWidget *parent = 0); QSize sizeHint() const; protected: void paintEvent(QPaintEvent *event); private: QRadialGradient gradient; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/qx11embedwidget/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "embedwidget.h" //! [0] int main(int argc, char *argv[]) { QApplication app(argc, argv); if (app.arguments().count() != 2) { qFatal("Error - expected window id as argument"); return 1; } QString windowId(app.arguments()[1]); EmbedWidget window; window.embedInto(windowId.toULong()); window.show(); return app.exec(); } //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/qxmlquery/bindingExample.cpp ================================================ //! [0] QBuffer device; device.setData(myQString.toUtf8()); device.open(QIODevice::ReadOnly); QXmlQuery query; query.setQuery("doc($inputDocument)/query[theDocument]"); query.bindVariable("inputDocument", &device); //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/qxmlschema/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include class Schema { public: void loadFromUrl() const; void loadFromFile() const; void loadFromData() const; }; void Schema::loadFromUrl() const { //! [0] url = QUrl("http://www.schema-example.org/myschema.xsd") schema = QXmlSchema() if schema.load(url): qDebug("schema is valid") else: qDebug("schema is invalid") //! [0] } void Schema::loadFromFile() const { //! [1] file = QFile("myschema.xsd") file.open(QIODevice.ReadOnly) schema = QXmlSchema() schema.load(file, QUrl.fromLocalFile(file.fileName())) if schema.isValid(): qDebug("schema is valid") else: qDebug("schema is invalid") //! [1] } void Schema::loadFromData() const { //! [2] data = QByteArray("" + "" + "" ) schema = QXmlSchema() schema.load(data) if schema.isValid(): qDebug("schema is valid") else: qDebug("schema is invalid") //! [2] } int main(int argc, char **argv) { QCoreApplication app(argc, argv); Schema schema; schema.loadFromUrl(); schema.loadFromFile(); schema.loadFromData(); return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/qxmlschemavalidator/main.cpp ================================================ def validateFromUrl(): //! [0] schema = getSchema() url = QUrl("http://www.schema-example.org/test.xml") validator = QXmlSchemaValidator(schema) if validator.validate(url): print "instance document is valid" else: print "instance document is invalid" //! [0] def validateFromFile(): //! [1] schema = getSchema() file = QFile("test.xml") file.open(QIODevice.ReadOnly) validator = QXmlSchemaValidator(schema) if validator.validate(file, QUrl.fromLocalFile(file.fileName())): print "instance document is valid" else: print "instance document is invalid" //! [1] } def validateFromData(): //! [2] schema = getSchema() data = QByteArray("") buffer = QBuffer(data) buffer.open(QIODevice.ReadOnly) QXmlSchemaValidator validator(schema) if validator.validate(buffer): print "instance document is valid" else: print "instance document is invalid" //! [2] def validateComplete(): //! [3] schemaUrl = QUrl("file:///home/user/schema.xsd") schema = QXmlSchema() schema.load(schemaUrl) if schema.isValid(): file = QFile("test.xml") file.open(QIODevice.ReadOnly) validator = QXmlSchemaValidator(schema) if validator.validate(file, QUrl.fromLocalFile(file.fileName())): print "instance document is valid" else: print "instance document is invalid" } //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/qxmlstreamwriter/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QFile output; output.open(stdout, QIODevice::WriteOnly); //! [write output] //! [start stream] QXmlStreamWriter stream(&output); stream.setAutoFormatting(true); stream.writeStartDocument(); //! [start stream] stream.writeDTD(""); stream.writeStartElement("xbel"); stream.writeAttribute("version", "1.0"); stream.writeStartElement("folder"); stream.writeAttribute("folded", "no"); //! [write element] stream.writeStartElement("bookmark"); stream.writeAttribute("href", "http://www.qtsoftware.com/"); stream.writeTextElement("title", "Qt Home"); stream.writeEndElement(); // bookmark //! [write element] stream.writeEndElement(); // folder stream.writeEndElement(); // xbel //! [finish stream] stream.writeEndDocument(); //! [finish stream] //! [write output] output.close(); return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/reading-selections/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* main.cpp A simple example that shows how selections can be used directly on a model. It shows the result of some selections made using a table view. */ #include #include "window.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow *window = new MainWindow; window->show(); window->resize(640, 480); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/reading-selections/model.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MODEL_H #define MODEL_H #include #include #include class TableModel : public QAbstractTableModel { Q_OBJECT public: TableModel(int rows = 1, int columns = 1, QObject *parent = 0); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool insertColumns(int position, int columns, const QModelIndex &parent = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool removeColumns(int position, int columns, const QModelIndex &parent = QModelIndex()); private: QList rowList; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/reading-selections/window.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* window.cpp A minimal subclass of QTableView with slots to allow the selection model to be monitored. */ #include #include #include #include #include #include #include "model.h" #include "window.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle("Selected Items in a Table Model"); model = new TableModel(8, 4, this); table = new QTableView(this); table->setModel(model); QMenu *actionMenu = new QMenu(tr("&Actions"), this); QAction *fillAction = actionMenu->addAction(tr("&Fill Selection")); QAction *clearAction = actionMenu->addAction(tr("&Clear Selection")); QAction *selectAllAction = actionMenu->addAction(tr("&Select All")); menuBar()->addMenu(actionMenu); connect(fillAction, SIGNAL(triggered()), this, SLOT(fillSelection())); connect(clearAction, SIGNAL(triggered()), this, SLOT(clearSelection())); connect(selectAllAction, SIGNAL(triggered()), this, SLOT(selectAll())); selectionModel = table->selectionModel(); statusBar(); setCentralWidget(table); } void MainWindow::fillSelection() { //! [0] QModelIndexList indexes = selectionModel->selectedIndexes(); QModelIndex index; foreach(index, indexes) { QString text = QString("(%1,%2)").arg(index.row()).arg(index.column()); model->setData(index, text); } //! [0] } void MainWindow::clearSelection() { QModelIndexList indexes = selectionModel->selectedIndexes(); QModelIndex index; foreach(index, indexes) model->setData(index, ""); } void MainWindow::selectAll() { //! [1] QModelIndex parent = QModelIndex(); //! [1] //! [2] QModelIndex topLeft = model->index(0, 0, parent); QModelIndex bottomRight = model->index(model->rowCount(parent)-1, model->columnCount(parent)-1, parent); //! [2] //! [3] QItemSelection selection(topLeft, bottomRight); selectionModel->select(selection, QItemSelectionModel::Select); //! [3] } ================================================ FILE: doc/codesnippets/doc/src/snippets/reading-selections/window.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include #include #include #include class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); private slots: void fillSelection(); void clearSelection(); void selectAll(); private: QAbstractItemModel *model; QItemSelectionModel *selectionModel; QTableView *table; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/scribe-overview/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include from PySide.QtGui import * # edit : QTextEdit def mergeFormat(edit): //! [0] document = edit.document() cursor = QTextCursor(document) cursor.movePosition(QTextCursor.Start) cursor.movePosition(QTextCursor.EndOfLine, QTextCursor.KeepAnchor) format = QTextCharFormat() format.setFontWeight(QFont.Bold) cursor.mergeCharFormat(format) //! [0] def main(): aStringContainingHTMLtext QString("

Scribe Overview

") app = QApplication(sys.argv) //! [1] editor = QTextEdit(None) editor.setHtml(aStringContainingHTMLtext) editor.show() //! [1] return app.exec_() ================================================ FILE: doc/codesnippets/doc/src/snippets/scriptdebugger.cpp ================================================ #include #include #include // Perhaps shpw entire example for getting debugger up with script int main(int argv, char **args) { QApplication app(argv, args); QString fileName("helloscript.qs"); QFile scriptFile(fileName); scriptFile.open(QIODevice::ReadOnly); QTextStream stream(&scriptFile); QString contents = stream.readAll(); scriptFile.close(); QScriptEngine *engine = new QScriptEngine(); QScriptEngineDebugger *debugger = new QScriptEngineDebugger(); debugger->attachTo(engine); // Set up configuration with only stack and code QWidget *widget = new QWidget; //![0] codeWindow = debugger.widget(QScriptEngineDebugger.CodeWidget) stackWidget = debugger.widget(QScriptEngineDebugger.StackWidget) layout = QHBoxLayout() layout.addWidget(codeWindow) layout.addWidget(stackWidget) //![0] //![1] continueAction = debugger.action(QScriptEngineDebugger.ContinueAction) stepOverAction = debugger.action(QScriptEngineDebugger.StepOverAction) stepIntoAction = debugger.action(QScriptEngineDebugger.StepIntoAction) toolBar = QToolBar() toolBar.addAction(continueAction) //![1] toolBar->addAction(stepOverAction); toolBar->addAction(stepIntoAction); layout->addWidget(toolBar); continueAction->setIcon(QIcon("copy.png")); debugger->setAutoShowStandardWindow(false); widget->setLayout(layout); widget->show(); QPushButton button; QScriptValue scriptButton = engine->newQObject(&button); engine->globalObject().setProperty("button", scriptButton); //![2] debugger.action(QScriptEngineDebugger.InterruptAction).trigger() engine.evaluate(contents, fileName) //![2] return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/seekslider.cpp ================================================ #include #include #include #include #include int main(int argv, char **args) { QApplication app(argv, args) //![0] moo = Phonon.MediaObject() device = Phonon.AudioOutput() Phonon.createPath(moo, device) moo.setCurrentSource(QString("/home/gvatteka/Music/Lumme-Badloop.ogg")) slider = Phonon.SeekSlider() slider.setMediaObject(moo) slider.show() moo.play() //![0] app.exec() } ================================================ FILE: doc/codesnippets/doc/src/snippets/separations/finalwidget.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* finalwidget.cpp A widget to display an image and a label containing a description. */ #include #include "finalwidget.h" FinalWidget::FinalWidget(QWidget *parent, const QString &name, const QSize &labelSize) : QFrame(parent) { hasImage = false; imageLabel = new QLabel; imageLabel->setFrameShadow(QFrame::Sunken); imageLabel->setFrameShape(QFrame::StyledPanel); imageLabel->setMinimumSize(labelSize); nameLabel = new QLabel(name); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(imageLabel, 1); layout->addWidget(nameLabel, 0); setLayout(layout); } /*! If the mouse moves far enough when the left mouse button is held down, start a drag and drop operation. */ void FinalWidget::mouseMoveEvent(QMouseEvent *event) { if (!(event->buttons() & Qt::LeftButton)) return; if ((event->pos() - dragStartPosition).manhattanLength() < QApplication::startDragDistance()) return; if (!hasImage) return; QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; //! [0] output = QByteArray() outputBuffer = QBuffer(output) outputBuffer.open(QIODevice.WriteOnly) imageLabel.pixmap().toImage().save(outputBuffer, "PNG") mimeData.setData("image/png", output) //! [0] /* //! [1] mimeData.setImageData(QVariant(imageLabel.pixmap())) //! [1] */ drag.setMimeData(mimeData) drag.setPixmap(imageLabel.pixmap().scaled(64, 64, Qt.KeepAspectRatio)) //! [2] drag.setHotSpot(QPoint(drag.pixmap().width()/2, drag.pixmap().height())) //! [2] drag->start(); } /*! Check for left mouse button presses in order to enable drag and drop. */ void FinalWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) dragStartPosition = event->pos(); } const QPixmap* FinalWidget::pixmap() const { return imageLabel->pixmap(); } void FinalWidget::setPixmap(const QPixmap &pixmap) { imageLabel->setPixmap(pixmap); hasImage = true; } ================================================ FILE: doc/codesnippets/doc/src/snippets/separations/finalwidget.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef FINALWIDGET_H #define FINALWIDGET_H #include #include #include #include class QGridLayout; class QLabel; class QMouseEvent; class QWidget; class FinalWidget : public QFrame { Q_OBJECT public: FinalWidget(QWidget *parent, const QString &name, const QSize &labelSize); void setPixmap(const QPixmap &pixmap); const QPixmap *pixmap() const; protected: void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); private: void createImage(); bool hasImage; QImage originalImage; QLabel *imageLabel; QLabel *nameLabel; QPoint dragStartPosition; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/separations/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "viewer.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Viewer viewer; viewer.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/separations/screenwidget.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* screenwidget.cpp A widget to display colour components from an image using independently selected colors. Controls are provided to allow the image to be inverted, and the color to be selection via a standard dialog. The image is displayed in a label widget. */ #include #include #include #include #include #include #include #include #include #include #include #include "screenwidget.h" /*! Initializes the paint color, the mask color (cyan, magenta, or yellow), connects the color selector and invert checkbox to functions, and creates a two-by-two grid layout. */ ScreenWidget::ScreenWidget(QWidget *parent, QColor initialColor, const QString &name, Separation mask, const QSize &labelSize) : QFrame(parent) { paintColor = initialColor; maskColor = mask; inverted = false; imageLabel = new QLabel; imageLabel->setFrameShadow(QFrame::Sunken); imageLabel->setFrameShape(QFrame::StyledPanel); imageLabel->setMinimumSize(labelSize); nameLabel = new QLabel(name); colorButton = new QPushButton(tr("Modify...")); colorButton->setBackgroundRole(QPalette::Button); colorButton->setMinimumSize(32, 32); QPalette palette(colorButton->palette()); palette.setColor(QPalette::Button, initialColor); colorButton->setPalette(palette); invertButton = new QPushButton(tr("Invert")); //invertButton->setToggleButton(true); //invertButton->setOn(inverted); invertButton->setEnabled(false); connect(colorButton, SIGNAL(clicked()), this, SLOT(setColor())); connect(invertButton, SIGNAL(clicked()), this, SLOT(invertImage())); QGridLayout *gridLayout = new QGridLayout; gridLayout->addWidget(imageLabel, 0, 0, 1, 2); gridLayout->addWidget(nameLabel, 1, 0); gridLayout->addWidget(colorButton, 1, 1); gridLayout->addWidget(invertButton, 2, 1, 1, 1); setLayout(gridLayout); } /*! Creates a new image by separating out the cyan, magenta, or yellow component, depending on the mask color specified in the constructor. The amount of the component found in each pixel of the image is used to determine how much of a user-selected ink is used for each pixel in the new image for the label widget. */ void ScreenWidget::createImage() { newImage = originalImage.copy(); // Create CMY components for the ink being used. float cyanInk = (255 - paintColor.red())/255.0; float magentaInk = (255 - paintColor.green())/255.0; float yellowInk = (255 - paintColor.blue())/255.0; int (*convert)(QRgb); switch (maskColor) { case Cyan: convert = qRed; break; case Magenta: convert = qGreen; break; case Yellow: convert = qBlue; break; } for (int y = 0; y < newImage.height(); ++y) { for (int x = 0; x < newImage.width(); ++x) { QRgb p(originalImage.pixel(x, y)); // Separate the source pixel into its cyan component. int amount; if (inverted) amount = convert(p); else amount = 255 - convert(p); QColor newColor( 255 - qMin(int(amount * cyanInk), 255), 255 - qMin(int(amount * magentaInk), 255), 255 - qMin(int(amount * yellowInk), 255)); newImage.setPixel(x, y, newColor.rgb()); } } imageLabel->setPixmap(QPixmap::fromImage(newImage)); } /*! Returns a pointer to the modified image. */ QImage* ScreenWidget::image() { return &newImage; } /*! Sets whether the amount of ink applied to the canvas is to be inverted (subtracted from the maximum value) before the ink is applied. */ void ScreenWidget::invertImage() { //inverted = invertButton->isOn(); inverted = !inverted; createImage(); emit imageChanged(); } /*! Separate the current image into cyan, magenta, and yellow components. Create a representation of how each component might appear when applied to a blank white piece of paper. */ void ScreenWidget::setColor() { QColor newColor = QColorDialog::getColor(paintColor); if (newColor.isValid()) { paintColor = newColor; QPalette palette(colorButton->palette()); palette.setColor(QPalette::Button, paintColor); colorButton->setPalette(palette); createImage(); emit imageChanged(); } } /*! Records the original image selected by the user, creates a color separation, and enables the invert image checkbox. */ void ScreenWidget::setImage(QImage &image) { originalImage = image; createImage(); invertButton->setEnabled(true); } ================================================ FILE: doc/codesnippets/doc/src/snippets/separations/screenwidget.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef SCREENWIDGET_H #define SCREENWIDGET_H #include #include #include #include class QGridLayout; class QLabel; class QPushButton; class QWidget; class ScreenWidget : public QFrame { Q_OBJECT public: enum Separation { Cyan, Magenta, Yellow }; ScreenWidget(QWidget *parent, QColor initialColor, const QString &name, Separation mask, const QSize &labelSize); void setImage(QImage &image); QImage* image(); signals: void imageChanged(); public slots: void setColor(); void invertImage(); private: void createImage(); bool inverted; QColor paintColor; QImage newImage; QImage originalImage; QLabel *imageLabel; QLabel *nameLabel; QPushButton *colorButton; QPushButton *invertButton; Separation maskColor; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/separations/viewer.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* viewer.cpp Provides a main window for displaying a user-specified original image with three color separations in a grid layout. A main menu provides entries for selecting files, and adjusting the brightness of the separations. */ #include #include "finalwidget.h" #include "screenwidget.h" #include "viewer.h" /* Constructor: initializes a default value for the brightness, creates the main menu entries, and constructs a central widget that contains enough space for images to be displayed. */ Viewer::Viewer() { setWindowTitle(tr("QImage Color Separations")); brightness = 255; createMenus(); setCentralWidget(createCentralWidget()); } /* Creates a main menu with two entries: a File menu, to allow the image to be selected, and a Brightness menu to allow the brightness of the separations to be changed. Initially, the Brightness menu items are disabled, but the first entry in the menu is checked to reflect the default brightness. */ void Viewer::createMenus() { fileMenu = new QMenu(tr("&File"), this); brightnessMenu = new QMenu(tr("&Brightness"), this); QAction *openAction = fileMenu->addAction(tr("&Open...")); openAction->setShortcut(QKeySequence("Ctrl+O")); saveAction = fileMenu->addAction(tr("&Save...")); saveAction->setShortcut(QKeySequence("Ctrl+S")); saveAction->setEnabled(false); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(QKeySequence("Ctrl+Q")); QAction *noBrightness = brightnessMenu->addAction(tr("&0%")); noBrightness->setCheckable(true); QAction *quarterBrightness = brightnessMenu->addAction(tr("&25%")); quarterBrightness->setCheckable(true); QAction *halfBrightness = brightnessMenu->addAction(tr("&50%")); halfBrightness->setCheckable(true); QAction *threeQuartersBrightness = brightnessMenu->addAction(tr("&75%")); threeQuartersBrightness->setCheckable(true); QAction *fullBrightness = brightnessMenu->addAction(tr("&100%")); fullBrightness->setCheckable(true); menuMap[noBrightness] = None; menuMap[quarterBrightness] = Quarter; menuMap[halfBrightness] = Half; menuMap[threeQuartersBrightness] = ThreeQuarters; menuMap[fullBrightness] = Full; currentBrightness = fullBrightness; currentBrightness->setChecked(true); brightnessMenu->setEnabled(false); menuBar()->addMenu(fileMenu); menuBar()->addMenu(brightnessMenu); connect(openAction, SIGNAL(triggered()), this, SLOT(chooseFile())); connect(saveAction, SIGNAL(triggered()), this, SLOT(saveImage())); connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); connect(brightnessMenu, SIGNAL(triggered(QAction *)), this, SLOT(setBrightness(QAction *))); } /* Constructs a central widget for the window consisting of a two-by-two grid of labels, each of which will contain an image. We restrict the size of the labels to 256 pixels, and ensure that the window cannot be resized. */ QFrame* Viewer::createCentralWidget() { QFrame* frame = new QFrame(this); grid = new QGridLayout(frame); grid->setSpacing(8); grid->setMargin(4); layout()->setSizeConstraint(QLayout::SetFixedSize); QSize labelSize(256, 256); finalWidget = new FinalWidget(frame, tr("Final image"), labelSize); cyanWidget = new ScreenWidget(frame, Qt::cyan, tr("Cyan"), ScreenWidget::Cyan, labelSize); magentaWidget = new ScreenWidget(frame, Qt::magenta, tr("Magenta"), ScreenWidget::Magenta, labelSize); yellowWidget = new ScreenWidget(frame, Qt::yellow, tr("Yellow"), ScreenWidget::Yellow, labelSize); connect(cyanWidget, SIGNAL(imageChanged()), this, SLOT(createImage())); connect(magentaWidget, SIGNAL(imageChanged()), this, SLOT(createImage())); connect(yellowWidget, SIGNAL(imageChanged()), this, SLOT(createImage())); grid->addWidget(finalWidget, 0, 0, Qt::AlignTop | Qt::AlignHCenter); grid->addWidget(cyanWidget, 0, 1, Qt::AlignTop | Qt::AlignHCenter); grid->addWidget(magentaWidget, 1, 0, Qt::AlignTop | Qt::AlignHCenter); grid->addWidget(yellowWidget, 1, 1, Qt::AlignTop | Qt::AlignHCenter); return frame; } /* Provides a dialog window to allow the user to specify an image file. If a file is selected, the appropriate function is called to process and display it. */ void Viewer::chooseFile() { QString imageFile = QFileDialog::getOpenFileName(this, tr("Choose an image file to open"), path, tr("Images (*.*)")); if (!imageFile.isEmpty()) { openImageFile(imageFile); path = imageFile; } } /* Changes the value of the brightness according to the entry selected in the Brightness menu. The selected entry is checked, and the previously selected entry is unchecked. The color separations are updated to use the new value for the brightness. */ void Viewer::setBrightness(QAction *action) { if (!menuMap.contains(action) || scaledImage.isNull()) return; Brightness amount = menuMap[action]; switch (amount) { case None: brightness = 0; break; case Quarter: brightness = 64; break; case Half: brightness = 128; break; case ThreeQuarters: brightness = 191; break; case Full: brightness = 255; break; default: return; } currentBrightness->setChecked(false); currentBrightness = action; currentBrightness->setChecked(true); createImage(); } /* Load the image from the file given, and create four pixmaps based on the original image. The window caption is set, and the Brightness menu enabled if the image file can be loaded. */ void Viewer::openImageFile(QString &imageFile) { QImage originalImage; if (originalImage.load(imageFile)) { setWindowTitle(imageFile); //menuBar()->setItemEnabled(brightnessMenuId, true); saveAction->setEnabled(true); brightnessMenu->setEnabled(true); /* Note: the ScaleMin value may be different for Qt 4. */ scaledImage = originalImage.scaled(256, 256, Qt::KeepAspectRatio); cyanWidget->setImage(scaledImage); magentaWidget->setImage(scaledImage); yellowWidget->setImage(scaledImage); createImage(); } else (void) QMessageBox::warning(this, tr("Cannot open file"), tr("The selected file could not be opened."), QMessageBox::Cancel, QMessageBox::NoButton, QMessageBox::NoButton); } /* Creates an image by combining the contents of the three screens to present a page preview. The image associated with each screen is separated into cyan, magenta, and yellow components. We add up the values for each component from the three screen images, and subtract the totals from the maximum value for each corresponding primary color. */ void Viewer::createImage() { QImage newImage = scaledImage.copy(); QImage *image1 = cyanWidget->image(); QImage *image2 = magentaWidget->image(); QImage *image3 = yellowWidget->image(); int darkness = 255 - brightness; for (int y = 0; y < newImage.height(); ++y) { for (int x = 0; x < newImage.width(); ++x) { // Create three screens, using the quantities of the source // CMY components to determine how much of each of the // inks are to be put on each screen. QRgb p1(image1->pixel(x, y)); float cyan1 = 255 - qRed(p1); float magenta1 = 255 - qGreen(p1); float yellow1 = 255 - qBlue(p1); QRgb p2(image2->pixel(x, y)); float cyan2 = 255 - qRed(p2); float magenta2 = 255 - qGreen(p2); float yellow2 = 255 - qBlue(p2); QRgb p3(image3->pixel(x, y)); float cyan3 = 255 - qRed(p3); float magenta3 = 255 - qGreen(p3); float yellow3 = 255 - qBlue(p3); QColor newColor( qMax(255 - int(cyan1+cyan2+cyan3) - darkness, 0), qMax(255 - int(magenta1+magenta2+magenta3) - darkness, 0), qMax(255 - int(yellow1+yellow2+yellow3) - darkness, 0)); newImage.setPixel(x, y, newColor.rgb()); } } finalWidget->setPixmap(QPixmap::fromImage(newImage)); } /* Provides a dialog window to allow the user to save the image file. */ void Viewer::saveImage() { QString imageFile = QFileDialog::getSaveFileName(this, tr("Choose a filename to save the image"), "", tr("Images (*.png)")); QFileInfo info(imageFile); if (!info.baseName().isEmpty()) { QString newImageFile = QFileInfo(info.absoluteDir(), info.baseName() + ".png").absoluteFilePath(); if (!finalWidget->pixmap()->save(newImageFile, "PNG")) (void) QMessageBox::warning(this, tr("Cannot save file"), tr("The file could not be saved."), QMessageBox::Cancel, QMessageBox::NoButton, QMessageBox::NoButton); } else (void) QMessageBox::warning(this, tr("Cannot save file"), tr("Please enter a valid filename."), QMessageBox::Cancel, QMessageBox::NoButton, QMessageBox::NoButton); } ================================================ FILE: doc/codesnippets/doc/src/snippets/separations/viewer.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef VIEWER_H #define VIEWER_H #include #include #include class QAction; class QFrame; class QGridLayout; class QLabel; class QMenu; class FinalWidget; class ScreenWidget; class Viewer : public QMainWindow { Q_OBJECT public: enum Brightness { None, Quarter, Half, ThreeQuarters, Full }; Viewer(); public slots: void chooseFile(); void setBrightness(QAction *action); void createImage(); void saveImage(); private: void createMenus(); QFrame *createCentralWidget(); void openImageFile(QString &filePath); FinalWidget *finalWidget; int brightness; QAction *currentBrightness; QAction *saveAction; QGridLayout *grid; QImage scaledImage; QMap menuMap; QMenu *brightnessMenu; QMenu *fileMenu; QString path; ScreenWidget *cyanWidget; ScreenWidget *magentaWidget; ScreenWidget *yellowWidget; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/settings/settings.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include QWidget *win QWidget *panel void snippet_ctor1() { //! [0] settings = QSettings("MySoft", "Star Runner") //! [0] } void snippet_ctor2() { //! [1] QCoreApplication.setOrganizationName("MySoft") //! [1] //! [2] QCoreApplication.setOrganizationDomain("mysoft.com") //! [2] //! [3] QCoreApplication.setApplicationName("Star Runner") //! [3] //! [4] settings = QSettings() //! [4] //! [5] settings.setValue("editor/wrapMargin", 68) //! [5] //! [6] margin = int(settings.value("editor/wrapMargin")) //! [6] { //! [7] margin = int(settings.value("editor/wrapMargin", 80)) //! [7] } //! [8] settings.setValue("mainwindow/size", win.size()) //! [8] //! [9] settings.setValue("mainwindow/fullScreen", win.isFullScreen()) //! [9] //! [10] settings.setValue("outputpanel/visible", panel.isVisible()) //! [10] //! [11] settings.beginGroup("mainwindow") settings.setValue("size", win.size()) settings.setValue("fullScreen", win.isFullScreen()) settings.endGroup() //! [11] //! [12] settings.beginGroup("outputpanel") settings.setValue("visible", panel.isVisible()) settings.endGroup() //! [12] } void snippet_locations() { //! [13] obj1 = QSettings("MySoft", "Star Runner") //! [13] //! [14] obj2 = QSettings("MySoft") obj3 = QSettings(QSettings.SystemScope, "MySoft", "Star Runner") obj4 = QSettings(QSettings.SystemScope, "MySoft") //! [14] { //! [15] settings = QSettings(QSettings.IniFormat, QSettings.UserScope, "MySoft", "Star Runner") //! [15] } { QSettings settings("starrunner.ini", QSettings.IniFormat) } { QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft", QSettings.NativeFormat) } } class MainWindow : public QMainWindow { public: MainWindow() void writeSettings() void readSettings() protected: void closeEvent(QCloseEvent *event) } //! [16] class MainWindow(QMainWindow): ... def writeSettings(self): self.settings = QSettings("Moose Soft", "Clipper") self.settings.beginGroup("MainWindow") self.settings.setValue("size", self.size()) self.settings.setValue("pos", self.pos()) self.settings.endGroup() //! [16] //! [17] def readSettings(self): self.settings = QSettings("Moose Soft", "Clipper") self.settings.beginGroup("MainWindow") self.resize(settings.value("size", QSize(400, 400)).toSize()) self.move(settings.value("pos", QPoint(200, 200)).toPoint()) self.settings.endGroup() //! [17] //! [18] def __init__(self): self.settings = None //! [18] //! [19] self.readSettings() //! [19] //! [20] //! [20] bool userReallyWantsToQuit() { return true; } //! [21] # event : QCloseEvent def closeEvent(self, event): if self.userReallyWantsToQuit(): self.writeSettings() event.accept() else: event.ignore() //! [21] ================================================ FILE: doc/codesnippets/doc/src/snippets/shareddirmodel/main.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ """ main.cpp A simple example of how to view a model in several views, and share a selection model. """ from PySide.QtGui import * //! [0] //! [1] def main(): app = QApplication(sys.argv) splitter = QSplitter() //! [2] //! [3] model = QFileSystemModel() model.setRootPath(QDir.currentPath()) //! [0] //! [2] //! [4] //! [5] tree = QTreeView() //! [3] //! [6] tree.setModel(model) //! [4] //! [6] //! [7] tree.setRootIndex(model.index(QDir.currentPath())) //! [7] list = QListView(splitter) list.setModel(model) list.setRootIndex(model.index(QDir.currentPath())) //! [5] selection = QItemSelectionModel(model) tree.setSelectionModel(selection) list.setSelectionModel(selection) //! [8] splitter.setWindowTitle("Two views onto the same directory model") splitter.show() return app.exec_() //! [1] //! [8] ================================================ FILE: doc/codesnippets/doc/src/snippets/sharedemployee/employee.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "employee.h" ================================================ FILE: doc/codesnippets/doc/src/snippets/sharedemployee/employee.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef EMPLOYEE_H #define EMPLOYEE_H //! [0] #include #include class EmployeeData : public QSharedData { public: EmployeeData() : id(-1) { name.clear(); } EmployeeData(const EmployeeData &other) : QSharedData(other), id(other.id), name(other.name) { } ~EmployeeData() { } int id; QString name; }; class Employee { public: //! [1] Employee() { d = new EmployeeData; } //! [1] //! [2] Employee(int id, QString name) { d = new EmployeeData; setId(id); setName(name); } //! [2] //! [7] Employee(const Employee &other) : d (other.d) { } //! [7] //! [3] void setId(int id) { d->id = id; } //! [3] //! [4] void setName(QString name) { d->name = name; } //! [4] //! [5] int id() const { return d->id; } //! [5] //! [6] QString name() const { return d->name; } //! [6] private: QSharedDataPointer d; }; //! [0] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/sharedemployee/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] #include "employee.h" int main() { Employee e1(1001, "Albrecht Durer"); Employee e2 = e1; e1.setName("Hans Holbein"); } //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/sharedtablemodel/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* main.cpp A simple example that shows how a single model can be shared between multiple views. */ #include #include #include #include #include "model.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); TableModel *model = new TableModel(4, 2, &app); //! [0] QTableView *firstTableView = new QTableView; QTableView *secondTableView = new QTableView; //! [0] //! [1] firstTableView->setModel(model); secondTableView->setModel(model); //! [1] firstTableView->horizontalHeader()->setModel(model); for (int row = 0; row < 4; ++row) { for (int column = 0; column < 2; ++column) { QModelIndex index = model->index(row, column, QModelIndex()); model->setData(index, QVariant(QString("(%1, %2)").arg(row).arg(column))); } } //! [2] secondTableView->setSelectionModel(firstTableView->selectionModel()); //! [2] firstTableView->setWindowTitle("First table view"); secondTableView->setWindowTitle("Second table view"); firstTableView->show(); secondTableView->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/sharedtablemodel/model.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MODEL_H #define MODEL_H #include #include #include class TableModel : public QAbstractTableModel { Q_OBJECT public: TableModel(int rows = 1, int columns = 1, QObject *parent = 0); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool insertColumns(int position, int columns, const QModelIndex &parent = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool removeColumns(int position, int columns, const QModelIndex &parent = QModelIndex()); private: QList rowList; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/signalmapper/accountsfile.txt ================================================ 1 + 1 = 2 ================================================ FILE: doc/codesnippets/doc/src/snippets/signalmapper/filereader.cpp ================================================ #include #include "filereader.h" FileReader::FileReader(QWidget *parent) : QWidget(parent) { textEdit = new QTextEdit; taxFileButton = new QPushButton("Tax File"); accountFileButton = new QPushButton("Accounts File"); reportFileButton = new QPushButton("Report File"); //! [0] signalMapper = new QSignalMapper(this); signalMapper->setMapping(taxFileButton, QString("taxfile.txt")); signalMapper->setMapping(accountFileButton, QString("accountsfile.txt")); signalMapper->setMapping(reportFileButton, QString("reportfile.txt")); connect(taxFileButton, SIGNAL(clicked()), signalMapper, SLOT (map())); connect(accountFileButton, SIGNAL(clicked()), signalMapper, SLOT (map())); connect(reportFileButton, SIGNAL(clicked()), signalMapper, SLOT (map())); //! [0] //! [1] connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(readFile(const QString &))); //! [1] QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addWidget(taxFileButton); buttonLayout->addWidget(accountFileButton); buttonLayout->addWidget(reportFileButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(textEdit); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); } void FileReader::readFile(const QString &filename) { QFile file(filename); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::information(this, tr("Unable to open file"), file.errorString()); return; } QTextStream in(&file); textEdit->setPlainText(in.readAll()); } ================================================ FILE: doc/codesnippets/doc/src/snippets/signalmapper/filereader.h ================================================ #ifndef FILEREADER_H #define FILEREADER_H #include #include #include class FileReader : public QWidget { Q_OBJECT public: FileReader(QWidget *parent=0); void readFromFile(QString filename); public slots: void readFile(const QString &); private: QTextEdit *textEdit; QPushButton *taxFileButton; QPushButton *accountFileButton; QPushButton *reportFileButton; QSignalMapper *signalMapper; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/signalmapper/main.cpp ================================================ #include #include "filereader.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); FileReader *reader = new FileReader; reader->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/signalmapper/reportfile.txt ================================================ Tax this year = 50% Total profit = 2 ================================================ FILE: doc/codesnippets/doc/src/snippets/signalmapper/taxfile.txt ================================================ Tax this year = 50% ================================================ FILE: doc/codesnippets/doc/src/snippets/signalsandslots/lcdnumber.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "lcdnumber.h" LcdNumber::LcdNumber(QWidget *parent) { } void LcdNumber::display(int) { } void LcdNumber::display(double) { } void LcdNumber::display(const QString &) { } void LcdNumber::setHexMode() { } void LcdNumber::setDecMode() { } void LcdNumber::setOctMode() { } void LcdNumber::setBinMode() { } void LcdNumber::setSmallDecimalPoint(bool) { } ================================================ FILE: doc/codesnippets/doc/src/snippets/signalsandslots/lcdnumber.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] #ifndef LCDNUMBER_H //! [0] //! [1] #define LCDNUMBER_H //! [1] //! [2] #include //! [2] //! [3] class LcdNumber : public QFrame //! [3] //! [4] { //! [4] //! [5] Q_OBJECT //! [5] //! [6] public: //! [6] //! [7] LcdNumber(QWidget *parent = 0); //! [7] //! [8] signals: //! [8] //! [9] void overflow(); //! [9] //! [10] public slots: //! [10] //! [11] void display(int num); void display(double num); void display(const QString &str); void setHexMode(); void setDecMode(); void setOctMode(); void setBinMode(); void setSmallDecimalPoint(bool point); //! [11] //! [12] }; //! [12] //! [13] #endif //! [13] ================================================ FILE: doc/codesnippets/doc/src/snippets/signalsandslots/signalsandslots.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "signalsandslots.h" //! [0] void Counter::setValue(int value) { if (value != m_value) { m_value = value; emit valueChanged(value); } } //! [0] int main() { //! [1] Counter a, b; //! [1] //! [2] QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); //! [2] //! [3] a.setValue(12); // a.value() == 12, b.value() == 12 //! [3] //! [4] b.setValue(48); // a.value() == 12, b.value() == 48 //! [4] QWidget *widget = reinterpret_cast(new QObject(0)); //! [5] if (widget->inherits("QAbstractButton")) { QAbstractButton *button = static_cast(widget); button->toggle(); //! [5] //! [6] } //! [6] //! [7] if (QAbstractButton *button = qobject_cast(widget)) button->toggle(); //! [7] } ================================================ FILE: doc/codesnippets/doc/src/snippets/signalsandslots/signalsandslots.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef SIGNALSANDSLOTS_H #define SIGNALSANDSLOTS_H #define Counter PlainCounter //! [0] class Counter { public: Counter() { m_value = 0; } int value() const { return m_value; } void setValue(int value); private: int m_value; }; //! [0] #undef Counter #define Counter ObjectCounter //! [1] #include //! [1] //! [2] class Counter : public QObject //! [2] //! [3] { Q_OBJECT public: Counter() { m_value = 0; } int value() const { return m_value; } public slots: void setValue(int value); signals: void valueChanged(int newValue); private: int m_value; }; //! [3] #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/simplemodel-use/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* main.cpp A simple example of how to access items from an existing model. */ #include /*! Create a default directory model and, using the index-based interface to the model and some QLabel widgets, populate the window's layout with the names of objects in the directory. Note that we only want to read the filenames in the highest level of the directory, so we supply a default (invalid) QModelIndex to the model in order to indicate that we want top-level items. */ def main(): app = QApplication(sys.argc, sys.argv) window = QWidget() layout = QVBoxLayout(window) title = QLabel("Some items from the directory model", window) title.setBackgroundRole(QPalette.Base) title.setMargin(8) layout.addWidget(title) //! [0] model = QFileSystemModel() parentIndex = model.index(QDir.currentPath()) numRows = model.rowCount(parentIndex) //! [0] //! [1] for row in range(numRows): index = model.index(row, 0, parentIndex) //! [1] //! [2] text = model.data(index, Qt.DisplayRole) // Display the text in a widget. //! [2] label = QLabel(text, window) layout.addWidget(label) //! [3] //! [3] window.setWindowTitle("A simple model example") window.show() return app.exec_() } ================================================ FILE: doc/codesnippets/doc/src/snippets/splitter/splitter.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] splitter = QSplitter(parent) listview = QListView() treeview = QTreeView() textedit = QTextEdit() splitter.addWidget(listview) splitter.addWidget(treeview) splitter.addWidget(textedit) //! [0] //! [1] settings = QSettings() settings.setValue("splitterSizes", splitter.saveState()) //! [1] //! [2] settings = QSettings() splitter.restoreState(settings.value("splitterSizes").toByteArray()) //! [2] //! [3] for it in splitter.sizes(): processSize(it.next()) //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/splitterhandle/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "splitter.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Splitter splitter(Qt::Horizontal); splitter.addWidget(new QLabel("Hello")); splitter.addWidget(new QLabel("World")); Splitter verticalSplitter(Qt::Vertical, &splitter); verticalSplitter.addWidget(new QLabel("A")); verticalSplitter.addWidget(new QLabel("B")); splitter.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/splitterhandle/splitter.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "splitter.h" SplitterHandle::SplitterHandle(Qt::Orientation orientation, QSplitter *parent) : QSplitterHandle(orientation, parent) { gradient.setColorAt(0.0, Qt::darkGreen); gradient.setColorAt(0.25, Qt::white); gradient.setColorAt(1.0, Qt::darkGreen); } //! [0] void SplitterHandle::paintEvent(QPaintEvent *event) { QPainter painter(this); if (orientation() == Qt::Horizontal) { gradient.setStart(rect().left(), rect().height()/2); gradient.setFinalStop(rect().right(), rect().height()/2); } else { gradient.setStart(rect().width()/2, rect().top()); gradient.setFinalStop(rect().width()/2, rect().bottom()); } painter.fillRect(event->rect(), QBrush(gradient)); } //! [0] Splitter::Splitter(Qt::Orientation orientation, QWidget *parent) : QSplitter(orientation, parent) { } //! [1] QSplitterHandle *Splitter::createHandle() { return new SplitterHandle(orientation(), this); } //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/splitterhandle/splitter.h ================================================ /############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################/ //! [0] class Splitter(QSplitter): def __init__(self, orientation, parent): ... def createHandle(self): ... } //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/sqldatabase/sqldatabase.cpp ================================================ ###################################### # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # Contact: http://www.qt-project.org/legal # # This file is part of the documentation of the Qt Toolkit. # # $QT_BEGIN_LICENSE:LGPL$ # Commercial License Usage # Licensees holding valid commercial Qt licenses may use this file in # accordance with the commercial license agreement provided with the # Software or, alternatively, in accordance with the terms contained in # a written agreement between you and Digia. For licensing terms and # conditions see http://qt.digia.com/licensing. For further information # use the contact form at http://qt.digia.com/contact-us. # # GNU Lesser General Public License Usage # Alternatively, this file may be used under the terms of the GNU Lesser # General Public License version 2.1 as published by the Free Software # Foundation and appearing in the file LICENSE.LGPL included in the # packaging of this file. Please review the following information to # ensure the GNU Lesser General Public License version 2.1 requirements # will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. # # In addition, as a special exception, Digia gives you certain additional # rights. These rights are described in the Digia Qt LGPL Exception # version 1.1, included in the file LGPL_EXCEPTION.txt in this package. # # GNU General Public License Usage # Alternatively, this file may be used under the terms of the GNU # General Public License version 3.0 as published by the Free Software # Foundation and appearing in the file LICENSE.GPL included in the # packaging of this file. Please review the following information to # ensure the GNU General Public License version 3.0 requirements will be # met: http://www.gnu.org/copyleft/gpl.html. # # # $QT_END_LICENSE$ # ###################################### from PySide.QtGui import * from PySide.QtSql import * def tr(text): return QApplication.translate(text, text) def QSqlDatabase_snippets(): //! [0] db = QSqlDatabase.addDatabase("QPSQL") db.setHostName("acidalia") db.setDatabaseName("customdb") db.setUserName("mojito") db.setPassword("J0a1m8") ok = db.open() //! [0] //! [1] db = QSqlDatabase.database() //! [1] def QSqlField_snippets(): //! [2] field = QSqlField("age", QVariant.Int) field.setValue(QPixmap()) # WRONG //! [2] //! [3] field = QSqlField("age", QVariant.Int) field.setValue(QString("123")) # casts QString to int //! [3] //! [4] query = QSqlQuery() //! [4] //! [5] record = query.record() //! [5] //! [6] field = record.field("country") //! [6] def doSomething(str): pass def QSqlQuery_snippets(): # typical loop //! [7] query = QSqlQuery("SELECT country FROM artist") while query.next(): country = query.value(0) doSomething(country) //! [7] # field index lookup //! [8] query = QSqlQuery("SELECT * FROM artist") fieldNo = query.record().indexOf("country") while query.next(): country = query.value(fieldNo) doSomething(country) //! [8] # named with named //! [9] query = QSqlQuery() query.prepare("INSERT INTO person (id, forename, surname) " "VALUES (:id, :forename, :surname)") query.bindValue(":id", 1001) query.bindValue(":forename", "Bart") query.bindValue(":surname", "Simpson") query.exec_() //! [9] # positional with named //! [10] query = QSqlQuery() query.prepare("INSERT INTO person (id, forename, surname) " "VALUES (:id, :forename, :surname)") query.bindValue(0, 1001) query.bindValue(1, "Bart") query.bindValue(2, "Simpson") query.exec_() //! [10] # positional 1 //! [11] query = QSqlQuery() query.prepare("INSERT INTO person (id, forename, surname) " "VALUES (?, ?, ?)") query.bindValue(0, 1001) query.bindValue(1, "Bart") query.bindValue(2, "Simpson") query.exec_() //! [11] # positional 2 //! [12] query = QSqlQuery() query.prepare("INSERT INTO person (id, forename, surname) " "VALUES (?, ?, ?)") query.addBindValue(1001) query.addBindValue("Bart") query.addBindValue("Simpson") query.exec_() //! [12] # stored //! [13] query = QSqlQuery() query.prepare("CALL AsciiToInt(?, ?)") query.bindValue(0, "A") query.bindValue(1, 0, QSql.Out) query.exec_() i = query.boundValue(1) # i is 65 //! [13] query = QSqlQuery() # examine with named binding //! [14] i = query.boundValues() while i.hasNext(): i.next() print i.key(), ": ", i.value() //! [14] # examine with positional binding //! [15] list_ = query.boundValues().values() for item in list: print item //! [15] def QSqlQueryModel_snippets(): //! [16] model = QSqlQueryModel() model.setQuery("SELECT name, salary FROM employee") model.setHeaderData(0, Qt.Horizontal, tr("Name")) model.setHeaderData(1, Qt.Horizontal, tr("Salary")) //! [17] view = QTableView() //! [17] //! [18] view.setModel(model) //! [18] //! [19] view.show() //! [16] //! [19] //! [20] view.setEditTriggers(QAbstractItemView.NoEditTriggers) //! [20] //! [21] model = QSqlQueryModel() model.setQuery("SELECT * FROM employee") salary = model.record(4).value("salary") //! [21] //! [22] salary = model.data(model.index(4, 2)) //! [22] for row in range(model.rowCount()): for (col in range(model.columnCount())): print model.data(model.index(row, col)) class MyModel(QSqlQueryModel) m_specialColumnNo = 0 def data(item, role): //! [23] if item.column() == self.m_specialColumnNo: # handle column separately pass return QSqlQueryModel.data(item, role) //! [23] def QSqlTableModel_snippets(): //! [24] model = QSqlTableModel() model.setTable("employee") model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.select() model.removeColumn(0) # don't show the ID model.setHeaderData(0, Qt.Horizontal, tr("Name")) model.setHeaderData(1, Qt.Horizontal, tr("Salary")) view = QTableView() view.setModel(model) view.show() //! [24] //! [25] model = QSqlTableModel() model.setTable("employee") QString name = model.record(4).value("name") //! [25] def sql_intro_snippets(): //! [26] db = QSqlDatabase.addDatabase("QMYSQL") db.setHostName("bigblue") db.setDatabaseName("flightdb") db.setUserName("acarlson") db.setPassword("1uTbSbAs") ok = db.open() //! [26] //! [27] firstDB = QSqlDatabase.addDatabase("QMYSQL", "first") secondDB = QSqlDatabase.addDatabase("QMYSQL", "second") //! [27] //! [28] defaultDB = QSqlDatabase.database() //! [28] //! [29] firstDB = QSqlDatabase.database("first") //! [29] //! [30] secondDB = QSqlDatabase.database("second") //! [30] # SELECT1 //! [31] query = QSqlQuery() query.exec_("SELECT name, salary FROM employee WHERE salary > 50000") //! [31] //! [32] while query.next(): name = query.value(0) salary = query.value(1) print name, salary //! [32] # FEATURE //! [33] query = QSqlQuery() query.exec_("SELECT name, salary FROM employee WHERE salary > 50000") defaultDB = QSqlDatabase.database() if defaultDB.driver().hasFeature(QSqlDriver.QuerySize): numRows = query.size() else: # self can be very slow query.last() numRows = query.at() + 1 //! [33] # INSERT1 //! [34] query = QSqlQuery() query.exec_("INSERT INTO employee (id, name, salary) " "VALUES (1001, 'Thad Beaumont', 65000)") //! [34] # NAMED BINDING //! [35] query = QSqlQuery() query.prepare("INSERT INTO employee (id, name, salary) " "VALUES (:id, :name, :salary)") query.bindValue(":id", 1001) query.bindValue(":name", "Thad Beaumont") query.bindValue(":salary", 65000) query.exec_() //! [35] # POSITIONAL BINDING //! [36] query = QSqlQuery() query.prepare("INSERT INTO employee (id, name, salary) " "VALUES (?, ?, ?)") query.addBindValue(1001) query.addBindValue("Thad Beaumont") query.addBindValue(65000) query.exec_() //! [36] # UPDATE1 //! [37] query = QSqlQuery() query.exec_("UPDATE employee SET salary = 70000 WHERE id = 1003") //! [37] # DELETE1 //! [38] query = QSqlQuery() query.exec_("DELETE FROM employee WHERE id = 1007") //! [38] # TRANSACTION //! [39] QSqlDatabase.database().transaction() query = QSqlQuery() query.exec_("SELECT id FROM employee WHERE name = 'Torild Halvorsen'") if query.next(): employeeId = query.value(0) query.exec_("INSERT INTO project (id, name, ownerid) " "VALUES (201, 'Manhattan Project', " + QString.number(employeeId) + ')') QSqlDatabase.database().commit() //! [39] # SQLQUERYMODEL1 //! [40] model = QSqlQueryModel() model.setQuery("SELECT * FROM employee") for i in range(model.rowCount()): _id = model.record(i).value("id") name = model.record(i).value("name") print _id, name //! [40] } { # SQLTABLEMODEL1 //! [41] model = QSqlTableModel() model.setTable("employee") model.setFilter("salary > 50000") model.setSort(2, Qt.DescendingOrder) model.select() for i in range(model.rowCount()): name = model.record(i).value("name") salary = model.record(i).value("salary") print "%s: %d" % (name, salary) //! [41] # SQLTABLEMODEL2 model = QSqlTableModel() model.setTable("employee") //! [42] for i in range(model.rowCount()): record = model.record(i) salary = record.value("salary") salary *= 1.1 record.setValue("salary", salary) model.setRecord(i, record) model.submitAll() //! [42] # SQLTABLEMODEL3 row = 1 column = 2 //! [43] model.setData(model.index(row, column), 75000) model.submitAll() //! [43] # SQLTABLEMODEL4 //! [44] model.insertRows(row, 1) model.setData(model.index(row, 0), 1013) model.setData(model.index(row, 1), "Peter Gordon") model.setData(model.index(row, 2), 68500) model.submitAll() //! [44] //! [45] model.removeRows(row, 5) //! [45] //! [46] model.submitAll() //! [46] //! [47] class XyzResult(QSqlResult): def __init__(driver): QSqlResult.__init__(self, driver) pass def data(self, index): return QVariant() def isNull(self, index): return False def reset(self, query): return False def fetch(self, index): return False def fetchFirst(self): return False def fetchLast(self): return False def size(self): return 0 def numRowsAffected(self): return 0 def record(self): return QSqlRecord() //! [47] //! [48] class XyzDriver(QSqlDriver) def hasFeature(self, feature): return False def open(self, db, user, password, host, port, options): return False def close(self): pass def createResult(self): return XyzResult(self) //! [48] def main(): app = QApplication([]) QSqlDatabase_snippets() QSqlField_snippets() QSqlQuery_snippets() QSqlQueryModel_snippets() QSqlTableModel_snippets() driver = XyzDriver() result = XyzResult(driver) ================================================ FILE: doc/codesnippets/doc/src/snippets/streaming/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include //! [0] struct Movie { int id; QString title; QDate releaseDate; }; //! [0] //! [1] QDataStream &operator<<(QDataStream &out, const Movie &movie) { out << (quint32)movie.id << movie.title << movie.releaseDate; return out; } //! [1] //! [2] QDataStream &operator>>(QDataStream &in, Movie &movie) { quint32 id; QDate date; in >> id >> movie.title >> date; movie.id = (int)id; movie.releaseDate = date; return in; } //! [2] int main(int argc, char *argv[]) { QApplication app(argc, argv); Movie m; m.id = 0001; m.title = "Happy Meal"; m.releaseDate = QDate(1995, 5, 17); QByteArray byteArray; QDataStream stream(&byteArray, QIODevice::WriteOnly); stream << m; // display qDebug() << m.id << m.releaseDate << m.title; Movie m2; int id2; QString title2; QDate date2; QDataStream stream2(byteArray); stream2 >> id2 >> title2 >> date2; m2.id = id2; m2.title = title2; m2.releaseDate = date2; qDebug() << id2 << " " << date2 << " " << title2; return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/stringlistmodel/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /*! The main function for the string list model example. This creates and populates a model with values from a string list then displays the contents of the model using a QListView widget. */ #include #include #include #include "model.h" //! [0] app = QApplication(sys.argv) // Unindented for quoting purposes: //! [1] numbers = ["One", "Two", "Three", "Four", "Five"] model = StringListModel(numbers) //! [0] //! [1] //! [2] //! [3] view = QListView() //! [2] view.setWindowTitle("View onto a string list model") //! [4] view.setModel(model) //! [3] //! [4] model.insertRows(5, 7, QModelIndex()) for row in range(5, 12): index = model.index(row, 0, QModelIndex()) model.setData(index, str(row+1)) //! [5] view.show() sys.exit(app.exec_()) //! [5] ================================================ FILE: doc/codesnippets/doc/src/snippets/stringlistmodel/model.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* model.cpp A simple model that uses a QStringList as its data source. */ /*! Returns the number of items in the string list as the number of rows in the model. */ //! [0] def rowCount(self, parent): return len(self.stringList) //! [0] /*! Returns an appropriate value for the requested data. If the view requests an invalid index, an invalid variant is returned. Any valid index that corresponds to a string in the list causes that string to be returned. */ //! [1] def data(self, index, role): if not index.isValid(): return None if index.row() >= stringList.size(): return None if role == Qt.DisplayRole: return stringList[index.row()] else return None //! [1] /*! Returns the appropriate header string depending on the orientation of the header and the section. If anything other than the display role is requested, we return an invalid variant. */ //! [2] def headerData(self, section, orientation, role): if role != Qt::DisplayRole: return None if orientation == Qt::Horizontal: return "Column %s" % section else: return "Row %s" % section //! [2] /*! Returns an appropriate value for the item's flags. Valid items are enabled, selectable, and editable. */ //! [3] def flags(self, index): if not index.isValid() return Qt.ItemIsEnabled return QAbstractItemModel.flags(index) | Qt.ItemIsEditable //! [3] /*! Changes an item in the string list, but only if the following conditions are met: * The index supplied is valid. * The index corresponds to an item to be shown in a view. * The role associated with editing text is specified. The dataChanged() signal is emitted if the item is changed. */ //! [4] def setData(self, index, value, role): if index.isValid() and role == Qt.EditRole: self.stringList[index.row()] = value self.dataChanged.emit(index, index) return True; //! [4] //! [5] return False; } //! [5] /*! Inserts a number of rows into the model at the specified position. */ //! [6] def insertRows(self, position, rows, parent): self.beginInsertRows(QModelIndex(), position, position+rows-1) for row in range(0, rows): self.stringList.insert(position, "") self.endInsertRows() return True; //! [6] //! [7] //! [7] /*! Removes a number of rows from the model at the specified position. */ //! [8] def removeRows(self, position, rows, parent): self.beginRemoveRows(QModelIndex(), position, position+rows-1) for row in range(0, rows): del self.stringList[position] self.endRemoveRows() return True; //! [8] //! [9] //! [9] ================================================ FILE: doc/codesnippets/doc/src/snippets/stringlistmodel/model.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] class StringListModel (QAbstractListModel): def __init__(strings, parent = None): QAbstractListModel.__init__(self, parent) //! [5] self.stringList = strings //! [5] def rowCount(self, parent = QModelIndex()): # ... def data(self, index, role): # ... def headerData(self, section, orientation, //! [0] //! [1] role = Qt.DisplayRole): //! [1] //! [2] def flags(self, index): # ... def setData(self, index, value, //! [2] //! [3] role = Qt.EditRole) //! [3] //! [4] def insertRows(self, position, rows, index = QModelIndex()): # ... def removeRows(self, position, rows, index = QModelIndex()): # ... //! [4] ================================================ FILE: doc/codesnippets/doc/src/snippets/styles/styles.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] //! [1] def paintEvent(self, event): //! [0] //! [2] painter = QPainter(self) //! [2] option = QStyleOptionFocusRect() option.initFrom(self) option.backgroundColor = palette().color(QPalette.Background) //! [3] style().drawPrimitive(QStyle.PE_FrameFocusRect, option, painter, self) //! [3] //! [1] def paintEvent2(event): //! [4] //! [4] //! [5] //! [6] painter = QStylePainter(self) //! [5] option = QStyleOptionFocusRect() option.initFrom(self) option.backgroundColor = palette().color(QPalette.Background) //! [7] painter.drawPrimitive(QStyle.PE_FrameFocusRect, option) //! [7] //! [6] ================================================ FILE: doc/codesnippets/doc/src/snippets/stylesheet/common-mistakes.cpp ================================================ //! [1] QPushButton { color: grey; border-image: url(/home/kamlie/code/button.png) 3 10 3 10; border-top: 3px transparent; border-bottom: 3px transparent; border-right: 10px transparent; border-left: 10px transparent; } //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/textblock-formats/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include QString tr(const char *text) { return QApplication::translate(text, text); } int main(int argc, char *argv[]) { QApplication app(argc, argv); //! [0] QTextEdit *editor = new QTextEdit(); QTextCursor cursor(editor->textCursor()); //! [0] cursor.movePosition(QTextCursor::Start); QTextBlockFormat blockFormat = cursor.blockFormat(); blockFormat.setTopMargin(4); blockFormat.setLeftMargin(4); blockFormat.setRightMargin(4); blockFormat.setBottomMargin(4); cursor.setBlockFormat(blockFormat); cursor.insertText(tr("This contains plain text inside a " "text block with margins to keep it separate " "from other parts of the document.")); cursor.insertBlock(); //! [1] QTextBlockFormat backgroundFormat = blockFormat; backgroundFormat.setBackground(QColor("lightGray")); cursor.setBlockFormat(backgroundFormat); //! [1] cursor.insertText(tr("The background color of a text block can be " "changed to highlight text.")); cursor.insertBlock(); QTextBlockFormat rightAlignedFormat = blockFormat; rightAlignedFormat.setAlignment(Qt::AlignRight); cursor.setBlockFormat(rightAlignedFormat); cursor.insertText(tr("The alignment of the text within a block is " "controlled by the alignment properties of " "the block itself. This text block is " "right-aligned.")); cursor.insertBlock(); QTextBlockFormat paragraphFormat = blockFormat; paragraphFormat.setAlignment(Qt::AlignJustify); paragraphFormat.setTextIndent(32); cursor.setBlockFormat(paragraphFormat); cursor.insertText(tr("Text can be formatted so that the first " "line in a paragraph has its own margin. " "This makes the text more readable.")); cursor.insertBlock(); QTextBlockFormat reverseFormat = blockFormat; reverseFormat.setAlignment(Qt::AlignJustify); reverseFormat.setTextIndent(32); cursor.setBlockFormat(reverseFormat); cursor.insertText(tr("The direction of the text can be reversed. " "This is useful for right-to-left " "languages.")); editor->setWindowTitle(tr("Text Block Formats")); editor->resize(480, 480); editor->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textblock-fragments/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->resize(640, 480); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textblock-fragments/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" #include "xmlwriter.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *saveAction = fileMenu->addAction(tr("&Save...")); saveAction->setShortcut(tr("Ctrl+S")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); QMenu *insertMenu = new QMenu(tr("&Insert")); QAction *calendarAction = insertMenu->addAction(tr("&Calendar")); calendarAction->setShortcut(tr("Ctrl+I")); menuBar()->addMenu(fileMenu); menuBar()->addMenu(insertMenu); editor = new QTextEdit(this); connect(saveAction, SIGNAL(triggered()), this, SLOT(saveFile())); connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); connect(calendarAction, SIGNAL(triggered()), this, SLOT(insertCalendar())); setCentralWidget(editor); setWindowTitle(tr("Text Document Writer")); } void MainWindow::saveFile() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save document as:"), "", tr("XML (*.xml)")); if (!fileName.isEmpty()) { if (writeXml(fileName)) setWindowTitle(fileName); else QMessageBox::warning(this, tr("Warning"), tr("Failed to save the document."), QMessageBox::Cancel, QMessageBox::NoButton); } } void MainWindow::insertCalendar() { QTextCursor cursor(editor->textCursor()); cursor.movePosition(QTextCursor::Start); QTextCharFormat format(cursor.charFormat()); format.setFontFamily("Courier"); QTextCharFormat boldFormat = format; boldFormat.setFontWeight(QFont::Bold); cursor.insertBlock(); cursor.insertText(" ", boldFormat); QDate date = QDate::currentDate(); int year = date.year(), month = date.month(); for (int weekDay = 1; weekDay <= 7; ++weekDay) { cursor.insertText(QString("%1 ").arg(QDate::shortDayName(weekDay), 3), boldFormat); } cursor.insertBlock(); cursor.insertText(" ", format); for (int column = 1; column < QDate(year, month, 1).dayOfWeek(); ++column) { cursor.insertText(" ", format); } for (int day = 1; day <= date.daysInMonth(); ++day) { int weekDay = QDate(year, month, day).dayOfWeek(); if (QDate(year, month, day) == date) cursor.insertText(QString("%1 ").arg(day, 3), boldFormat); else cursor.insertText(QString("%1 ").arg(day, 3), format); if (weekDay == 7) { cursor.insertBlock(); cursor.insertText(" ", format); } } } bool MainWindow::writeXml(const QString &fileName) { XmlWriter documentWriter(editor->document()); QDomDocument *domDocument = documentWriter.toXml(); QFile file(fileName); if (file.open(QFile::WriteOnly)) { QTextStream textStream(&file); textStream << domDocument->toByteArray(1); return true; } else return false; } ================================================ FILE: doc/codesnippets/doc/src/snippets/textblock-fragments/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QTextEdit; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void insertCalendar(); void saveFile(); private: bool writeXml(const QString &fileName); QTextEdit *editor; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textblock-fragments/xmlwriter.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "xmlwriter.h" QDomDocument *XmlWriter::toXml() { QDomImplementation implementation; QDomDocumentType docType = implementation.createDocumentType( "scribe-document", "scribe", "qtsoftware.com/scribe"); document = new QDomDocument(docType); // ### This processing instruction is required to ensure that any kind // of encoding is given when the document is written. QDomProcessingInstruction process = document->createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"utf-8\""); document->appendChild(process); QDomElement documentElement = document->createElement("document"); document->appendChild(documentElement); //! [0] QTextBlock currentBlock = textDocument->begin(); while (currentBlock.isValid()) { //! [0] QDomElement blockElement = document->createElement("block"); document->appendChild(blockElement); readFragment(currentBlock, blockElement, document); //! [1] processBlock(currentBlock); //! [1] //! [2] currentBlock = currentBlock.next(); } //! [2] return document; } void XmlWriter::readFragment(const QTextBlock ¤tBlock, QDomElement blockElement, QDomDocument *document) { //! [3] //! [4] QTextBlock::iterator it; for (it = currentBlock.begin(); !(it.atEnd()); ++it) { QTextFragment currentFragment = it.fragment(); if (currentFragment.isValid()) //! [3] //! [5] processFragment(currentFragment); //! [4] //! [5] if (currentFragment.isValid()) { QDomElement fragmentElement = document->createElement("fragment"); blockElement.appendChild(fragmentElement); fragmentElement.setAttribute("length", currentFragment.length()); QDomText fragmentText = document->createTextNode(currentFragment.text()); fragmentElement.appendChild(fragmentText); //! [6] } //! [7] } //! [6] //! [7] } void XmlWriter::processBlock(const QTextBlock ¤tBlock) { } void XmlWriter::processFragment(const QTextFragment ¤tFragment) { } ================================================ FILE: doc/codesnippets/doc/src/snippets/textblock-fragments/xmlwriter.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef XMLWRITER_H #define XMLWRITER_H #include class QTextDocument; class XmlWriter { public: XmlWriter(QTextDocument *document) : textDocument(document) {} QDomDocument *toXml(); private: void readFragment(const QTextBlock ¤tBlock, QDomElement blockElement, QDomDocument *document); void processBlock(const QTextBlock ¤tBlock); void processFragment(const QTextFragment ¤tFragment); QDomDocument *document; QTextDocument *textDocument; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-blocks/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->resize(640, 480); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-blocks/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" #include "xmlwriter.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *saveAction = fileMenu->addAction(tr("&Save...")); saveAction->setShortcut(tr("Ctrl+S")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); QMenu *insertMenu = new QMenu(tr("&Insert")); QAction *calendarAction = insertMenu->addAction(tr("&Calendar")); calendarAction->setShortcut(tr("Ctrl+I")); menuBar()->addMenu(fileMenu); menuBar()->addMenu(insertMenu); //! [0] editor = new QTextEdit(this); //! [0] connect(saveAction, SIGNAL(triggered()), this, SLOT(saveFile())); connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); connect(calendarAction, SIGNAL(triggered()), this, SLOT(insertCalendar())); setCentralWidget(editor); setWindowTitle(tr("Text Document Writer")); } void MainWindow::saveFile() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save document as:"), "", tr("XML (*.xml)")); if (!fileName.isEmpty()) { if (writeXml(fileName)) setWindowTitle(fileName); else QMessageBox::warning(this, tr("Warning"), tr("Failed to save the document."), QMessageBox::Cancel, QMessageBox::NoButton); } } void MainWindow::insertCalendar() { //! [1] QTextCursor cursor(editor->textCursor()); cursor.movePosition(QTextCursor::Start); QTextCharFormat format(cursor.charFormat()); format.setFontFamily("Courier"); QTextCharFormat boldFormat = format; boldFormat.setFontWeight(QFont::Bold); cursor.insertBlock(); cursor.insertText(" ", boldFormat); QDate date = QDate::currentDate(); int year = date.year(), month = date.month(); for (int weekDay = 1; weekDay <= 7; ++weekDay) { cursor.insertText(QString("%1 ").arg(QDate::shortDayName(weekDay), 3), boldFormat); } cursor.insertBlock(); cursor.insertText(" ", format); for (int column = 1; column < QDate(year, month, 1).dayOfWeek(); ++column) { cursor.insertText(" ", format); } for (int day = 1; day <= date.daysInMonth(); ++day) { //! [1] //! [2] int weekDay = QDate(year, month, day).dayOfWeek(); if (QDate(year, month, day) == date) cursor.insertText(QString("%1 ").arg(day, 3), boldFormat); else cursor.insertText(QString("%1 ").arg(day, 3), format); if (weekDay == 7) { cursor.insertBlock(); cursor.insertText(" ", format); } //! [2] //! [3] } //! [3] } bool MainWindow::writeXml(const QString &fileName) { XmlWriter documentWriter(editor->document()); QDomDocument *domDocument = documentWriter.toXml(); QFile file(fileName); if (file.open(QFile::WriteOnly)) { QTextStream textStream(&file); textStream.setCodec(QTextCodec::codecForName("UTF-8")); textStream << domDocument->toString(1).toUtf8(); file.close(); return true; } else return false; } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-blocks/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QTextEdit; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void insertCalendar(); void saveFile(); private: bool writeXml(const QString &fileName); QTextEdit *editor; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-blocks/xmlwriter.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "xmlwriter.h" QDomDocument *XmlWriter::toXml() { QDomImplementation implementation; QDomDocumentType docType = implementation.createDocumentType( "scribe-document", "scribe", "qtsoftware.com/scribe"); document = new QDomDocument(docType); // ### This processing instruction is required to ensure that any kind // of encoding is given when the document is written. QDomProcessingInstruction process = document->createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"utf-8\""); document->appendChild(process); QDomElement documentElement = document->createElement("document"); document->appendChild(documentElement); QTextBlock firstBlock = textDocument->begin(); createItems(documentElement, firstBlock); return document; } void XmlWriter::createItems(QDomElement &parent, const QTextBlock &block) { QTextBlock currentBlock = block; while (currentBlock.isValid()) { QDomElement blockElement = document->createElement("block"); blockElement.setAttribute("length", currentBlock.length()); parent.appendChild(blockElement); if (!(currentBlock.text().isNull())) { QDomText textNode = document->createTextNode(currentBlock.text()); blockElement.appendChild(textNode); } currentBlock = currentBlock.next(); } } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-blocks/xmlwriter.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef XMLWRITER_H #define XMLWRITER_H #include class QTextDocument; class XmlWriter { public: XmlWriter(QTextDocument *document) : textDocument(document) {} QDomDocument *toXml(); private: void createItems(QDomElement &parent, const QTextBlock &block); QDomDocument *document; QTextDocument *textDocument; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-charformats/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include QString tr(const char *text) { return QApplication::translate(text, text); } int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextEdit *editor = new QTextEdit(); QTextCursor cursor(editor->textCursor()); cursor.movePosition(QTextCursor::Start); QTextCharFormat plainFormat(cursor.charFormat()); QTextCharFormat headingFormat = plainFormat; headingFormat.setFontWeight(QFont::Bold); headingFormat.setFontPointSize(16); QTextCharFormat emphasisFormat = plainFormat; emphasisFormat.setFontItalic(true); QTextCharFormat qtFormat = plainFormat; qtFormat.setForeground(QColor("#990000")); QTextCharFormat underlineFormat = plainFormat; underlineFormat.setFontUnderline(true); //! [0] cursor.insertText(tr("Character formats"), headingFormat); cursor.insertBlock(); cursor.insertText(tr("Text can be displayed in a variety of " "different character formats. "), plainFormat); cursor.insertText(tr("We can emphasize text by ")); cursor.insertText(tr("making it italic"), emphasisFormat); //! [0] cursor.insertText(tr(", give it a "), plainFormat); cursor.insertText(tr("different color "), qtFormat); cursor.insertText(tr("to the default text color, "), plainFormat); cursor.insertText(tr("underline it"), underlineFormat); cursor.insertText(tr(", and use many other effects."), plainFormat); editor->setWindowTitle(tr("Text Document Character Formats")); editor->resize(320, 480); editor->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-css/main.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] browser = QTextBrowser() linkColor = QColor(Qt.red) sheet = QString.fromLatin1("a { text-decoration: underline color: %1 }").arg(linkColor.name()) browser.document().setDefaultStyleSheet(sheet) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-cursors/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include QString tr(const char *text) { return QApplication::translate(text, text); } int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextEdit *editor = new QTextEdit; //! [0] QTextDocument *document = editor->document(); QTextCursor redCursor(document); //! [0] //! [1] QTextCursor blueCursor(document); //! [1] QTextCharFormat redFormat(redCursor.charFormat()); redFormat.setForeground(Qt::red); QTextCharFormat blueFormat(blueCursor.charFormat()); blueFormat.setForeground(Qt::blue); redCursor.setCharFormat(redFormat); blueCursor.setCharFormat(blueFormat); for (int i = 0; i < 20; ++i) { if (i % 2 == 0) redCursor.insertText(tr("%1 ").arg(i), redFormat); if (i % 5 == 0) blueCursor.insertText(tr("%1 ").arg(i), blueFormat); } editor->setWindowTitle(tr("Text Document Cursors")); editor->resize(320, 480); editor->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-find/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include QString tr(const char *text) { return QApplication::translate(text, text); } int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextEdit *editor = new QTextEdit(); QTextCursor cursor(editor->textCursor()); cursor.movePosition(QTextCursor::Start); QTextCharFormat plainFormat(cursor.charFormat()); QTextCharFormat colorFormat = plainFormat; colorFormat.setForeground(Qt::red); cursor.insertText(tr("Text can be displayed in a variety of " "different character " "formats. "), plainFormat); cursor.insertText(tr("We can emphasize text by making it ")); cursor.insertText(tr("italic, give it a different color ")); cursor.insertText(tr("to the default text color, underline it, ")); cursor.insertText(tr("and use many other effects.")); QString searchString = tr("text"); QTextDocument *document = editor->document(); //! [0] QTextCursor newCursor(document); while (!newCursor.isNull() && !newCursor.atEnd()) { newCursor = document->find(searchString, newCursor); if (!newCursor.isNull()) { newCursor.movePosition(QTextCursor::WordRight, QTextCursor::KeepAnchor); newCursor.mergeCharFormat(colorFormat); } //! [0] //! [1] } //! [1] editor->setWindowTitle(tr("Text Document Find")); editor->resize(320, 480); editor->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-frames/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->resize(480, 480); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-frames/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" #include "xmlwriter.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); QAction *saveAction = fileMenu->addAction(tr("&Save...")); saveAction->setShortcut(tr("Ctrl+S")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); menuBar()->addMenu(fileMenu); editor = new QTextEdit(); QTextCursor cursor(editor->textCursor()); cursor.movePosition(QTextCursor::Start); QTextFrame *mainFrame = cursor.currentFrame(); QTextCharFormat plainCharFormat; QTextCharFormat boldCharFormat; boldCharFormat.setFontWeight(QFont::Bold); /* main frame //! [0] QTextFrame *mainFrame = cursor.currentFrame(); cursor.insertText(...); //! [0] */ cursor.insertText("Text documents are represented by the " "QTextDocument class, rather than by QString objects. " "Each QTextDocument object contains information about " "the document's internal representation, its structure, " "and keeps track of modifications to provide undo/redo " "facilities. This approach allows features such as the " "layout management to be delegated to specialized " "classes, but also provides a focus for the framework.", plainCharFormat); //! [1] QTextFrameFormat frameFormat; frameFormat.setMargin(32); frameFormat.setPadding(8); frameFormat.setBorder(4); //! [1] cursor.insertFrame(frameFormat); /* insert frame //! [2] cursor.insertFrame(frameFormat); cursor.insertText(...); //! [2] */ cursor.insertText("Documents are either converted from external sources " "or created from scratch using Qt. The creation process " "can done by an editor widget, such as QTextEdit, or by " "explicit calls to the Scribe API.", boldCharFormat); cursor = mainFrame->lastCursorPosition(); /* last cursor //! [3] cursor = mainFrame->lastCursorPosition(); cursor.insertText(...); //! [3] */ cursor.insertText("There are two complementary ways to visualize the " "contents of a document: as a linear buffer that is " "used by editors to modify the contents, and as an " "object hierarchy containing structural information " "that is useful to layout engines. In the hierarchical " "model, the objects generally correspond to visual " "elements such as frames, tables, and lists. At a lower " "level, these elements describe properties such as the " "style of text used and its alignment. The linear " "representation of the document is used for editing and " "manipulation of the document's contents.", plainCharFormat); connect(saveAction, SIGNAL(triggered()), this, SLOT(saveFile())); connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); setCentralWidget(editor); setWindowTitle(tr("Text Document Frames")); } void MainWindow::saveFile() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save document as:"), "", tr("XML (*.xml)")); if (!fileName.isEmpty()) { if (writeXml(fileName)) setWindowTitle(fileName); else QMessageBox::warning(this, tr("Warning"), tr("Failed to save the document."), QMessageBox::Cancel, QMessageBox::NoButton); } } bool MainWindow::writeXml(const QString &fileName) { XmlWriter documentWriter(editor->document()); QDomDocument *domDocument = documentWriter.toXml(); QFile file(fileName); if (file.open(QFile::WriteOnly)) { QTextStream textStream(&file); textStream.setCodec(QTextCodec::codecForName("UTF-8")); textStream << domDocument->toString(1).toUtf8(); file.close(); return true; } else return false; } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-frames/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QTextEdit; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void saveFile(); private: bool writeXml(const QString &fileName); QTextEdit *editor; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-frames/xmlwriter.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "xmlwriter.h" QDomDocument *XmlWriter::toXml() { QDomImplementation implementation; QDomDocumentType docType = implementation.createDocumentType( "scribe-document", "scribe", "qtsoftware.com/scribe"); document = new QDomDocument(docType); // ### This processing instruction is required to ensure that any kind // of encoding is given when the document is written. QDomProcessingInstruction process = document->createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"utf-8\""); document->appendChild(process); QDomElement documentElement = document->createElement("document"); document->appendChild(documentElement); //! [0] QTextFrame *root = textDocument->rootFrame(); //! [0] if (root) processFrame(documentElement, root); return document; } void XmlWriter::processBlock(QDomElement &parent, const QTextBlock &block) { QDomElement blockElement = document->createElement("block"); blockElement.setAttribute("position", block.position()); blockElement.setAttribute("length", block.length()); parent.appendChild(blockElement); QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { QTextFragment fragment = it.fragment(); if (fragment.isValid()) { QDomElement fragmentElement = document->createElement("fragment"); blockElement.appendChild(fragmentElement); fragmentElement.setAttribute("length", fragment.length()); QDomText fragmentText = document->createTextNode(fragment.text()); fragmentElement.appendChild(fragmentText); } } } void XmlWriter::processFrame(QDomElement &parent, QTextFrame *frame) { QDomElement frameElement = document->createElement("frame"); frameElement.setAttribute("begin", frame->firstPosition()); frameElement.setAttribute("end", frame->lastPosition()); parent.appendChild(frameElement); //! [1] QTextFrame::iterator it; for (it = frame->begin(); !(it.atEnd()); ++it) { QTextFrame *childFrame = it.currentFrame(); QTextBlock childBlock = it.currentBlock(); if (childFrame) //! [1] //! [2] processFrame(frameElement, childFrame); else if (childBlock.isValid()) processBlock(frameElement, childBlock); } //! [2] } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-frames/xmlwriter.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef XMLWRITER_H #define XMLWRITER_H #include class QTextDocument; class XmlWriter { public: XmlWriter(QTextDocument *document) : textDocument(document) {} QDomDocument *toXml(); private: void processBlock(QDomElement &parent, const QTextBlock &block); void processFrame(QDomElement &parent, QTextFrame *frame); QDomDocument *document; //! [0] QTextDocument *textDocument; //! [0] }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-imagedrop/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "textedit.h" int main(int argc, char * argv[]) { QApplication app(argc, argv); TextEdit *textEdit = new TextEdit; textEdit->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-imagedrop/textedit.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "textedit.h" #include TextEdit::TextEdit(QWidget *parent) : QTextEdit(parent) { } //! [0] def canInsertFromMimeData(source): if source.hasImage: return True else: return QTextEdit.canInsertFromMimeData(source) //! [0] //! [1] void TextEdit::insertFromMimeData( const QMimeData *source ) { if (source->hasImage()) { QImage image = qvariant_cast(source->imageData()); QTextCursor cursor = this->textCursor(); QTextDocument *document = this->document(); document->addResource(QTextDocument::ImageResource, QUrl("image"), image); cursor.insertImage("image"); } } //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-imagedrop/textedit.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TEXTEDIT_H #define TEXTEDIT_H #include class TextEdit : public QTextEdit { Q_OBJECT public: TextEdit(QWidget *parent=0); bool canInsertFromMimeData( const QMimeData *source ) const; void insertFromMimeData( const QMimeData *source ); }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-imageformat/images.qrc ================================================ images/advert.png images/newimage.png ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-imageformat/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include QString tr(const char *text) { return QApplication::translate(text, text); } int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextEdit *editor = new QTextEdit; QTextDocument *document = new QTextDocument(editor); QTextCursor cursor(document); QTextImageFormat imageFormat; imageFormat.setName(":/images/advert.png"); cursor.insertImage(imageFormat); QTextBlock block = cursor.block(); QTextFragment fragment; QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { fragment = it.fragment(); if (fragment.contains(cursor.position())) break; } //! [0] if (fragment.isValid()) { QTextImageFormat newImageFormat = fragment.charFormat().toImageFormat(); if (newImageFormat.isValid()) { newImageFormat.setName(":/images/newimage.png"); QTextCursor helper = cursor; helper.setPosition(fragment.position()); helper.setPosition(fragment.position() + fragment.length(), QTextCursor::KeepAnchor); helper.setCharFormat(newImageFormat); //! [0] //! [1] } //! [1] //! [2] } //! [2] cursor.insertBlock(); cursor.insertText("Code less. Create more."); editor->setDocument(document); editor->setWindowTitle(tr("Text Document Image Format")); editor->resize(320, 480); editor->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-images/images.qrc ================================================ images/advert.png ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-images/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include QString tr(const char *text) { return QApplication::translate(text, text); } int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextEdit *editor = new QTextEdit; //! [0] QTextDocument *document = new QTextDocument(editor); QTextCursor cursor(document); //! [0] //! [1] QTextImageFormat imageFormat; imageFormat.setName(":/images/advert.png"); cursor.insertImage(imageFormat); //! [1] cursor.insertBlock(); cursor.insertText("Code less. Create more."); editor->setDocument(document); editor->setWindowTitle(tr("Text Document Images")); editor->resize(320, 480); editor->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-listitems/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->resize(640, 480); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-listitems/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); fileMenu->addAction(tr("E&xit"), this, SLOT(close()), QKeySequence(tr("Ctrl+Q", "File|Exit"))); QMenu *actionsMenu = new QMenu(tr("&Actions")); actionsMenu->addAction(tr("&Highlight List Items"), this, SLOT(highlightListItems())); actionsMenu->addAction(tr("&Show Current List"), this, SLOT(showList())); QMenu *insertMenu = new QMenu(tr("&Insert")); insertMenu->addAction(tr("&List"), this, SLOT(insertList()), QKeySequence(tr("Ctrl+L", "Insert|List"))); menuBar()->addMenu(fileMenu); menuBar()->addMenu(insertMenu); menuBar()->addMenu(actionsMenu); editor = new QTextEdit(this); document = new QTextDocument(this); editor->setDocument(document); setCentralWidget(editor); setWindowTitle(tr("Text Document List Items")); } void MainWindow::highlightListItems() { QTextCursor cursor = editor->textCursor(); QTextList *list = cursor.currentList(); if (!list) return; cursor.beginEditBlock(); //! [0] for (int index = 0; index < list->count(); ++index) { QTextBlock listItem = list->item(index); //! [0] QTextBlockFormat newBlockFormat = listItem.blockFormat(); newBlockFormat.setBackground(Qt::lightGray); QTextCursor itemCursor = cursor; itemCursor.setPosition(listItem.position()); //itemCursor.movePosition(QTextCursor::StartOfBlock); itemCursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); itemCursor.setBlockFormat(newBlockFormat); /* //! [1] processListItem(listItem); //! [1] */ //! [2] } //! [2] cursor.endEditBlock(); } void MainWindow::showList() { QTextCursor cursor = editor->textCursor(); QTextFrame *frame = cursor.currentFrame(); if (!frame) return; QTreeWidget *treeWidget = new QTreeWidget; treeWidget->setColumnCount(1); QStringList headerLabels; headerLabels << tr("Lists"); treeWidget->setHeaderLabels(headerLabels); QTreeWidgetItem *parentItem = 0; QTreeWidgetItem *item; QTreeWidgetItem *lastItem = 0; parentItems.clear(); previousItems.clear(); //! [3] QTextFrame::iterator it; for (it = frame->begin(); !(it.atEnd()); ++it) { QTextBlock block = it.currentBlock(); if (block.isValid()) { QTextList *list = block.textList(); if (list) { int index = list->itemNumber(block); //! [3] if (index == 0) { parentItems.append(parentItem); previousItems.append(lastItem); listStructures.append(list); parentItem = lastItem; lastItem = 0; if (parentItem != 0) item = new QTreeWidgetItem(parentItem, lastItem); else item = new QTreeWidgetItem(treeWidget, lastItem); } else { while (parentItem != 0 && listStructures.last() != list) { listStructures.pop_back(); parentItem = parentItems.takeLast(); lastItem = previousItems.takeLast(); } if (parentItem != 0) item = new QTreeWidgetItem(parentItem, lastItem); else item = new QTreeWidgetItem(treeWidget, lastItem); } item->setText(0, block.text()); lastItem = item; /* //! [4] processListItem(list, index); //! [4] */ //! [5] } //! [5] //! [6] } //! [6] //! [7] } //! [7] treeWidget->setWindowTitle(tr("List Contents")); treeWidget->show(); } void MainWindow::insertList() { QTextCursor cursor = editor->textCursor(); cursor.beginEditBlock(); QTextList *list = cursor.currentList(); QTextListFormat listFormat; if (list) listFormat = list->format(); listFormat.setStyle(QTextListFormat::ListDisc); listFormat.setIndent(listFormat.indent() + 1); cursor.insertList(listFormat); cursor.endEditBlock(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-listitems/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include #include class QAction; class QTextDocument; class QTextEdit; class QTextList; class QTreeWidgetItem; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void insertList(); void highlightListItems(); void showList(); private: QString currentFile; QTextEdit *editor; QTextDocument *document; QList listStructures; QList previousItems; QList parentItems; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-lists/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->resize(640, 480); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-lists/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); fileMenu->addAction(tr("E&xit"), this, SLOT(close()), QKeySequence(tr("Ctrl+Q", "File|Exit"))); QMenu *editMenu = new QMenu(tr("&Edit")); cutAction = editMenu->addAction(tr("Cu&t"), this, SLOT(cutSelection()), QKeySequence(tr("Ctrl+X", "Edit|Cut"))); copyAction = editMenu->addAction(tr("&Copy"), this, SLOT(copySelection()), QKeySequence(tr("Ctrl+C", "Edit|Copy"))); pasteAction = editMenu->addAction(tr("&Paste"), this, SLOT(pasteSelection()), QKeySequence(tr("Ctrl+V", "Edit|Paste"))); QMenu *selectMenu = new QMenu(tr("&Select")); selectMenu->addAction(tr("&Word"), this, SLOT(selectWord())); selectMenu->addAction(tr("&Line"), this, SLOT(selectLine())); selectMenu->addAction(tr("&Block"), this, SLOT(selectBlock())); selectMenu->addAction(tr("&Frame"), this, SLOT(selectFrame())); QMenu *insertMenu = new QMenu(tr("&Insert")); insertMenu->addAction(tr("&List"), this, SLOT(insertList()), QKeySequence(tr("Ctrl+L", "Insert|List"))); menuBar()->addMenu(fileMenu); menuBar()->addMenu(editMenu); menuBar()->addMenu(selectMenu); menuBar()->addMenu(insertMenu); editor = new QTextEdit(this); document = new QTextDocument(this); editor->setDocument(document); connect(editor, SIGNAL(selectionChanged()), this, SLOT(updateMenus())); updateMenus(); setCentralWidget(editor); setWindowTitle(tr("Text Document Writer")); } void MainWindow::cutSelection() { QTextCursor cursor = editor->textCursor(); if (cursor.hasSelection()) { selection = cursor.selection(); cursor.removeSelectedText(); } } void MainWindow::copySelection() { QTextCursor cursor = editor->textCursor(); if (cursor.hasSelection()) { selection = cursor.selection(); cursor.clearSelection(); } } void MainWindow::pasteSelection() { QTextCursor cursor = editor->textCursor(); cursor.insertFragment(selection); } void MainWindow::selectWord() { QTextCursor cursor = editor->textCursor(); QTextBlock block = cursor.block(); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfWord); cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); cursor.endEditBlock(); editor->setTextCursor(cursor); } void MainWindow::selectLine() { QTextCursor cursor = editor->textCursor(); QTextBlock block = cursor.block(); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfLine); cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); cursor.endEditBlock(); editor->setTextCursor(cursor); } void MainWindow::selectBlock() { QTextCursor cursor = editor->textCursor(); QTextBlock block = cursor.block(); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfBlock); cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); cursor.endEditBlock(); editor->setTextCursor(cursor); } void MainWindow::selectFrame() { QTextCursor cursor = editor->textCursor(); QTextFrame *frame = cursor.currentFrame(); cursor.beginEditBlock(); cursor.setPosition(frame->firstPosition()); cursor.setPosition(frame->lastPosition(), QTextCursor::KeepAnchor); cursor.endEditBlock(); editor->setTextCursor(cursor); } void MainWindow::insertList() { QTextCursor cursor = editor->textCursor(); cursor.beginEditBlock(); QTextList *list = cursor.currentList(); //! [0] listFormat = QTextListFormat() if list: listFormat = list.format() listFormat.setIndent(listFormat.indent() + 1) listFormat.setStyle(QTextListFormat.ListDisc) cursor.insertList(listFormat) //! [0] cursor.endEditBlock(); } void MainWindow::updateMenus() { QTextCursor cursor = editor->textCursor(); cutAction->setEnabled(cursor.hasSelection()); copyAction->setEnabled(cursor.hasSelection()); pasteAction->setEnabled(!selection.isEmpty()); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-lists/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include class QAction; class QTextDocument; class QTextEdit; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void cutSelection(); void copySelection(); void insertList(); void pasteSelection(); void selectWord(); void selectLine(); void selectBlock(); void selectFrame(); void updateMenus(); private: QAction *cutAction; QAction *copyAction; QAction *pasteAction; QString currentFile; QTextEdit *editor; QTextDocument *document; QTextDocumentFragment selection; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-printing/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->resize(640, 480); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-printing/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); fileMenu->addAction(tr("&Open..."), this, SLOT(openFile()), QKeySequence(tr("Ctrl+O", "File|Open"))); printAction = fileMenu->addAction(tr("&Print..."), this, SLOT(printFile())); printAction->setEnabled(false); pdfPrintAction = fileMenu->addAction(tr("Print as P&DF..."), this, SLOT(printPdf())); pdfPrintAction->setEnabled(false); fileMenu->addAction(tr("E&xit"), this, SLOT(close()), QKeySequence(tr("Ctrl+Q", "File|Exit"))); menuBar()->addMenu(fileMenu); editor = new QTextEdit(this); document = new QTextDocument(this); editor->setDocument(document); connect(editor, SIGNAL(selectionChanged()), this, SLOT(updateMenus())); setCentralWidget(editor); setWindowTitle(tr("Text Document Writer")); } void MainWindow::openFile() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), currentFile, "HTML files (*.html);;Text files (*.txt)"); if (!fileName.isEmpty()) { QFileInfo info(fileName); if (info.completeSuffix() == "html") { QFile file(fileName); if (file.open(QIODevice::ReadOnly)) { editor->setHtml(file.readAll()); file.close(); currentFile = fileName; } } else if (info.completeSuffix() == "txt") { QFile file(fileName); if (file.open(QIODevice::ReadOnly)) { editor->setPlainText(file.readAll()); file.close(); currentFile = fileName; } } printAction->setEnabled(true); pdfPrintAction->setEnabled(true); } } void MainWindow::printFile() { //! [0] QTextDocument *document = editor->document(); QPrinter printer; QPrintDialog *dlg = new QPrintDialog(&printer, this); if (dlg->exec() != QDialog::Accepted) return; document->print(&printer); //! [0] } void MainWindow::printPdf() { QPrinter printer(QPrinter::HighResolution); printer.setOutputFormat(QPrinter::PdfFormat); QPrintDialog *printDialog = new QPrintDialog(&printer, this); if (printDialog->exec() == QDialog::Accepted) editor->document()->print(&printer); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-printing/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include class QAction; class QTextDocument; class QTextEdit; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void openFile(); void printFile(); void printPdf(); private: QAction *printAction; QAction *pdfPrintAction; QString currentFile; QTextEdit *editor; QTextDocument *document; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-selections/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->resize(640, 480); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-selections/mainwindow.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" MainWindow::MainWindow() { QMenu *fileMenu = new QMenu(tr("&File")); fileMenu->addAction(tr("&Open..."), this, SLOT(openFile()), QKeySequence(tr("Ctrl+O", "File|Open"))); QAction *quitAction = fileMenu->addAction(tr("E&xit"), this, SLOT(close())); quitAction->setShortcut(tr("Ctrl+Q")); QMenu *editMenu = new QMenu(tr("&Edit")); cutAction = editMenu->addAction(tr("Cu&t"), this, SLOT(cutSelection())); cutAction->setShortcut(tr("Ctrl+X")); cutAction->setEnabled(false); copyAction = editMenu->addAction(tr("&Copy"), this, SLOT(copySelection())); copyAction->setShortcut(tr("Ctrl+C")); copyAction->setEnabled(false); pasteAction = editMenu->addAction(tr("&Paste"), this, SLOT(pasteSelection())); pasteAction->setShortcut(tr("Ctrl+V")); pasteAction->setEnabled(false); QMenu *selectMenu = new QMenu(tr("&Select")); selectMenu->addAction(tr("&Word"), this, SLOT(selectWord())); selectMenu->addAction(tr("&Line"), this, SLOT(selectLine())); selectMenu->addAction(tr("&Block"), this, SLOT(selectBlock())); selectMenu->addAction(tr("&Frame"), this, SLOT(selectFrame())); menuBar()->addMenu(fileMenu); menuBar()->addMenu(editMenu); menuBar()->addMenu(selectMenu); editor = new QTextEdit(this); document = new QTextDocument(this); editor->setDocument(document); connect(editor, SIGNAL(selectionChanged()), this, SLOT(updateMenus())); setCentralWidget(editor); setWindowTitle(tr("Text Document Writer")); } void MainWindow::openFile() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), currentFile, "HTML files (*.html);;Text files (*.txt)"); if (!fileName.isEmpty()) { QFileInfo info(fileName); if (info.completeSuffix() == "html") { QFile file(fileName); if (file.open(QFile::ReadOnly)) { editor->setHtml(QString(file.readAll())); file.close(); currentFile = fileName; } } else if (info.completeSuffix() == "txt") { QFile file(fileName); if (file.open(QFile::ReadOnly)) { editor->setPlainText(file.readAll()); file.close(); currentFile = fileName; } } } } void MainWindow::cutSelection() { QTextCursor cursor = editor->textCursor(); if (cursor.hasSelection()) { selection = cursor.selection(); cursor.removeSelectedText(); } } void MainWindow::copySelection() { QTextCursor cursor = editor->textCursor(); if (cursor.hasSelection()) { selection = cursor.selection(); cursor.clearSelection(); } } void MainWindow::pasteSelection() { QTextCursor cursor = editor->textCursor(); cursor.insertFragment(selection); } void MainWindow::selectWord() { QTextCursor cursor = editor->textCursor(); QTextBlock block = cursor.block(); //! [0] cursor.beginEditBlock(); //! [1] cursor.movePosition(QTextCursor::StartOfWord); cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); //! [1] cursor.endEditBlock(); //! [0] editor->setTextCursor(cursor); } void MainWindow::selectLine() { QTextCursor cursor = editor->textCursor(); QTextBlock block = cursor.block(); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfLine); cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); cursor.endEditBlock(); editor->setTextCursor(cursor); } void MainWindow::selectBlock() { QTextCursor cursor = editor->textCursor(); QTextBlock block = cursor.block(); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfBlock); cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); cursor.endEditBlock(); editor->setTextCursor(cursor); } void MainWindow::selectFrame() { QTextCursor cursor = editor->textCursor(); QTextFrame *frame = cursor.currentFrame(); cursor.beginEditBlock(); cursor.setPosition(frame->firstPosition()); cursor.setPosition(frame->lastPosition(), QTextCursor::KeepAnchor); cursor.endEditBlock(); editor->setTextCursor(cursor); } void MainWindow::updateMenus() { QTextCursor cursor = editor->textCursor(); cutAction->setEnabled(cursor.hasSelection()); copyAction->setEnabled(cursor.hasSelection()); pasteAction->setEnabled(!selection.isEmpty()); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-selections/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include class QAction; class QTextDocument; class QTextEdit; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void cutSelection(); void copySelection(); void openFile(); void pasteSelection(); void selectWord(); void selectLine(); void selectBlock(); void selectFrame(); void updateMenus(); private: QAction *cutAction; QAction *copyAction; QAction *pasteAction; QString currentFile; QTextEdit *editor; QTextDocument *document; QTextDocumentFragment selection; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-tables/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow *window = new MainWindow; window->resize(480, 480); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-tables/mainwindow.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ########################################################################### //! [0] //! [1] cursor = QTextCursor(editor.textCursor()) //! [0] cursor.movePosition(QTextCursor.Start) //! [1] //! [2] tableFormat = QTextTableFormat() tableFormat.setBackground(QColor("#e0e0e0")) QVector constraints constraints << QTextLength(QTextLength.PercentageLength, 16) constraints << QTextLength(QTextLength.PercentageLength, 28) constraints << QTextLength(QTextLength.PercentageLength, 28) constraints << QTextLength(QTextLength.PercentageLength, 28) tableFormat.setColumnWidthConstraints(constraints) //! [3] table = cursor.insertTable(rows, columns, tableFormat) //! [2] //! [3] //! [4] cell = table.cellAt(0, 0) cellCursor = cell.firstCursorPosition() cellCursor.insertText(tr("Week"), charFormat) //! [4] //! [5] for column in range(columns): cell = table.cellAt(0, column) cellCursor = cell.firstCursorPosition() cellCursor.insertText(tr("Team %1").arg(column), charFormat) for row in range(rows): cell = table.cellAt(row, 0) cellCursor = cell.firstCursorPosition() cellCursor.insertText(tr("%1").arg(row), charFormat) for column in range(columns) if (row-1) % 3 == column-1: //! [5] //! [6] cell = table.cellAt(row, column) cellCursor = cell.firstCursorPosition() cellCursor.insertText(tr("On duty"), charFormat) //! [6] //! [7] //! [7] //! [8] //! [8] //! [9] for row in range(table.rows()): for column in range(table.columns()): tableCell = table.cellAt(row, column) //! [9] QTextFrame.iterator it QString text for (it = tableCell.begin() !(it.atEnd()); ++it): QTextBlock childBlock = it.currentBlock() if (childBlock.isValid()) text += childBlock.text() Item = QTableWidgetItem(text) tableWidget.setItem(row, column, Item) //! [10] processTableCell(tableCell) //! [10] //! [11] //! [11] //! [12] //! [12] ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-tables/mainwindow.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include class QTextEdit; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); public slots: void saveFile(); void showTable(); private: bool writeXml(const QString &fileName); QTextEdit *editor; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-tables/xmlwriter.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "xmlwriter.h" QDomDocument *XmlWriter::toXml() { QDomImplementation implementation; QDomDocumentType docType = implementation.createDocumentType( "scribe-document", "scribe", "qtsoftware.com/scribe"); document = new QDomDocument(docType); // ### This processing instruction is required to ensure that any kind // of encoding is given when the document is written. QDomProcessingInstruction process = document->createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"utf-8\""); document->appendChild(process); QDomElement documentElement = document->createElement("document"); document->appendChild(documentElement); QTextFrame *root = textDocument->rootFrame(); if (root) processFrame(documentElement, root); return document; } void XmlWriter::processBlock(QDomElement &parent, const QTextBlock &block) { QDomElement blockElement = document->createElement("block"); blockElement.setAttribute("position", block.position()); blockElement.setAttribute("length", block.length()); parent.appendChild(blockElement); QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { QTextFragment fragment = it.fragment(); if (fragment.isValid()) { QDomElement fragmentElement = document->createElement("fragment"); blockElement.appendChild(fragmentElement); fragmentElement.setAttribute("length", fragment.length()); QDomText fragmentText = document->createTextNode(fragment.text()); fragmentElement.appendChild(fragmentText); } } } void XmlWriter::processFrame(QDomElement &parent, QTextFrame *frame) { QDomElement frameElement = document->createElement("frame"); frameElement.setAttribute("begin", frame->firstPosition()); frameElement.setAttribute("end", frame->lastPosition()); parent.appendChild(frameElement); //! [0] QTextFrame::iterator it; for (it = frame->begin(); !(it.atEnd()); ++it) { QTextFrame *childFrame = it.currentFrame(); QTextBlock childBlock = it.currentBlock(); if (childFrame) { QTextTable *childTable = qobject_cast(childFrame); if (childTable) processTable(frameElement, childTable); else processFrame(frameElement, childFrame); } else if (childBlock.isValid()) //! [0] //! [1] processBlock(frameElement, childBlock); } //! [1] } void XmlWriter::processTable(QDomElement &parent, QTextTable *table) { QDomElement element = document->createElement("table"); for (int row = 0; row < table->rows(); ++row) { for (int column = 0; column < table->columns(); ++column) { QTextTableCell cell = table->cellAt(row, column); processTableCell(element, cell); } } parent.appendChild(element); } void XmlWriter::processTableCell(QDomElement &parent, const QTextTableCell &cell) { QDomElement element = document->createElement("cell"); element.setAttribute("row", cell.row()); element.setAttribute("column", cell.column()); QTextFrame::iterator it; for (it = cell.begin(); !(it.atEnd()); ++it) { QTextFrame *childFrame = it.currentFrame(); QTextBlock childBlock = it.currentBlock(); if (childFrame) processFrame(element, childFrame); else if (childBlock.isValid()) processBlock(element, childBlock); } parent.appendChild(element); } ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-tables/xmlwriter.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef XMLWRITER_H #define XMLWRITER_H #include class QTextDocument; class XmlWriter { public: XmlWriter(QTextDocument *document) : textDocument(document) {} QDomDocument *toXml(); private: void processBlock(QDomElement &parent, const QTextBlock &block); void processFrame(QDomElement &parent, QTextFrame *frame); void processTable(QDomElement &parent, QTextTable *table); void processTableCell(QDomElement &parent, const QTextTableCell &cell); QDomDocument *document; QTextDocument *textDocument; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocument-texttable/main.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] table.mergeCells(0, 0, 1, 2) //! [0] //! [1] table.splitCell(0, 0, 1, 1) //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/textdocumentendsnippet.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include int main(int argv, char **args) { QString contentString("One\nTwp\nThree"); QTextDocument *doc = new QTextDocument(contentString); //! [0] it = doc.begin() while it != doc.end(): print it.text() it = it.next() //! [0] return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/threads/threads.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include "threads.h" //! [0] void MyThread::run() //! [0] //! [1] { //! [1] //! [2] } //! [2] #define Counter ReentrantCounter //! [3] class Counter //! [3] //! [4] { public: Counter() { n = 0; } void increment() { ++n; } void decrement() { --n; } int value() const { return n; } private: int n; }; //! [4] #undef Counter #define Counter ThreadSafeCounter //! [5] class Counter //! [5] //! [6] { public: Counter() { n = 0; } void increment() { QMutexLocker locker(&mutex); ++n; } void decrement() { QMutexLocker locker(&mutex); --n; } int value() const { QMutexLocker locker(&mutex); return n; } private: mutable QMutex mutex; int n; }; //! [6] typedef int SomeClass; //! [7] QThreadStorage *> caches; void cacheObject(const QString &key, SomeClass *object) //! [7] //! [8] { if (!caches.hasLocalData()) caches.setLocalData(new QCache); caches.localData()->insert(key, object); } void removeFromCache(const QString &key) //! [8] //! [9] { if (!caches.hasLocalData()) return; caches.localData()->remove(key); } //! [9] int main() { return 0; } ================================================ FILE: doc/codesnippets/doc/src/snippets/threads/threads.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include //! [0] class MyThread : public QThread { Q_OBJECT protected: void run(); }; //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/timeline/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include int main(int argv, char *args[]) { QApplication app(argv, args) //! [0] ball = QGraphicsEllipseItem(0, 0, 20, 20) timer = QTimeLine(5000) timer.setFrameRange(0, 100) animation = QGraphicsItemAnimation() animation.setItem(ball) animation.setTimeLine(timer) for i in range(200): animation.setPosAt(i / 200.0, QPointF(i, i)) scene = QGraphicsScene() scene.setSceneRect(0, 0, 250, 250) scene.addItem(ball) view = QGraphicsView(scene) view.show() timer.start() //! [0] return app.exec() } ================================================ FILE: doc/codesnippets/doc/src/snippets/timers/timers.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ from PySide.QtCore import QTimer class Foo : public QObject { public: Foo() } Foo::Foo() { //! [0] timer = QTimer(self) //! [0] //! [1] timer.timeout.connect(self.updateCaption) //! [1] //! [2] timer.start(1000) //! [2] //! [3] QTimer.singleShot(200, self.updateCaption) //! [3] { // ZERO-CASE //! [4] timer = QTimer(self) //! [4] //! [5] timer.timeout.connect(self.processOneThing) //! [5] //! [6] timer.start() //! [6] } } int main() { } ================================================ FILE: doc/codesnippets/doc/src/snippets/transform/main.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ########################################################################### //! [0] def paintEvent(self, event) painter = QPainter(self) painter.setPen(QPen(Qt.blue, 1, Qt.DashLine)) painter.drawRect(0, 0, 100, 100) painter.rotate(45) painter.setFont(QFont("Helvetica", 24)) painter.setPen(QPen(Qt.black, 1)) painter.drawText(20, 10, "QTransform") //! [0] //! [1] def paintEvent(self, event) painter = QPainter(self) painter.setPen(QPen(Qt.blue, 1, Qt.DashLine)) painter.drawRect(0, 0, 100, 100) transform = QTransform() transform.translate(50, 50) transform.rotate(45) transform.scale(0.5, 1.0) painter.setTransform(transform) painter.setFont(QFont("Helvetica", 24)) painter.setPen(QPen(Qt.black, 1)) painter.drawText(20, 10, "QTransform") //! [1] //! [2] def paintEvent(self, event) pi = 3.14 a = pi/180 * 45.0 sina = sin(a) cosa = cos(a) translationTransform = QTransform(1, 0, 0, 1, 50.0, 50.0) rotationTransform = QTransform(cosa, sina, -sina, cosa, 0, 0) scalingTransform = QTransform(0.5, 0, 0, 1.0, 0, 0) transform = QTransform() transform = scalingTransform * rotationTransform * translationTransform painter = QPainter(self) painter.setPen(QPen(Qt.blue, 1, Qt.DashLine)) painter.drawRect(0, 0, 100, 100) painter.setTransform(transform) painter.setFont(QFont("Helvetica", 24)) painter.setPen(QPen(Qt.black, 1)) painter.drawText(20, 10, "QTransform") //! [2] ================================================ FILE: doc/codesnippets/doc/src/snippets/uitools/calculatorform/calculatorform.ui ================================================ CalculatorForm CalculatorForm 0 0 276 98 5 5 0 0 Calculator Builder 9 6 1 6 1 6 label 1 1 45 19 Input 1 inputSpinBox1 1 26 45 25 true label_3 54 1 7 52 + Qt::AlignCenter 1 6 label_2 1 1 45 19 Input 2 inputSpinBox2 1 26 45 25 true label_3_2 120 1 7 52 = Qt::AlignCenter 1 6 label_2_2_2 1 1 37 17 Output outputWidget 1 24 37 27 QFrame::Box QFrame::Sunken 0 Qt::AlignAbsolute|Qt::AlignBottom|Qt::AlignCenter|Qt::AlignHCenter|Qt::AlignHorizontal_Mask|Qt::AlignJustify|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing|Qt::AlignVCenter|Qt::AlignVertical_Mask verticalSpacer 85 69 20 20 Qt::Vertical 20 40 horizontalSpacer 188 26 79 20 Qt::Horizontal 40 20 ================================================ FILE: doc/codesnippets/doc/src/snippets/uitools/calculatorform/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] #include "ui_calculatorform.h" //! [0] #include //! [1] int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget *widget = new QWidget; Ui::CalculatorForm ui; ui.setupUi(widget); widget->show(); return app.exec(); } //! [1] ================================================ FILE: doc/codesnippets/doc/src/snippets/updating-selections/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* main.cpp A simple example that shows how selections can be used directly on a model. It shows the result of some selections made using a table view. */ #include #include "window.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow *window = new MainWindow; window->show(); window->resize(640, 480); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/updating-selections/model.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MODEL_H #define MODEL_H #include #include #include class TableModel : public QAbstractTableModel { Q_OBJECT public: TableModel(int rows = 1, int columns = 1, QObject *parent = 0); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool insertColumns(int position, int columns, const QModelIndex &parent = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool removeColumns(int position, int columns, const QModelIndex &parent = QModelIndex()); private: QList rowList; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/updating-selections/window.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* window.cpp A minimal subclass of QTableView with slots to allow the selection model to be monitored. */ #include #include #include #include #include "model.h" #include "window.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle("Selected items in a table model"); model = new TableModel(8, 4, this); table = new QTableView(this); table->setModel(model); selectionModel = table->selectionModel(); connect(selectionModel, SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(updateSelection(const QItemSelection &, const QItemSelection &))); connect(selectionModel, SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(changeCurrent(const QModelIndex &, const QModelIndex &))); statusBar(); setCentralWidget(table); } //! [0] void MainWindow::updateSelection(const QItemSelection &selected, const QItemSelection &deselected) { QModelIndex index; QModelIndexList items = selected.indexes(); foreach (index, items) { QString text = QString("(%1,%2)").arg(index.row()).arg(index.column()); model->setData(index, text); //! [0] //! [1] } //! [1] //! [2] items = deselected.indexes(); foreach (index, items) model->setData(index, ""); } //! [2] //! [3] void MainWindow::changeCurrent(const QModelIndex ¤t, const QModelIndex &previous) { statusBar()->showMessage( tr("Moved from (%1,%2) to (%3,%4)") .arg(previous.row()).arg(previous.column()) .arg(current.row()).arg(current.column())); } //! [3] ================================================ FILE: doc/codesnippets/doc/src/snippets/updating-selections/window.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include #include #include #include #include class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); public slots: void updateSelection(const QItemSelection &selected, const QItemSelection &deselected); void changeCurrent(const QModelIndex ¤t, const QModelIndex &previous); private: QAbstractItemModel *model; QItemSelectionModel *selectionModel; QTableView *table; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/videomedia.cpp ================================================ #include #include int main(int argv, char **args) { QApplication app(argv, args); Phonon::VideoPlayer *player = new Phonon::VideoPlayer(Phonon::VideoCategory, 0); //![0] player->mediaObject()->isSeekable(); //![0] return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/volumeslider.cpp ================================================ #include #include #include #include int main(int argv, char **args) { QApplication app(argv, args); app.setApplicationName("Volume slider tester"); Phonon::MediaObject *mediaObject = new Phonon::MediaObject; mediaObject->setCurrentSource(QString("/home/gvatteka/Music/Lumme-Badloop.ogg")); //! [0] Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory); Phonon::createPath(mediaObject, audioOutput); Phonon::VolumeSlider *volumeSlider = new Phonon::VolumeSlider; volumeSlider->setAudioOutput(audioOutput); //! [0] mediaObject->play(); volumeSlider->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/webkit/webpage/main.cpp ================================================ from PySide.QtGui import * from PySide.QWebKit import QWebPage from PySide.QWebKit import QWebFrame //! [0] class Thumbnailer(QObject): page = QWebPage() //! [1] def __init__(self, url): page.mainFrame().load(url) connect(page, SIGNAL("loadFinished(bool)"), self, SLOT("render()")) //! [1] //! [2] def render(self): page.setViewportSize(page.mainFrame().contentsSize()) image = QImage(page.viewportSize(), QImage.Format_ARGB32) painter = QPainter(image) page.mainFrame().render(painter) painter.end() thumbnail = image.scaled(400, 400) thumbnail.save("thumbnail.png") self.finished() //! [2] //! [0] def main(): app = QApplication([]) thumbnail = Thumbnailer(QUrl("http://qtsoftware.com")) QObject.connect(thumbnail, SIGNAL("finished()"), app, SLOT("quit()")) return app.exec_() #include "main.moc" ================================================ FILE: doc/codesnippets/doc/src/snippets/whatsthis/whatsthis.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] Act = QAction(tr("&New"), self) Act.setShortcut(tr("Ctrl+N")) Act.setStatusTip(QObject.tr("Create a new file")) Act.setWhatsThis(QObject.tr("Click self option to create a new file.")) //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/widget-mask/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include int main(int argc, char *argv[]) { QApplication app(argc, argv); //! [0] QLabel topLevelLabel; QPixmap pixmap(":/images/tux.png"); topLevelLabel.setPixmap(pixmap); topLevelLabel.setMask(pixmap.mask()); //! [0] topLevelLabel.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/widget-mask/mask.qrc ================================================ tux.png ================================================ FILE: doc/codesnippets/doc/src/snippets/widgetdelegate.cpp ================================================ //![0] class WidgetDelegate (QStyledItemDelegate): # ... def paint(painter, option, index): if index.column() == 1: progress = index.data().toInt() progressBarOption = QStyleOptionProgressBar() progressBarOption.rect = option.rect progressBarOption.minimum = 0 progressBarOption.maximum = 100 progressBarOption.progress = progress progressBarOption.text = QString::number(progress) + "%" progressBarOption.textVisible = True QApplication.style().drawControl(QStyle.CE_ProgressBar, progressBarOption, painter) else: QStyledItemDelegate.paint(self, painter, option, index) //![0] ================================================ FILE: doc/codesnippets/doc/src/snippets/widgets-tutorial/childwidget/main.cpp ================================================ #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget *window = new QWidget(); window->resize(320, 240); window->setWindowTitle(tr("Child widget")); window->show(); //! [create, position and show] QPushButton *button = new QPushButton(tr("Press me"), window); button->move(100, 100); button->show(); //! [create, position and show] return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/widgets-tutorial/nestedlayouts/main.cpp ================================================ #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget *window = new QWidget(); //! [create, lay out widgets and show] QLabel *queryLabel = new QLabel(tr("Query:")); QLineEdit *queryEdit = new QLineEdit(); QTableView *resultView = new QTableView(); QHBoxLayout *queryLayout = new QHBoxLayout(); queryLayout->addWidget(queryLabel); queryLayout->addWidget(queryEdit); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->addLayout(queryLayout); mainLayout->addWidget(resultView); window->setLayout(mainLayout); //! [create, lay out widgets and show] QStandardItemModel model; model.setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Office")); QList rows = QList() << (QStringList() << "Verne Nilsen" << "123") << (QStringList() << "Carlos Tang" << "77") << (QStringList() << "Bronwyn Hawcroft" << "119") << (QStringList() << "Alessandro Hanssen" << "32") << (QStringList() << "Andrew John Bakken" << "54") << (QStringList() << "Vanessa Weatherley" << "85") << (QStringList() << "Rebecca Dickens" << "17") << (QStringList() << "David Bradley" << "42") << (QStringList() << "Knut Walters" << "25") << (QStringList() << "Andrea Jones" << "34"); foreach (QStringList row, rows) { QList items; foreach (QString text, row) items.append(new QStandardItem(text)); model.appendRow(items); } resultView->setModel(&model); resultView->verticalHeader()->hide(); resultView->horizontalHeader()->setStretchLastSection(true); window->setWindowTitle(tr("Nested layouts")); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/widgets-tutorial/toplevel/main.cpp ================================================ #include int main(int argc, char *argv[]) { QApplication app(argc, argv); //! [create, resize and show] QWidget *window = new QWidget(); window->resize(320, 240); window->show(); //! [create, resize and show] window->setWindowTitle(tr("Top-level widget")); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/widgets-tutorial/windowlayout/main.cpp ================================================ #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget *window = new QWidget(); //! [create, lay out widgets and show] QLabel *label = new QLabel(tr("Name:")); QLineEdit *lineEdit = new QLineEdit(); QHBoxLayout *layout = new QHBoxLayout(); layout->addWidget(label); layout->addWidget(lineEdit); window->setLayout(layout); //! [create, lay out widgets and show] window->setWindowTitle(tr("Window layout")); window->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/xml/rsslisting/handler.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* handler.cpp Provides a handler for processing XML elements found by the reader. The handler looks for and <link> elements within <item> elements, and records the text found within them. Link information stored within rdf:about attributes of <item> elements is also recorded when it is available. For each item found, a signal is emitted which specifies its title and link information. This may be used by user interfaces for the purpose of displaying items as they are read. */ #include <QtGui> #include "handler.h" /* Reset the state of the handler to ensure that new documents are read correctly. We return true to indicate that parsing should continue. */ bool Handler::startDocument() { inItem = false; inTitle = false; inLink = false; return true; } /* Process each starting element in the XML document. Nested item, title, or link elements are not allowed, so we return false if we encounter any of these. We also prohibit multiple definitions of title strings. Link destinations are read by this function if they are specified as attributes in item elements. For all cases not explicitly checked for, we return true to indicate that the element is acceptable, and that parsing should continue. By doing this, we can ignore elements in which we are not interested. */ bool Handler::startElement(const QString &, const QString &, const QString & qName, const QXmlAttributes &attr) { if (qName == "item") { if (inItem) return false; else { inItem = true; linkString = attr.value("rdf:about"); } } else if (qName == "title") { if (inTitle) return false; else if (!titleString.isEmpty()) return false; else if (inItem) inTitle = true; } else if (qName == "link") { if (inLink) return false; else if (inItem) inLink = true; } return true; } /* Process each ending element in the XML document. For recognized elements, we reset flags to ensure that we can read new instances of these elements. If we have read an item element, emit a signal to indicate that a new item is available for display. We return true to indicate that parsing should continue. */ bool Handler::endElement(const QString &, const QString &, const QString & qName) { if (qName == "title" && inTitle) inTitle = false; else if (qName == "link" && inLink) inLink = false; else if (qName == "item") { if (!titleString.isEmpty() && !linkString.isEmpty()) emit newItem(titleString, linkString); inItem = false; titleString = ""; linkString = ""; } return true; } /* Collect characters when reading the contents of title or link elements when they occur within an item element. We return true to indicate that parsing should continue. */ bool Handler::characters (const QString &chars) { if (inTitle) titleString += chars; else if (inLink) linkString += chars; return true; } /* Report a fatal parsing error, and return false to indicate to the reader that parsing should stop. */ //! [0] def fatalError(self, exception): qWarning("Fatal error on line %d, column %d:%s" % (exception.lineNumber(), exception.columnNumber(), exception.message()) return False //! [0] ================================================ FILE: doc/codesnippets/doc/src/snippets/xml/rsslisting/handler.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef HANDLER_H #define HANDLER_H #include <QObject> #include <QString> #include <QXmlDefaultHandler> /* Note that QObject must precede QXmlDefaultHandler in the following list. */ class Handler : public QObject, public QXmlDefaultHandler { Q_OBJECT public: bool startDocument(); bool startElement(const QString &, const QString &, const QString &qName, const QXmlAttributes &attr); bool endElement(const QString &, const QString &, const QString &qName); bool characters(const QString &chars); bool fatalError(const QXmlParseException &exception); signals: void newItem(QString &title, QString &link); private: QString titleString; QString linkString; bool inItem; bool inTitle; bool inLink; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/xml/rsslisting/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* main.cpp Provides the main function for the RSS news reader example. */ #include <QtGui> #include "rsslisting.h" /*! Create an application and a main widget. Open the main widget for user input, and exit with an appropriate return value when it is closed. */ int main(int argc, char **argv) { QApplication app(argc, argv); RSSListing *rsslisting = new RSSListing; rsslisting->show(); return app.exec(); } ================================================ FILE: doc/codesnippets/doc/src/snippets/xml/rsslisting/rsslisting.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* rsslisting.cpp Provides a widget for displaying news items from RDF news sources. RDF is an XML-based format for storing items of information (see http://www.w3.org/RDF/ for details). The widget itself provides a simple user interface for specifying the URL of a news source, and controlling the downloading of news. The widget downloads and parses the XML asynchronously, feeding the data to an XML reader in pieces. This allows the user to interrupt its operation, and also allows very large data sources to be read. */ #include <QtCore> #include <QtGui> #include <QtNetwork> #include <QtXml> #include "rsslisting.h" /* Constructs an RSSListing widget with a simple user interface, and sets up the XML reader to use a custom handler class. The user interface consists of a line edit, two push buttons, and a list view widget. The line edit is used for entering the URLs of news sources; the push buttons start and abort the process of reading the news. */ RSSListing::RSSListing(QWidget *parent) : QWidget(parent) { lineEdit = new QLineEdit(this); fetchButton = new QPushButton(tr("Fetch"), this); abortButton = new QPushButton(tr("Abort"), this); abortButton->setEnabled(false); treeWidget = new QTreeWidget(this); QStringList headerLabels; headerLabels << tr("Title") << tr("Link"); treeWidget->setHeaderLabels(headerLabels); handler = 0; connect(&http, SIGNAL(readyRead(const QHttpResponseHeader &)), this, SLOT(readData(const QHttpResponseHeader &))); connect(&http, SIGNAL(requestFinished(int, bool)), this, SLOT(finished(int, bool))); connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(fetch())); connect(fetchButton, SIGNAL(clicked()), this, SLOT(fetch())); connect(abortButton, SIGNAL(clicked()), &http, SLOT(abort())); QVBoxLayout *layout = new QVBoxLayout(this); QHBoxLayout *hboxLayout = new QHBoxLayout; hboxLayout->addWidget(lineEdit); hboxLayout->addWidget(fetchButton); hboxLayout->addWidget(abortButton); layout->addLayout(hboxLayout); layout->addWidget(treeWidget); setWindowTitle(tr("RSS listing example")); } /* Starts fetching data from a news source specified in the line edit widget. The line edit is made read only to prevent the user from modifying its contents during the fetch; this is only for cosmetic purposes. The fetch button is disabled, and the abort button is enabled to allow the user to interrupt processing. The list view is cleared, and we define the last list view item to be 0, meaning that there are no existing items in the list. We reset the flag used to determine whether parsing should begin again or continue. A new handler is created, if required, and made available to the reader. The HTTP handler is supplied with the raw contents of the line edit and a fetch is initiated. We keep the ID value returned by the HTTP handler for future reference. */ void RSSListing::fetch() { lineEdit->setReadOnly(true); fetchButton->setEnabled(false); abortButton->setEnabled(true); treeWidget->clear(); lastItemCreated = 0; newInformation = true; if (handler != 0) delete handler; handler = new Handler; //! [0] xmlReader.setContentHandler(handler) xmlReader.setErrorHandler(handler) //! [0] connect(handler, SIGNAL(newItem(QString &, QString &)), this, SLOT(addItem(QString &, QString &))); QUrl url(lineEdit->text()); http.setHost(url.host()); connectionId = http.get(url.path()); } /* Reads data received from the RDF source. We read all the available data, and pass it to the XML input source. The first time we receive new information, the reader is set up for a new incremental parse; we continue parsing using a different function on subsequent calls involving the same data source. If parsing fails for any reason, we abort the fetch. */ //! [1] def readData(self, resp): if resp.statusCode() != 200: self.http.abort() else: xmlInput.setData(self.http.readAll()) if newInformation: ok = xmlReader.parse(xmlInput, True) newInformation = False else: ok = xmlReader.parseContinue() if not ok: self.http.abort() //! [1] /* Finishes processing an HTTP request. The default behavior is to keep the text edit read only. If an error has occurred, the user interface is made available to the user for further input, allowing a new fetch to be started. If the HTTP get request has finished, we perform a final parsing operation on the data returned to ensure that it was well-formed. Whether this is successful or not, we make the user interface available to the user for further input. */ void RSSListing::finished(int id, bool error) { if (error) { qWarning("Received error during HTTP fetch."); lineEdit->setReadOnly(false); abortButton->setEnabled(false); fetchButton->setEnabled(true); } else if (id == connectionId) { bool ok = xmlReader.parseContinue(); if (!ok) qWarning("Parse error at the end of input."); lineEdit->setReadOnly(false); abortButton->setEnabled(false); fetchButton->setEnabled(true); } } /* Adds an item to the list view as it is reported by the handler. We keep a record of the last item created to ensure that the items are created in sequence. */ void RSSListing::addItem(QString &title, QString &link) { QTreeWidgetItem *item; item = new QTreeWidgetItem(treeWidget, lastItemCreated); item->setText(0, title); item->setText(1, link); lastItemCreated = item; } ================================================ FILE: doc/codesnippets/doc/src/snippets/xml/rsslisting/rsslisting.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef RSSLISTING_H #define RSSLISTING_H #include <QHttp> #include <QWidget> #include <QXmlInputSource> #include <QXmlSimpleReader> #include "handler.h" class QLineEdit; class QTreeWidget; class QTreeWidgetItem; class QPushButton; class RSSListing : public QWidget { Q_OBJECT public: RSSListing(QWidget *widget = 0); public slots: void addItem(QString &title, QString &link); void fetch(); void finished(int id, bool error); void readData(const QHttpResponseHeader &); private: Handler *handler; QXmlInputSource xmlInput; QXmlSimpleReader xmlReader; bool newInformation; QHttp http; int connectionId; QLineEdit *lineEdit; QTreeWidget *treeWidget; QTreeWidgetItem *lastItemCreated; QPushButton *abortButton; QPushButton *fetchButton; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/xml/simpleparse/handler.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* handler.cpp Provides a handler for processing XML elements found by the reader. The handler stores the names of elements it finds and their indentation levels. The indentation level is initially set to zero. When a starting element is found, the indentation level is increased; when an ending element is found, the indentation level is decreased. */ #include <QDebug> #include "handler.h" /*! Reset the state of the handler to ensure that new documents are read correctly. We return true to indicate that parsing should continue. */ bool Handler::startDocument() { elementName.clear(); elementIndentation.clear(); indentationLevel = 0; return true; } /*! Process each starting element in the XML document. Append the element name to the list of elements found; add its corresponding indentation level to the list of indentation levels. Increase the level of indentation by one column. We return true to indicate that parsing should continue. */ bool Handler::startElement(const QString &, const QString &, const QString & qName, const QXmlAttributes &) { elementName.append(qName); elementIndentation.append(indentationLevel); indentationLevel += 1; return true; } /*! Process each ending element in the XML document. Decrease the level of indentation by one column. We return true to indicate that parsing should continue. */ bool Handler::endElement(const QString &, const QString &, const QString &) { indentationLevel -= 1; return true; } /*! Report a fatal parsing error, and return false to indicate to the reader that parsing should stop. */ bool Handler::fatalError (const QXmlParseException & exception) { qWarning() << QString("Fatal error on line %1, column %2: %3").arg( exception.lineNumber()).arg(exception.columnNumber()).arg( exception.message()); return false; } /*! Return the list of element names found. */ QStringList& Handler::names () { return elementName; } /*! Return the list of indentations used for each element found. */ QList<int>& Handler::indentations () { return elementIndentation; } ================================================ FILE: doc/codesnippets/doc/src/snippets/xml/simpleparse/handler.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef HANDLER_H #define HANDLER_H #include <qstring.h> #include <qxml.h> class Handler : public QXmlDefaultHandler { public: bool startDocument(); bool startElement(const QString &, const QString &, const QString &qName, const QXmlAttributes &); bool endElement(const QString &, const QString &, const QString &); bool fatalError(const QXmlParseException &exception); QStringList& names(); QList<int>& indentations(); private: int indentationLevel; QStringList elementName; QList<int> elementIndentation; }; #endif ================================================ FILE: doc/codesnippets/doc/src/snippets/xml/simpleparse/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <qfile.h> #include <qxml.h> #include "handler.h" #include <iostream> int main(int argc, char **argv) { if (argc != 2) { std::cout << "Usage: " << argv[0] << " <filename>" << std::endl; return 1; } QFile *file = new QFile(argv[1]); //! [0] xmlReader = QXmlSimpleReader() source = QXmlInputSource(filename) //! [0] //! [1] handler = Handler() xmlReader.setContentHandler(handler) xmlReader.setErrorHandler(handler) //! [1] //! [2] ok = xmlReader.parse(source) if not ok: print "Parsing failed." //! [2] else { QStringList names = handler->names(); QList<int> indentations = handler->indentations(); int items = names.count(); for (int i = 0; i < items; ++i) { for (int j = 0; j < indentations[i]; ++j) std::cout << " "; std::cout << names[i].toLocal8Bit().constData() << std::endl; } } return 0; } ================================================ FILE: doc/codesnippets/examples/dbus/example-client.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # DBUS Client using PySide integration import sys from traceback import print_exc # import python dbus module import dbus # import python dbus GLib mainloop support import dbus.mainloop.glib # import QtCore from PySide.QtCore import * # signal handler def button_clicked(): print "button clicked" # main function if __name__ == '__main__': # Enable glib main loop support dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) # Get the session bus bus = dbus.SessionBus() try: # Get the remote object remote_object = bus.get_object("com.example.SampleService", "/DBusWidget") # Get the remote interface for the remote object iface = dbus.Interface(remote_object, "com.example.SampleWidget") except dbus.DBusException: print_exc() sys.exit(1) # Start the application app = QCoreApplication([]) # Call some methods of the remote interface iface.show() iface.setText("Emit signal") # connect the DBus signal clicked to the function button_clicked iface.connect_to_signal("clicked", button_clicked) iface.connect_to_signal("lastWindowClosed", app.quit) # enter in the main loop app.exec_() ================================================ FILE: doc/codesnippets/examples/dbus/example-server.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # DBUS Server Example of use PySide with PyDBus library import dbus import dbus.service import dbus.mainloop.glib import random from PySide.QtCore import * from PySide.QtGui import QPushButton, QApplication # The adaptor, MUST inherit dbus.service.Object class DBusWidget(dbus.service.Object): def __init__(self, name, session): # export this object to dbus dbus.service.Object.__init__(self, name, session) # create a simple widget self.widget = QPushButton() self.widget.resize(200, 50) # To export a Qt signal as a DBus-signal, you need to connect it to a method in this class. # The method MUST have the signal annotation, so python-dbus will export it as a dbus-signal QObject.connect(self.widget, SIGNAL("clicked()"), self.clicked) QObject.connect(QApplication.instance(), SIGNAL("lastWindowClosed()"), self.lastWindowClosed) # You can export methods to dbus like you do in python-dbus. @dbus.service.method("com.example.SampleWidget", in_signature='', out_signature='') def show(self): self.widget.show() # Another method... now with a parameter @dbus.service.method("com.example.SampleWidget", in_signature='s', out_signature='') def setText(self, value): self.widget.setText(value) # Another one... @dbus.service.method("com.example.SampleWidget", in_signature='', out_signature='') def exit(self): qApp().quit() # A signal that will be exported to dbus @dbus.service.signal("com.example.SampleWidget", signature='') def clicked(self): pass # Another signal that will be exported to dbus @dbus.service.signal("com.example.SampleWidget", signature='') def lastWindowClosed(self): pass if __name__ == '__main__': app = QApplication([]) # Use qt/glib mainloop integration to get dbus mainloop working dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) session_bus = dbus.SessionBus() # Export the service name = dbus.service.BusName("com.example.SampleService", session_bus) # Export the object widget = DBusWidget(session_bus, '/DBusWidget') print "Running example service." app.exec_() ================================================ FILE: doc/codesnippets/examples/declarative/cppextensions/imageprovider/imageprovider-example.qml ================================================ import QtQuick 1.0 import "ImageProviderCore" // import the plugin that registers the color image provider //![0] Column { Image { source: "image://colors/yellow" } Image { source: "image://colors/red" } } //![0] ================================================ FILE: doc/codesnippets/examples/declarative/cppextensions/imageprovider/imageprovider.cpp ================================================ //![0] class ColorImageProvider (QDeclarativeImageProvider): def __init__(self): QDeclarativeImageProvider.__init__(self, QDeclarativeImageProvider.Pixmap) def requestPixmap(id, size, requestedSize): width = 100 height = 50 if size: size.setWidth(width) size.setHeight(height) if requestedSize.width() > 0: width = requestedSize.width() if requestedSize.height() > 0: height = requestedSize.height() pixmap = QPixmap(width, height) pixmap.fill(QColor(id).rgba()) //![0] # write the color name painter = QPainter(pixmap) f = painter.font() f.setPixelSize(20) painter.setFont(f) painter.setPen(Qt.black) if requestedSize.isValid(): painter.scale(requestedSize.width() / width, requestedSize.height() / height) painter.drawText(QRectF(0, 0, width, height), Qt.AlignCenter, id) //![1] return pixmap //![1] ================================================ FILE: doc/codesnippets/examples/declarative/cppextensions/plugins/plugin.cpp ================================================ //![0] class TimeModel (QObject): hour = Property(int, getHour, notify = timeChanged) minute = Property(int, getMinute, notify = timeChanged) //![0] //![plugin] class QExampleQmlPlugin (QDeclarativeExtensionPlugin): def registerTypes(self, uri): assert(uri == "com.nokia.TimeExample") qmlRegisterType(TimeModel, uri, 1, 0, "Time") //![plugin] //![export] # This isn't supported by PySide yet. # Q_EXPORT_PLUGIN2(qmlqtimeexampleplugin, QExampleQmlPlugin); //![export] ================================================ FILE: doc/codesnippets/examples/declarative/cppextensions/plugins/plugins.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] import com.nokia.TimeExample 1.0 // import types from the plugin Clock { // this class is defined in QML (com/nokia/TimeExample/Clock.qml) Time { // this class is defined in C++ (plugin.cpp) id: time } hours: time.hour minutes: time.minute } //![0] ================================================ FILE: doc/codesnippets/examples/dialogs/classwizard/classwizard.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] //! [1] def __init__(self, parent): QWizard.__init__(self, parent): self.addPage(IntroPage()) self.addPage(ClassInfoPage()) self.addPage(CodeStylePage()) self.addPage(OutputFilesPage()) self.addPage(ConclusionPage()) //! [0] self.setPixmap(QWizard.BannerPixmap, QPixmap(":/images/banner.png")) self.setPixmap(QWizard.BackgroundPixmap, QPixmap(":/images/background.png")) self.setWindowTitle(self.tr("Class Wizard")) //! [2] //! [1] //! [2] //! [3] def accept(self): //! [3] //! [4] className = self.field("className") baseClass = self.field("baseClass") macroName = self.field("macroName") baseInclude = self.field("baseInclude") outputDir = self.field("outputDir") header = self.field("header") implementation = self.field("implementation") //! [4] ... //! [5] QDialog.accept(self) //! [5] //! [6] } //! [6] //! [7] class IntroPage (QWizardPage): def __init__(self, parent): QWizardPage.__init__(self, parent) self.setTitle(tr("Introduction")) self.setPixmap(QWizard.WatermarkPixmap, QPixmap(":/images/watermark1.png")) label = QLabel(self.tr("This wizard will generate a skeleton C++ class " \ "definition, including a few functions. You simply " \ "need to specify the class name and set a few " \ "options to produce a header file and an " \ "implementation file for your new C++ class.")) label.setWordWrap(True) layout = QVBoxLayout() layout.addWidget(label) self.setLayout(layout) } //! [7] //! [8] //! [9] class ClassInfoPage(QWizardPage): def __init__(self, parent): QWizardPage.__init__(self, parent) //! [8] self.setTitle(self.tr("Class Information")) self.setSubTitle(self.tr("Specify basic information about the class for which you " \ "want to generate skeleton source code files.")) self.setPixmap(QWizard.LogoPixmap, QPixmap(":/images/logo1.png")) //! [10] classNameLabel = QLabel(self.tr("&Class name:")) classNameLineEdit = QLineEdit() classNameLabel.setBuddy(classNameLineEdit) baseClassLabel = QLabel(self.tr("B&ase class:")) baseClassLineEdit = QLineEdit() baseClassLabel.setBuddy(baseClassLineEdit) qobjectMacroCheckBox = QCheckBox(self.tr("Generate Q_OBJECT ¯o")) //! [10] groupBox = QGroupBox(self.tr("C&onstructor")) //! [9] qobjectCtorRadioButton = QRadioButton(self.tr("&QObject-style constructor")) qwidgetCtorRadioButton = QRadioButton(self.tr("Q&Widget-style constructor")) defaultCtorRadioButton = QRadioButton(self.tr("&Default constructor")) copyCtorCheckBox = QCheckBox(self.tr("&Generate copy constructor and operator=")) defaultCtorRadioButton.setChecked(True) self.connect(defaultCtorRadioButton, SIGNAL("toggled(bool)"), copyCtorCheckBox, SLOT("setEnabled(bool)")) //! [11] //! [12] registerField("className*", classNameLineEdit) registerField("baseClass", baseClassLineEdit) registerField("qobjectMacro", qobjectMacroCheckBox) //! [11] registerField("qobjectCtor", qobjectCtorRadioButton) registerField("qwidgetCtor", qwidgetCtorRadioButton) registerField("defaultCtor", defaultCtorRadioButton) registerField("copyCtor", copyCtorCheckBox) groupBoxLayout = QVBoxLayout() //! [12] groupBoxLayout.addWidget(qobjectCtorRadioButton) groupBoxLayout.addWidget(qwidgetCtorRadioButton) groupBoxLayout.addWidget(defaultCtorRadioButton) groupBoxLayout.addWidget(copyCtorCheckBox) groupBox.setLayout(groupBoxLayout) layout = QGridLayout() layout.addWidget(classNameLabel, 0, 0) layout.addWidget(classNameLineEdit, 0, 1) layout.addWidget(baseClassLabel, 1, 0) layout.addWidget(baseClassLineEdit, 1, 1) layout.addWidget(qobjectMacroCheckBox, 2, 0, 1, 2) layout.addWidget(groupBox, 3, 0, 1, 2) self.setLayout(layout) //! [13] //! [13] //! [14] class CodeStylePage(QWizardPage): def __init__(self, parent): QWizardPage.__init__(self, parent) self.setTitle(tr("Code Style Options")) self.setSubTitle(tr("Choose the formatting of the generated code.")) self.setPixmap(QWizard.LogoPixmap, QPixmap(":/images/logo2.png")) commentCheckBox = QCheckBox(self.tr("&Start generated files with a comment")) //! [14] commentCheckBox.setChecked(True) protectCheckBox = QCheckBox(self.tr("&Protect header file against multiple " \ "inclusions")) protectCheckBox.setChecked(True) macroNameLabel = QLabel(self.tr("&Macro name:")) macroNameLineEdit = QLineEdit() macroNameLabel.setBuddy(macroNameLineEdit) includeBaseCheckBox = QCheckBox(self.tr("&Include base class definition")) baseIncludeLabel = QLabel(self.tr("Base class include:")) baseIncludeLineEdit = QLineEdit() baseIncludeLabel.setBuddy(baseIncludeLineEdit) self.connect(protectCheckBox, SIGNAL("toggled(bool)"), macroNameLabel, SLOT("setEnabled(bool)")) self.connect(protectCheckBox, SIGNAL("toggled(bool)"), macroNameLineEdit, SLOT("setEnabled(bool)")) self.connect(includeBaseCheckBox, SIGNAL("toggled(bool)"), baseIncludeLabel, SLOT("setEnabled(bool)")) self.connect(includeBaseCheckBox, SIGNAL(toggled(bool)), baseIncludeLineEdit, SLOT("setEnabled(bool)")) self.registerField("comment", commentCheckBox) self.registerField("protect", protectCheckBox) self.registerField("macroName", macroNameLineEdit) self.registerField("includeBase", includeBaseCheckBox) self.registerField("baseInclude", baseIncludeLineEdit) layout = QGridLayout() layout.setColumnMinimumWidth(0, 20) layout.addWidget(commentCheckBox, 0, 0, 1, 3) layout.addWidget(protectCheckBox, 1, 0, 1, 3) layout.addWidget(macroNameLabel, 2, 1) layout.addWidget(macroNameLineEdit, 2, 2) layout.addWidget(includeBaseCheckBox, 3, 0, 1, 3) layout.addWidget(baseIncludeLabel, 4, 1) layout.addWidget(baseIncludeLineEdit, 4, 2) //! [15] self.setLayout(layout) } //! [15] //! [16] def initializePage(self): className = self.field("className") self.macroNameLineEdit.setText(className.upper() + "_H") baseClass = self.field("baseClass") self.includeBaseCheckBox.setChecked(len(baseClass)) self.includeBaseCheckBox.setEnabled(len(baseClass)) self.baseIncludeLabel.setEnabled(len(baseClass)) self.baseIncludeLineEdit.setEnabled(len(baseClass)) if not baseClass: self.baseIncludeLineEdit.clear() elsif QRegExp("Q[A-Z].*").exactMatch(baseClass): baseIncludeLineEdit.setText("<" + baseClass + ">") else: baseIncludeLineEdit.setText("\"" + baseClass.lower() + ".h\"") //! [16] //! [17] def initializePage(self): className = field("className") self.headerLineEdit.setText(className.lower() + ".h") self.implementationLineEdit.setText(className.lower() + ".cpp") self.outputDirLineEdit.setText(QDir.convertSeparators(QDir.tempPath())) //! [17] ================================================ FILE: doc/codesnippets/examples/dialogs/classwizard/classwizard.qrc ================================================ <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>images/background.png</file> <file>images/banner.png</file> <file>images/logo1.png</file> <file>images/logo2.png</file> <file>images/logo3.png</file> <file>images/watermark1.png</file> <file>images/watermark2.png</file> </qresource> </RCC> ================================================ FILE: doc/codesnippets/examples/dialogs/classwizard/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QApplication> #include <QTranslator> #include <QLocale> #include <QLibraryInfo> #include "classwizard.h" int main(int argc, char *argv[]) { Q_INIT_RESOURCE(classwizard); QApplication app(argc, argv); QString translatorFileName = QLatin1String("qt_"); translatorFileName += QLocale::system().name(); QTranslator *translator = new QTranslator(&app); if (translator->load(translatorFileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) app.installTranslator(translator); ClassWizard wizard; wizard.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/examples/dialogs/extension/finddialog.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the example classes of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ from PySide.QtGui import * //! [0] def __init__(self, parent): QDialog.__init__(self, parent) label = QLabel(self.tr("Find &what:")) lineEdit = QLineEdit() label.setBuddy(lineEdit) caseCheckBox = QCheckBox(self.tr("Match &case")) fromStartCheckBox = QCheckBox(self.tr("Search from &start")) fromStartCheckBox.setChecked(True) //! [1] findButton = QPushButton(self.tr("&Find")) findButton.setDefault(True) moreButton = QPushButton(self.tr("&More")) moreButton.setCheckable(True) //! [0] moreButton.setAutoDefault(False) buttonBox = QDialogButtonBox(Qt.Vertical) buttonBox.addButton(findButton, QDialogButtonBox.ActionRole) buttonBox.addButton(moreButton, QDialogButtonBox.ActionRole) //! [1] //! [2] extension = QWidget() wholeWordsCheckBox = QCheckBox(self.tr("&Whole words")) backwardCheckBox = QCheckBox(self.tr("Search &backward")) searchSelectionCheckBox = QCheckBox(self.tr("Search se&lection")) //! [2] //! [3] connect(moreButton, SIGNAL("toggled(bool)"), extension, SLOT("setVisible(bool)")) extensionLayout = QVBoxLayout() extensionLayout.setMargin(0) extensionLayout.addWidget(wholeWordsCheckBox) extensionLayout.addWidget(backwardCheckBox) extensionLayout.addWidget(searchSelectionCheckBox) extension.setLayout(extensionLayout) //! [3] //! [4] topLeftLayout = QHBoxLayout() topLeftLayout.addWidget(label) topLeftLayout.addWidget(lineEdit) leftLayout = QVBoxLayout() leftLayout.addLayout(topLeftLayout) leftLayout.addWidget(caseCheckBox) leftLayout.addWidget(fromStartCheckBox) leftLayout.addSself.tretch(1) mainLayout = QGridLayout() mainLayout.setSizeConsself.traint(QLayout.SetFixedSize) mainLayout.addLayout(leftLayout, 0, 0) mainLayout.addWidget(buttonBox, 0, 1) mainLayout.addWidget(extension, 1, 0, 1, 2) setLayout(mainLayout) setWindowTitle(self.tr("Extension")) //! [4] //! [5] extension.hide() //! [5] ================================================ FILE: doc/codesnippets/examples/dialogs/licensewizard/licensewizard.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QtGui> #include "licensewizard.h" //! [0] //! [1] //! [2] # class LicenseWizard def __init__(self, parent) QWizard(self, parent) //! [0] self.setPage(self.Page_Intro, IntroPage()) self.setPage(self.Page_Evaluate, EvaluatePage()) self.setPage(self.Page_Register, RegisterPage()) self.setPage(self.Page_Details, DetailsPage()) self.setPage(self.Page_Conclusion, ConclusionPage()) //! [1] self.setStartId(self.Page_Intro); //! [2] //! [3] //! [3] //! [4] self.setWizardStyle(QWizard.ModernStyle); //! [4] //! [5] self.setOption(HaveHelpButton, True); //! [5] //! [6] self.setPixmap(QWizard.LogoPixmap, QPixmap(":/images/logo.png")); //! [7] connect(this, SIGNAL(helpRequested()), this, SLOT(showHelp())); //! [7] setWindowTitle(tr("License Wizard")); //! [8] } //! [6] //! [8] //! [9] //! [10] void LicenseWizard::showHelp() //! [9] //! [11] { static QString lastHelpMessage; message = "" switch (currentId()) { case Page_Intro: message = tr("The decision you make here will affect which page you " "get to see next."); break; //! [10] //! [11] case Page_Evaluate: message = tr("Make sure to provide a valid email address, such as " "toni.buddenbrook@example.de."); break; case Page_Register: message = tr("If you don't provide an upgrade key, you will be " "asked to fill in your details."); break; case Page_Details: message = tr("Make sure to provide a valid email address, such as " "thomas.gradgrind@example.co.uk."); break; case Page_Conclusion: message = tr("You must accept the terms and conditions of the " "license to proceed."); break; //! [12] //! [13] default: message = tr("This help is likely not to be of any help."); } //! [12] if (lastHelpMessage == message) message = tr("Sorry, I already gave what help I could. " "Maybe you should try asking a human?"); //! [14] QMessageBox::information(this, tr("License Wizard Help"), message); //! [14] lastHelpMessage = message; //! [15] } //! [13] //! [15] //! [16] IntroPage::IntroPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Introduction")); setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark.png")); topLabel = new QLabel(tr("This wizard will help you register your copy of " "<i>Super Product One</i>™ or start " "evaluating the product.")); topLabel->setWordWrap(true); registerRadioButton = new QRadioButton(tr("&Register your copy")); evaluateRadioButton = new QRadioButton(tr("&Evaluate the product for 30 " "days")); registerRadioButton->setChecked(true); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(topLabel); layout->addWidget(registerRadioButton); layout->addWidget(evaluateRadioButton); setLayout(layout); } //! [16] //! [17] //! [18] # class IntroPage def nextId(self): //! [17] //! [19] if evaluateRadioButton.isChecked(): return LicenseWizard.Page_Evaluate else: return LicenseWizard.Page_Register //! [18] //! [19] //! [20] EvaluatePage::EvaluatePage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Evaluate <i>Super Product One</i>™")); setSubTitle(tr("Please fill both fields. Make sure to provide a valid " "email address (e.g., john.smith@example.com).")); nameLabel = new QLabel(tr("N&ame:")); nameLineEdit = new QLineEdit; //! [20] nameLabel->setBuddy(nameLineEdit); emailLabel = new QLabel(tr("&Email address:")); emailLineEdit = new QLineEdit; emailLineEdit->setValidator(new QRegExpValidator(QRegExp(".*@.*"), this)); emailLabel->setBuddy(emailLineEdit); //! [21] registerField("evaluate.name*", nameLineEdit); registerField("evaluate.email*", emailLineEdit); //! [21] QGridLayout *layout = new QGridLayout; layout->addWidget(nameLabel, 0, 0); layout->addWidget(nameLineEdit, 0, 1); layout->addWidget(emailLabel, 1, 0); layout->addWidget(emailLineEdit, 1, 1); setLayout(layout); //! [22] } //! [22] //! [23] # class EvaluatePage def nextId(self): return LicenseWizard.Page_Conclusion //! [23] RegisterPage::RegisterPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Register Your Copy of <i>Super Product One</i>™")); setSubTitle(tr("If you have an upgrade key, please fill in " "the appropriate field.")); nameLabel = new QLabel(tr("N&ame:")); nameLineEdit = new QLineEdit; nameLabel->setBuddy(nameLineEdit); upgradeKeyLabel = new QLabel(tr("&Upgrade key:")); upgradeKeyLineEdit = new QLineEdit; upgradeKeyLabel->setBuddy(upgradeKeyLineEdit); registerField("register.name*", nameLineEdit); registerField("register.upgradeKey", upgradeKeyLineEdit); QGridLayout *layout = new QGridLayout; layout->addWidget(nameLabel, 0, 0); layout->addWidget(nameLineEdit, 0, 1); layout->addWidget(upgradeKeyLabel, 1, 0); layout->addWidget(upgradeKeyLineEdit, 1, 1); setLayout(layout); } //! [24] # class RegisterPage def nextId(self): if self.upgradeKeyLineEdit.text().isEmpty(): return LicenseWizard::Page_Details else: return LicenseWizard::Page_Conclusion //! [24] DetailsPage::DetailsPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Fill In Your Details")); setSubTitle(tr("Please fill all three fields. Make sure to provide a valid " "email address (e.g., tanaka.aya@example.co.jp).")); companyLabel = new QLabel(tr("&Company name:")); companyLineEdit = new QLineEdit; companyLabel->setBuddy(companyLineEdit); emailLabel = new QLabel(tr("&Email address:")); emailLineEdit = new QLineEdit; emailLineEdit->setValidator(new QRegExpValidator(QRegExp(".*@.*"), this)); emailLabel->setBuddy(emailLineEdit); postalLabel = new QLabel(tr("&Postal address:")); postalLineEdit = new QLineEdit; postalLabel->setBuddy(postalLineEdit); registerField("details.company*", companyLineEdit); registerField("details.email*", emailLineEdit); registerField("details.postal*", postalLineEdit); QGridLayout *layout = new QGridLayout; layout->addWidget(companyLabel, 0, 0); layout->addWidget(companyLineEdit, 0, 1); layout->addWidget(emailLabel, 1, 0); layout->addWidget(emailLineEdit, 1, 1); layout->addWidget(postalLabel, 2, 0); layout->addWidget(postalLineEdit, 2, 1); setLayout(layout); } //! [25] # class DetailsPage def nextId(self): return LicenseWizard.Page_Conclusion //! [25] ConclusionPage::ConclusionPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Complete Your Registration")); setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark.png")); bottomLabel = new QLabel; bottomLabel->setWordWrap(true); agreeCheckBox = new QCheckBox(tr("I agree to the terms of the license")); registerField("conclusion.agree*", agreeCheckBox); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(bottomLabel); layout->addWidget(agreeCheckBox); setLayout(layout); } //! [26] #class ConclusionPage def nextId(self): return -1 //! [26] //! [27] # class ConclusionPage def initializePage(self): if wizard().hasVisitedPage(LicenseWizard::Page_Evaluate): licenseText = self.tr("<u>Evaluation License Agreement:</u> " \ "You can use this software for 30 days and make one " \ "backup, but you are not allowed to distribute it.") elsif wizard().hasVisitedPage(LicenseWizard.Page_Details): licenseText = self.tr("<u>First-Time License Agreement:</u> " \ "You can use this software subject to the license " \ "you will receive by email.") else: licenseText = self.tr("<u>Upgrade License Agreement:</u> " \ "This software is licensed under the terms of your " \ "current license.") } bottomLabel.setText(licenseText) //! [27] //! [28] void ConclusionPage::setVisible(bool visible) { QWizardPage::setVisible(visible); if (visible) { //! [29] self.wizard().setButtonText(QWizard.CustomButton1, self.tr("&Print")) self.wizard().setOption(QWizard.HaveCustomButton1, True) self.connect(wizard(), SIGNAL("customButtonClicked(int)"), self, SLOT("printButtonClicked()")) //! [29] } else { wizard()->setOption(QWizard::HaveCustomButton1, false); disconnect(wizard(), SIGNAL(customButtonClicked(int)), this, SLOT(printButtonClicked())); } } //! [28] void ConclusionPage::printButtonClicked() { QPrinter printer; QPrintDialog dialog(&printer, this); if (dialog.exec()) QMessageBox::warning(this, tr("Print License"), tr("As an environmentally friendly measure, the " "license text will not actually be printed.")); } ================================================ FILE: doc/codesnippets/examples/dialogs/licensewizard/licensewizard.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef LICENSEWIZARD_H #define LICENSEWIZARD_H #include <QWizard> QT_BEGIN_NAMESPACE class QCheckBox; class QLabel; class QLineEdit; class QRadioButton; QT_END_NAMESPACE //! [0] //! [1] class LicenseWizard (QWizard): //! [0] //! [2] Page_Intro = 1 Page_Evaluate = 2 Page_Register = 3 Page_Details = 4 Page_Conclusion = 5 //! [2] def __init__(self, parent): ... def showHelp(self): ... //! [3] //! [1] //! [3] //! [4] class IntroPage : public QWizardPage { Q_OBJECT public: IntroPage(QWidget *parent = 0); int nextId() const; private: QLabel *topLabel; QRadioButton *registerRadioButton; QRadioButton *evaluateRadioButton; }; //! [4] //! [5] class EvaluatePage : public QWizardPage { Q_OBJECT public: EvaluatePage(QWidget *parent = 0); int nextId() const; private: QLabel *nameLabel; QLabel *emailLabel; QLineEdit *nameLineEdit; QLineEdit *emailLineEdit; }; //! [5] class RegisterPage : public QWizardPage { Q_OBJECT public: RegisterPage(QWidget *parent = 0); int nextId() const; private: QLabel *nameLabel; QLabel *upgradeKeyLabel; QLineEdit *nameLineEdit; QLineEdit *upgradeKeyLineEdit; }; class DetailsPage : public QWizardPage { Q_OBJECT public: DetailsPage(QWidget *parent = 0); int nextId() const; private: QLabel *companyLabel; QLabel *emailLabel; QLabel *postalLabel; QLineEdit *companyLineEdit; QLineEdit *emailLineEdit; QLineEdit *postalLineEdit; }; //! [6] class ConclusionPage : public QWizardPage { Q_OBJECT public: ConclusionPage(QWidget *parent = 0); void initializePage(); int nextId() const; void setVisible(bool visible); private slots: void printButtonClicked(); private: QLabel *bottomLabel; QCheckBox *agreeCheckBox; }; //! [6] #endif ================================================ FILE: doc/codesnippets/examples/dialogs/licensewizard/licensewizard.qrc ================================================ <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>images/logo.png</file> <file>images/watermark.png</file> </qresource> </RCC> ================================================ FILE: doc/codesnippets/examples/dialogs/licensewizard/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QApplication> #include <QTranslator> #include <QLocale> #include <QLibraryInfo> #include "licensewizard.h" int main(int argc, char *argv[]) { Q_INIT_RESOURCE(licensewizard); QApplication app(argc, argv); QString translatorFileName = QLatin1String("qt_"); translatorFileName += QLocale::system().name(); QTranslator *translator = new QTranslator(&app); if (translator->load(translatorFileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) app.installTranslator(translator); LicenseWizard wizard; wizard.show(); return app.exec(); } ================================================ FILE: doc/codesnippets/examples/dialogs/standarddialogs/dialog.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the example classes of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] i = QInputDialog().getInteger(self, self.tr("QInputDialog().getInteger()"), self.tr("Percentage:"), 25, 0, 100, 1, ok) if ok: self.integerLabel.setText(self.tr("%1%").arg(i)) //! [0] //! [1] d = QInputDialog().getDouble(self, self.tr("QInputDialog().getDouble()"), self.tr("Amount:"), 37.56, -10000, 10000, 2, ok) if ok: doubleLabel.setText(QString("$%1").arg(d)) //! [1] //! [2] items = [self.tr("Spring"), self.tr("Summer"), self.tr("Fall"), self.tr("Winter")] item = QInputDialog().getItem(self, self.tr("QInputDialog().getItem()"), selftr("Season:"), items, 0, False, ok) if ok and not item.isEmpty(): itemLabel.setText(item) //! [2] //! [3] text = QInputDialog::getText(self, self.tr("QInputDialog().getText()"), self.tr("User name:"), QLineEdit.Normal, QDir().home().dirName(), ok) if ok and text: textLabel.setText(text) //! [3] ================================================ FILE: doc/codesnippets/examples/dialogs/tabdialog/tabdialog.cpp ================================================ //! [0] class TabDialog (QDialog): def __init__(self, fileName, parent = None): QDialog.__init__(self, parent) fileInfo = QFileInfo(fileName) self.tabWidget = QTabWidget() self.tabWidget.addTab(GeneralTab(fileInfo), "General") self.tabWidget.addTab(PermissionsTab(fileInfo), "Permissions") self.tabWidget.addTab(ApplicationsTab(fileInfo), "Applications") //! [0] //! [1] //! [2] self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok //! [1] //! [3] | QDialogButtonBox.Cancel) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) //! [2] //! [3] //! [4] mainLayout = QVBoxLayout() mainLayout.addWidget(tabWidget) mainLayout.addWidget(buttonBox) self.setLayout(mainLayout) //! [4] //! [5] self.setWindowTitle("Tab Dialog") //! [5] //! [6] class GeneralTab (QWidget): def __init__(self, fileInfo, parent = None): QWidget.__init__(self, parent) fileNameLabel = QLabel("File Name:") fileNameEdit = QLineEdit(fileInfo.fileName()) pathLabel = QLabel("Path:") pathValueLabel = QLabel(fileInfo.absoluteFilePath()) pathValueLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken) sizeLabel = QLabel("Size:") size = fileInfo.size()/1024 sizeValueLabel = QLabel("%d K" % size) sizeValueLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken) lastReadLabel = QLabel("Last Read:") lastReadValueLabel = QLabel(fileInfo.lastRead().toString()) lastReadValueLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken) lastModLabel = QLabel("Last Modified:") lastModValueLabel = QLabel(fileInfo.lastModified().toString()) lastModValueLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken) mainLayout = QVBoxLayout() mainLayout.addWidget(fileNameLabel) mainLayout.addWidget(fileNameEdit) mainLayout.addWidget(pathLabel) mainLayout.addWidget(pathValueLabel) mainLayout.addWidget(sizeLabel) mainLayout.addWidget(sizeValueLabel) mainLayout.addWidget(lastReadLabel) mainLayout.addWidget(lastReadValueLabel) mainLayout.addWidget(lastModLabel) mainLayout.addWidget(lastModValueLabel) mainLayout.addStretch(1) self.setLayout(mainLayout) //! [6] //! [7] class PermissionsTab (QWidget): def __init__(self, fileInfo, parent = None): QWidget.__init__(self, parent) permissionsGroup = QGroupBox("Permissions") readable = QCheckBox("Readable") if fileInfo.isReadable(): readable.setChecked(True) writable = QCheckBox("Writable") if fileInfo.isWritable(): writable.setChecked(True) executable = QCheckBox("Executable") if fileInfo.isExecutable(): executable.setChecked(True) ownerGroup = QGroupBox("Ownership") ownerLabel = QLabel("Owner") ownerValueLabel = QLabel(fileInfo.owner()) ownerValueLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken) groupLabel = QLabel("Group") groupValueLabel = QLabel(fileInfo.group()) groupValueLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken) permissionsLayout = QVBoxLayout() permissionsLayout.addWidget(readable) permissionsLayout.addWidget(writable) permissionsLayout.addWidget(executable) permissionsGroup.setLayout(permissionsLayout) ownerLayout = QVBoxLayout() ownerLayout.addWidget(ownerLabel) ownerLayout.addWidget(ownerValueLabel) ownerLayout.addWidget(groupLabel) ownerLayout.addWidget(groupValueLabel) ownerGroup.setLayout(ownerLayout) mainLayout = QVBoxLayout() mainLayout.addWidget(permissionsGroup) mainLayout.addWidget(ownerGroup) mainLayout.addStretch(1) self.setLayout(mainLayout) //! [7] //! [8] class ApplicationsTab (QWidget): def __init__(self, fileInfo, parent = None): QWidget.__init__(self, parent) topLabel = QLabel("Open with:") applicationsListBox = QListWidget() applications = [] for i in range(30): applications.append("Application %d" %s i) applicationsListBox.insertItems(0, applications) if fileInfo.suffix().isEmpty(): alwaysCheckBox = QCheckBox("Always use this application to open this type of file") else: alwaysCheckBox = QCheckBox("Always use this application to open files with the extension '%s'" % fileInfo.suffix()) layout = QVBoxLayout() layout.addWidget(topLabel) layout.addWidget(applicationsListBox) layout.addWidget(alwaysCheckBox) self.setLayout(layout) //! [8] ================================================ FILE: doc/codesnippets/examples/dialogs/trivialwizard/trivialwizard.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QtGui> #include <QTranslator> #include <QLocale> #include <QLibraryInfo> //! [0] //! [1] def createIntroPage(self): page = QWizardPage() page.setTitle("Introduction") label = QLabel("This wizard will help you register your copy of Super Product Two.") label.setWordWrap(True) layout = QVBoxLayout() layout.addWidget(label) page.setLayout(layout) return page //! [0] //! [2] QWizardPage *createRegistrationPage() //! [1] //! [3] //! [3] QWizardPage *page = new QWizardPage; page->setTitle("Registration"); page->setSubTitle("Please fill both fields."); QLabel *nameLabel = new QLabel("Name:"); QLineEdit *nameLineEdit = new QLineEdit; QLabel *emailLabel = new QLabel("Email address:"); QLineEdit *emailLineEdit = new QLineEdit; QGridLayout *layout = new QGridLayout; layout->addWidget(nameLabel, 0, 0); layout->addWidget(nameLineEdit, 0, 1); layout->addWidget(emailLabel, 1, 0); layout->addWidget(emailLineEdit, 1, 1); page->setLayout(layout); return page; //! [4] //! [2] //! [4] //! [5] //! [6] def createConclusionPage(self): //! [5] //! [7] //! [7] QWizardPage *page = new QWizardPage; page->setTitle("Conclusion"); QLabel *label = new QLabel("You are now successfully registered. Have a " "nice day!"); label->setWordWrap(true); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(label); page->setLayout(layout); return page; //! [8] //! [6] //! [8] //! [9] //! [10] //! [9] //! [11] def main(): app = QApplication(sys.argv) translatorFileName = "qt_" translatorFileName += QLocale.system().name() translator = QTranslator(app) if translator.load(translatorFileName, QLibraryInfo.location(QLibraryInfo.TranslationsPath)): app.installTranslator(translator) wizard = QWizard() wizard.addPage(createIntroPage()) wizard.addPage(createRegistrationPage()) wizard.addPage(createConclusionPage()) wizard.setWindowTitle("Trivial Wizard") wizard.show() return app.exec_() if __name__ == "__main__": main() //! [10] //! [11] ================================================ FILE: doc/codesnippets/examples/graphicsview/simpleanchorlayout/main.cpp ================================================ //! [adding a corner anchor in two steps] layout.addAnchor(a, Qt.AnchorTop, layout, Qt.AnchorTop) layout.addAnchor(a, Qt.AnchorLeft, layout, Qt.AnchorLeft) //! [adding a corner anchor in two steps] //! [adding a corner anchor] layout.addCornerAnchors(a, Qt.TopLeftCorner, layout, Qt.TopLeftCorner) //! [adding a corner anchor] //! [adding anchors] layout.addAnchor(b, Qt.AnchorLeft, a, Qt.AnchorRight) layout.addAnchor(b, Qt.AnchorTop, a, Qt.AnchorBottom) //! [adding anchors] //! [adding anchors to match sizes in two steps] layout.addAnchor(b, Qt.AnchorLeft, c, Qt.AnchorLeft) layout.addAnchor(b, Qt.AnchorRight, c, Qt.AnchorRight) //! [adding anchors to match sizes in two steps] //! [adding anchors to match sizes] layout.addAnchors(b, c, Qt.Horizontal) //! [adding anchors to match sizes] ================================================ FILE: doc/codesnippets/examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the example classes of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] def __init__(self, parent): QSortFilterProxyModel.__init__(self, parent) //! [0] //! [1] def setFilterMinimumDate(self, date): self.minDate = date self.invalidateFilter() //! [1] //! [2] def setFilterMaximumDate(self, date): self.maxDate = date self.invalidateFilter() //! [2] //! [3] def filterAcceptsRow(self, sourceRow, sourceParent): index0 = sourceModel().index(sourceRow, 0, sourceParent) index1 = sourceModel().index(sourceRow, 1, sourceParent) index2 = sourceModel().index(sourceRow, 2, sourceParent) regex = filterRegExp() return (regex.indexIn(sourceModel().data(index0)) != -1 or regex.indexIn(sourceModel().data(index1)) != -1 and dateInRange(sourceModel().data(index2)) //! [3] //! [4] //! [5] def lessThan(self, left, right): leftData = sourceModel().data(left) rightData = sourceModel().data(right) //! [4] //! [6] if isinstance(leftData, QDateTime): return leftData < rightData else: emailPattern = QRegExp("([\\w\\.]*@[\\w\\.]*)") if left.column() == 1 && emailPattern.indexIn(leftData) != -1: leftData = emailPattern.cap(1) if right.column() == 1 && emailPattern.indexIn(rightData) != -1: rightData = emailPattern.cap(1) return leftString < rightString //! [5] //! [6] //! [7] def dateInRange(self, date): return (!minDate.isValid() || date > minDate) && (!maxDate.isValid() || date < maxDate) //! [7] ================================================ FILE: doc/codesnippets/examples/itemviews/pixelator/pixeldelegate.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the example classes of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //! [0] def __init__(self, parent): QAbstractItemDelegate.__init__(self, parent) self.pixelSize = 12 //! [0] //! [1] def paint(self, painter, option, index): //! [2] if option.state and QStyle.State_Selected: painter.fillRect(option.rect, option.palette.highlight()) //! [1] //! [3] size = qMin(option.rect.width(), option.rect.height()) //! [3] //! [4] brightness = index.model().data(index, Qt.DisplayRole).toInt() radius = (size/2.0) - (brightness/255.0 * size/2.0) if radius == 0.0: return //! [4] //! [5] painter.save() //! [5] //! [6] painter.setRenderHint(QPainter.Antialiasing, true) //! [6] //! [7] painter.setPen(Qt.NoPen) //! [7] //! [8] if option.state and QStyle.State_Selected: //! [8] //! [9] painter.setBrush(option.palette.highlightedText()) else //! [2] painter.setBrush(QBrush(Qt.black)) //! [9] //! [10] painter.drawEllipse(QRectF(option.rect.x() + option.rect.width()/2 - radius, option.rect.y() + option.rect.height()/2 - radius, 2*radius, 2*radius)) painter.restore() //! [10] //! [11] def sizeHint(self, option, index): return QSize(self.pixelSize, self.pixelSize) //! [11] //! [12] def setPixelSize(self, size): self.pixelSize = size //! [12] ================================================ FILE: doc/codesnippets/examples/itemviews/simpledommodel/dommodel.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QtGui> #include <QtXml> #include "domitem.h" #include "dommodel.h" //! [0] DomModel::DomModel(QDomDocument document, QObject *parent) : QAbstractItemModel(parent), domDocument(document) { rootItem = new DomItem(domDocument, 0); } //! [0] //! [1] DomModel::~DomModel() { delete rootItem; } //! [1] //! [2] def columnCount(self, parent): return 3 //! [2] //! [3] QVariant DomModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (role != Qt::DisplayRole) return QVariant(); DomItem *item = static_cast<DomItem*>(index.internalPointer()); QDomNode node = item->node(); //! [3] //! [4] QStringList attributes; QDomNamedNodeMap attributeMap = node.attributes(); switch (index.column()) { case 0: return node.nodeName(); case 1: for (int i = 0; i < attributeMap.count(); ++i) { QDomNode attribute = attributeMap.item(i); attributes << attribute.nodeName() + "=\"" +attribute.nodeValue() + "\""; } return attributes.join(" "); case 2: return node.nodeValue().split("\n").join(" "); default: return QVariant(); } } //! [4] //! [5] Qt::ItemFlags DomModel::flags(const QModelIndex &index) const { if (!index.isValid()) return 0; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } //! [5] //! [6] QVariant DomModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { switch (section) { case 0: return tr("Name"); case 1: return tr("Attributes"); case 2: return tr("Value"); default: return QVariant(); } } return QVariant(); } //! [6] //! [7] QModelIndex DomModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); DomItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast<DomItem*>(parent.internalPointer()); //! [7] //! [8] DomItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex(); } //! [8] //! [9] QModelIndex DomModel::parent(const QModelIndex &child) const { if (!child.isValid()) return QModelIndex(); DomItem *childItem = static_cast<DomItem*>(child.internalPointer()); DomItem *parentItem = childItem->parent(); if (!parentItem || parentItem == rootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } //! [9] //! [10] int DomModel::rowCount(const QModelIndex &parent) const { if (parent.column() > 0) return 0; DomItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast<DomItem*>(parent.internalPointer()); return parentItem->node().childNodes().count(); } //! [10] ================================================ FILE: doc/codesnippets/examples/linguist/hellotr/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QApplication> #include <QPushButton> //! [0] from PySide.QtCore import QTranslator //! [0] //! [1] //! [2] def main(args): //! [1] //! [3] //! [4] app = QApplication(args) //! [3] //! [5] translator = QTranslator() //! [5] //! [6] translator.load("hellotr_la") //! [6] //! [7] app.installTranslator(translator) //! [4] //! [7] //! [8] hello = QPushButton(QPushButton.tr("Hello world!")) //! [8] hello.resize(100, 30) hello.show() return app.exec_() //! [2] ================================================ FILE: doc/codesnippets/examples/mainwindows/application/mainwindow.cpp ================================================ ###################################### # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # Contact: http://www.qt-project.org/legal # # This file is part of the example classes of the Qt Toolkit. # # $QT_BEGIN_LICENSE:LGPL$ # Commercial License Usage # Licensees holding valid commercial Qt licenses may use this file in # accordance with the commercial license agreement provided with the # Software or, alternatively, in accordance with the terms contained in # a written agreement between you and Digia. For licensing terms and # conditions see http://qt.digia.com/licensing. For further information # use the contact form at http://qt.digia.com/contact-us. # # GNU Lesser General Public License Usage # Alternatively, this file may be used under the terms of the GNU Lesser # General Public License version 2.1 as published by the Free Software # Foundation and appearing in the file LICENSE.LGPL included in the # packaging of this file. Please review the following information to # ensure the GNU Lesser General Public License version 2.1 requirements # will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. # # In addition, as a special exception, Digia gives you certain additional # rights. These rights are described in the Digia Qt LGPL Exception # version 1.1, included in the file LGPL_EXCEPTION.txt in this package. # # GNU General Public License Usage # Alternatively, this file may be used under the terms of the GNU # General Public License version 3.0 as published by the Free Software # Foundation and appearing in the file LICENSE.GPL included in the # packaging of this file. Please review the following information to # ensure the GNU General Public License version 3.0 requirements will be # met: http://www.gnu.org/copyleft/gpl.html. # # # $QT_END_LICENSE$ # ###################################### //! [0] from PySide.QtGui import * //! [0] //! [1] def __init__(self): QMainWindow.__init__(self) //! [1] //! [2] textEdit = QPlainTextEdit() setCentralWidget(textEdit) createActions() createMenus() createToolBars() createStatusBar() readSettings() connect(textEdit.document(), SIGNAL("contentsChanged()"), self, SLOT("documentWasModified()")) setCurrentFile("") setUnifiedTitleAndToolBarOnMac(True) //! [2] //! [3] def closeEvent(self, event): //! [3] //! [4] if maybeSave(): writeSettings() event.accept() else: event.ignore() //! [4] //! [5] def File(self): //! [5] //! [6] if maybeSave(): textEdit.clear() setCurrentFile("") //! [6] //! [7] def open(self): //! [7] //! [8] if maybeSave(): fileName = QFileDialog.getOpenFileName(self) if !fileName.isEmpty(): loadFile(fileName) //! [8] //! [9] def save(self): //! [9] //! [10] if curFile.isEmpty(): return saveAs() else: return saveFile(curFile) //! [10] //! [11] def saveAs(self): //! [11] //! [12] fileName = QFileDialog.getSaveFileName(self) if fileName.isEmpty(): return False return saveFile(fileName) //! [12] //! [13] def about(self): //! [13] //! [14] QMessageBox.about(self, tr("About Application"), tr("The <b>Application</b> example demonstrates how to " "write modern GUI applications using Qt, with a menu bar, " "toolbars, and a status bar.")) //! [14] //! [15] def documentWasModified(self): //! [15] //! [16] setWindowModified(textEdit.document().isModified()) //! [16] //! [17] def MainWindow.createActions(self): //! [17] //! [18] Act = QAction(QIcon(":/images/new.png"), tr("&New"), self) Act.setShortcuts(QKeySequence.New) Act.setStatusTip(tr("Create a new file")) connect(Act, SIGNAL("triggered()"), self, SLOT("newFile()")) //! [19] openAct = QAction(QIcon(":/images/open.png"), tr("&Open..."), self) openAct.setShortcuts(QKeySequence.Open) openAct.setStatusTip(tr("Open an existing file")) connect(openAct, SIGNAL("triggered()"), self, SLOT("open()")) //! [18] //! [19] saveAct = QAction(QIcon(":/images/save.png"), tr("&Save"), self) saveAct.setShortcuts(QKeySequence.Save) saveAct.setStatusTip(tr("Save the document to disk")) connect(saveAct, SIGNAL("triggered()"), self, SLOT("save()")) saveAsAct = QAction(tr("Save &As..."), self) saveAsAct.setShortcuts(QKeySequence.SaveAs) saveAsAct.setStatusTip(tr("Save the document under a name")) connect(saveAsAct, SIGNAL("triggered()"), self, SLOT("saveAs()")) //! [20] exitAct = QAction(tr("E&xit"), self) exitAct.setShortcut(tr("Ctrl+Q")) //! [20] exitAct.setStatusTip(tr("Exit the application")) connect(exitAct, SIGNAL("triggered()"), self, SLOT("close()")) //! [21] cutAct = QAction(QIcon(":/images/cut.png"), tr("Cu&t"), self) //! [21] cutAct.setShortcuts(QKeySequence.Cut) cutAct.setStatusTip(tr("Cut the current selection's contents to the " "clipboard")) connect(cutAct, SIGNAL("triggered()"), textEdit, SLOT("cut()")) copyAct = QAction(QIcon(":/images/copy.png"), tr("&Copy"), self) copyAct.setShortcuts(QKeySequence.Copy) copyAct.setStatusTip(tr("Copy the current selection's contents to the " "clipboard")) connect(copyAct, SIGNAL("triggered()"), textEdit, SLOT("copy()")) pasteAct = QAction(QIcon(":/images/paste.png"), tr("&Paste"), self) pasteAct.setShortcuts(QKeySequence.Paste) pasteAct.setStatusTip(tr("Paste the clipboard's contents into the current " "selection")) connect(pasteAct, SIGNAL("triggered()"), textEdit, SLOT("paste()")) aboutAct = QAction(tr("&About"), self) aboutAct.setStatusTip(tr("Show the application's About box")) connect(aboutAct, SIGNAL("triggered()"), self, SLOT("about()")) //! [22] aboutQtAct = QAction(tr("About &Qt"), self) aboutQtAct.setStatusTip(tr("Show the Qt library's About box")) connect(aboutQtAct, SIGNAL("triggered()"), qApp, SLOT("aboutQt()")) //! [22] //! [23] cutAct.setEnabled(False) //! [23] //! [24] copyAct.setEnabled(False) connect(textEdit, SIGNAL("copyAvailable(bool)"), cutAct, SLOT("setEnabled(bool)")) connect(textEdit, SIGNAL("copyAvailable(bool)"), copyAct, SLOT("setEnabled(bool)")) } //! [24] //! [25] //! [26] def createMenus(self): //! [25] //! [27] fileMenu = menuBar().addMenu(tr("&File")) fileMenu.addAction(Act) //! [28] fileMenu.addAction(openAct) //! [28] fileMenu.addAction(saveAct) //! [26] fileMenu.addAction(saveAsAct) fileMenu.addSeparator() fileMenu.addAction(exitAct) editMenu = menuBar().addMenu(tr("&Edit")) editMenu.addAction(cutAct) editMenu.addAction(copyAct) editMenu.addAction(pasteAct) menuBar().addSeparator() helpMenu = menuBar().addMenu(tr("&Help")) helpMenu.addAction(aboutAct) helpMenu.addAction(aboutQtAct) //! [27] //! [29] //! [30] def createToolBars(self): fileToolBar = addToolBar(tr("File")) fileToolBar.addAction(Act) //! [29] //! [31] fileToolBar.addAction(openAct) //! [31] fileToolBar.addAction(saveAct) editToolBar = addToolBar(tr("Edit")) editToolBar.addAction(cutAct) editToolBar.addAction(copyAct) editToolBar.addAction(pasteAct) //! [30] //! [32] def createStatusBar(self): //! [32] //! [33] statusBar().showMessage(tr("Ready")) //! [33] //! [34] //! [35] def readSettings(self): //! [34] //! [36] settings("Trolltech", "Application Example") pos = settings.value("pos", QPoint(200, 200)).toPoint() size = settings.value("size", QSize(400, 400)).toSize() resize(size) move(pos) //! [35] //! [36] //! [37] //! [38] def writeSettings(self): //! [37] //! [39] settings = QSettings("Trolltech", "Application Example") settings.setValue("pos", pos()) settings.setValue("size", size()) //! [38] //! [39] //! [40] def maybeSave(self): //! [40] //! [41] if textEdit.document()->isModified(): ret = QMessageBox.warning(self, tr("Application"), tr("The document has been modified.\n" "Do you want to save your changes?"), QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel) if ret == QMessageBox.Save: return save() elif ret == QMessageBox.Cancel: return False return True //! [41] //! [42] def loadFile(self, fileName): //! [42] //! [43] file = QFile(fileName) if !file.open(QFile.ReadOnly | QFile.Text): QMessageBox.warning(self, tr("Application"), tr("Cannot read file %1:\n%2.") .arg(fileName) .arg(file.errorString())) return in = QTextStream(file) QApplication.setOverrideCursor(Qt::WaitCursor) textEdit.setPlainText(in.readAll()) QApplication.restoreOverrideCursor() setCurrentFile(fileName) statusBar().showMessage(tr("File loaded"), 2000) //! [43] //! [44] def saveFile(self, fileName): //! [44] //! [45] file = QFile(fileName) if !file.open(QFile.WriteOnly | QFile::Text): QMessageBox.warning(self, tr("Application"), tr("Cannot write file %1:\n%2.") .arg(fileName) .arg(file.errorString())) return False out = QTextStream(file) QApplication.setOverrideCursor(Qt.WaitCursor) out << textEdit.toPlainText() QApplication.restoreOverrideCursor() setCurrentFile(fileName) statusBar().showMessage(tr("File saved"), 2000) return True //! [45] //! [46] def setCurrentFile(fileName): //! [46] //! [47] curFile = fileName textEdit.document().setModified(False) setWindowModified(False) if curFile.isEmpty(): shownName = "untitled.txt" else: shownName = strippedName(curFile) setWindowTitle(tr("%1[*] - %2").arg(shownName).arg(tr("Application"))) //! [47] //! [48] def strippedName(self, fullFileName): //! [48] //! [49] return QFileInfo(fullFileName).fileName() //! [49] ================================================ FILE: doc/codesnippets/examples/mainwindows/dockwidgets/mainwindow.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the example classes of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] from PySide.QtGui import * //! [0] //! [1] def __init__(self): textEdit = QTextEdit() setCentralWidget(textEdit) createActions() createMenus() createToolBars() createStatusBar() createDockWindows() setWindowTitle(tr("Dock Widgets")) Letter() setUnifiedTitleAndToolBarOnMac(True) //! [1] //! [2] def Letter(self) textEdit.clear() cursor = QTextCursor(textEdit.textCursor()) cursor.movePosition(QTextCursor.Start) topFrame = cursor.currentFrame() topFrameFormat = topFrame.frameFormat() topFrameFormat.setPadding(16) topFrame.setFrameFormat(topFrameFormat) textFormat = QTextCharFormat() boldFormat = QTextCharFormat() boldFormat.setFontWeight(QFont.Bold) italicFormat = QTextCharFormat() italicFormat.setFontItalic(True) tableFormat = QTextTableFormat() tableFormat.setBorder(1) tableFormat.setCellPadding(16) tableFormat.setAlignment(Qt.AlignRight) cursor.insertTable(1, 1, tableFormat) cursor.insertText("The Firm", boldFormat) cursor.insertBlock() cursor.insertText("321 City Street", textFormat) cursor.insertBlock() cursor.insertText("Industry Park") cursor.insertBlock() cursor.insertText("Some Country") cursor.setPosition(topFrame.lastPosition()) cursor.insertText(QDate.currentDate().toString("d MMMM yyyy"), textFormat) cursor.insertBlock() cursor.insertBlock() cursor.insertText("Dear ", textFormat) cursor.insertText("NAME", italicFormat) cursor.insertText(",", textFormat) for i in range(3): cursor.insertBlock() cursor.insertText(tr("Yours sincerely,"), textFormat) for i in range(3): cursor.insertBlock() cursor.insertText("The Boss", textFormat) cursor.insertBlock() cursor.insertText("ADDRESS", italicFormat) //! [2] //! [3] def print(self) document = textEdit.document() printer = QPrinter() dlg = QPrintDialog(&printer, self) if dlg.exec() != QDialog.Accepted: return document.print(printer) statusBar().showMessage(tr("Ready"), 2000) //! [3] //! [4] def save(self): fileName = QFileDialog.getSaveFileName(self, tr("Choose a file name"), ".", tr("HTML (*.html *.htm)")) if fileName.isEmpty(): return file = QFile(fileName) if !file.open(QFile.WriteOnly | QFile::Text): QMessageBox.warning(self, tr("Dock Widgets"), tr("Cannot write file %1:\n%2.") .arg(fileName) .arg(file.errorString())) return out = QTextStream(file) QApplication.setOverrideCursor(Qt::WaitCursor) out << textEdit.toHtml() QApplication.restoreOverrideCursor() statusBar().showMessage(tr("Saved '%1'").arg(fileName), 2000) //! [4] //! [5] def undo(self): document = textEdit.document() document.undo() //! [5] //! [6] def insertCustomer(self, customer): if customer.isEmpty(): return customerList = customer.split(", ") document = textEdit.document() cursor = document.find("NAME") if not cursor.isNull(): cursor.beginEditBlock() cursor.insertText(customerList.at(0)) oldcursor = cursor cursor = document.find("ADDRESS") if not cursor.isNull(): for i in range(customerList.size()): cursor.insertBlock() cursor.insertText(customerList.at(i)) cursor.endEditBlock() else: oldcursor.endEditBlock() //! [6] //! [7] def addParagraph(self, paragraph): if (paragraph.isEmpty()) return document = textEdit.document() cursor = document.find(tr("Yours sincerely,")) if cursor.isNull(): return cursor.beginEditBlock() cursor.movePosition(QTextCursor.PreviousBlock, QTextCursor.MoveAnchor, 2) cursor.insertBlock() cursor.insertText(paragraph) cursor.insertBlock() cursor.endEditBlock() //! [7] //! [8] def createStatusBar(self): statusBar().showMessage(tr("Ready")) //! [8] //! [9] def createDockWindows(self): dock = QDockWidget(tr("Customers"), self) dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) customerList = QListWidget(dock) customerList.addItems(QStringList() << "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton" << "Jane Doe, Memorabilia, 23 Watersedge, Beaton" << "Tammy Shea, Tiblanka, 38 Sea Views, Carlton" << "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal" << "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston" << "Sally Hobart, Tiroli Tea, 67 Long River, Fedula") dock.setWidget(customerList) addDockWidget(Qt.RightDockWidgetArea, dock) viewMenu.addAction(dock.toggleViewAction()) dock = QDockWidget(tr("Paragraphs"), self) paragraphsList = QListWidget(dock) paragraphsList.addItems(QStringList() << "Thank you for your payment which we have received today." << "Your order has been dispatched and should be with you " "within 28 days." << "We have dispatched those items that were in stock. The " "rest of your order will be dispatched once all the " "remaining items have arrived at our warehouse. No " "additional shipping charges will be made." << "You made a small overpayment (less than $5) which we " "will keep on account for you, or return at your request." << "You made a small underpayment (less than $1), but we have " "sent your order anyway. We'll add self underpayment to " "your next bill." << "Unfortunately you did not send enough money. Please remit " "an additional $. Your order will be dispatched as soon as " "the complete amount has been received." << "You made an overpayment (more than $5). Do you wish to " "buy more items, or should we return the excess to you?") dock.setWidget(paragraphsList) addDockWidget(Qt.RightDockWidgetArea, dock) viewMenu.addAction(dock.toggleViewAction()) connect(customerList, SIGNAL("currentTextChanged(const QString &)"), self, SLOT("insertCustomer(const QString &)")) connect(paragraphsList, SIGNAL("currentTextChanged(const QString &)"), self, SLOT("addParagraph(const QString &)")) //! [9] ================================================ FILE: doc/codesnippets/examples/mainwindows/mainwindow.cpp ================================================ ###################################### # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # Contact: http://www.qt-project.org/legal # # This file is part of the example classes of the Qt Toolkit. # # $QT_BEGIN_LICENSE:LGPL$ # Commercial License Usage # Licensees holding valid commercial Qt licenses may use this file in # accordance with the commercial license agreement provided with the # Software or, alternatively, in accordance with the terms contained in # a written agreement between you and Digia. For licensing terms and # conditions see http://qt.digia.com/licensing. For further information # use the contact form at http://qt.digia.com/contact-us. # # GNU Lesser General Public License Usage # Alternatively, this file may be used under the terms of the GNU Lesser # General Public License version 2.1 as published by the Free Software # Foundation and appearing in the file LICENSE.LGPL included in the # packaging of this file. Please review the following information to # ensure the GNU Lesser General Public License version 2.1 requirements # will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. # # In addition, as a special exception, Digia gives you certain additional # rights. These rights are described in the Digia Qt LGPL Exception # version 1.1, included in the file LGPL_EXCEPTION.txt in this package. # # GNU General Public License Usage # Alternatively, this file may be used under the terms of the GNU # General Public License version 3.0 as published by the Free Software # Foundation and appearing in the file LICENSE.GPL included in the # packaging of this file. Please review the following information to # ensure the GNU General Public License version 3.0 requirements will be # met: http://www.gnu.org/copyleft/gpl.html. # # # $QT_END_LICENSE$ # ###################################### from PySide.QtGui import * //! [0] def __init__(self): Q__init__(self) widget = QWidget() setCentralWidget(widget) //! [0] //! [1] topFiller = QWidget() topFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) infoLabel = QLabel(tr("<i>Choose a menu option, or right-click to " "invoke a context menu</i>")) infoLabel.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) infoLabel.setAlignment(Qt.AlignCenter) bottomFiller = QWidget() bottomFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) layout = QVBoxLayout() layout.setMargin(5) layout.addWidget(topFiller) layout.addWidget(infoLabel) layout.addWidget(bottomFiller) widget.setLayout(layout) //! [1] //! [2] createActions() createMenus() message = tr("A context menu is available by right-clicking") statusBar().showMessage(message) setWindowTitle(tr("Menus")) setMinimumSize(160, 160) resize(480, 320) //! [2] //! [3] def contextMenuEvent(self, event): menu = QMenu(self) menu.addAction(cutAct) menu.addAction(copyAct) menu.addAction(pasteAct) menu.exec_(event.globalPos()") //! [3] def File(self): infoLabel.setText(tr("Invoked <b>File|New</b>")) def open(self): infoLabel.setText(tr("Invoked <b>File|Open</b>")) def save(self): infoLabel.setText(tr("Invoked <b>File|Save</b>")) def print_(self): infoLabel.setText(tr("Invoked <b>File|Print</b>")) def undo(self): infoLabel.setText(tr("Invoked <b>Edit|Undo</b>")) def redo(self): infoLabel.setText(tr("Invoked <b>Edit|Redo</b>")) def cut(self): infoLabel.setText(tr("Invoked <b>Edit|Cut</b>")) def copy(self): infoLabel.setText(tr("Invoked <b>Edit|Copy</b>")) def paste(self): infoLabel.setText(tr("Invoked <b>Edit|Paste</b>")) def bold(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Bold</b>")) def italic(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Italic</b>")) def leftAlign(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Left Align</b>")) def rightAlign(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Right Align</b>")) def justify(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Justify</b>")) def center(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Center</b>")) def setLineSpacing(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Set Line Spacing</b>")) def setParagraphSpacing(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Set Paragraph Spacing</b>")) def about(self): infoLabel.setText(tr("Invoked <b>Help|About</b>")) QMessageBox.about(self, tr("About Menu"), tr("The <b>Menu</b> example shows how to create " "menu-bar menus and context menus.")) def aboutQt(self): infoLabel.setText(tr("Invoked <b>Help|About Qt</b>")) //! [4] def createActions(self): //! [5] Act = new QAction(tr("&New"), self) Act.setShortcuts(QKeySequence.New) Act.setStatusTip(tr("Create a new file")) connect(Act, SIGNAL("triggered()"), self, SLOT("newFile()")) //! [4] openAct = QAction(tr("&Open..."), self) openAct.setShortcuts(QKeySequence.Open) openAct.setStatusTip(tr("Open an existing file")) connect(openAct, SIGNAL("triggered()"), self, SLOT("open()")) //! [5] saveAct = QAction(tr("&Save"), self) saveAct.setShortcuts(QKeySequence.Save) saveAct.setStatusTip(tr("Save the document to disk")) connect(saveAct, SIGNAL("triggered()"), self, SLOT("save()")) printAct = QAction(tr("&Print..."), self) printAct.setShortcuts(QKeySequence.Print) printAct.setStatusTip(tr("Print the document")) connect(printAct, SIGNAL("triggered()"), self, SLOT("print_()")) exitAct = QAction(tr("E&xit"), self) exitAct.setShortcut(tr("Ctrl+Q")) exitAct.setStatusTip(tr("Exit the application")) connect(exitAct, SIGNAL("triggered()"), self, SLOT("close()")) undoAct = QAction(tr("&Undo"), self) undoAct.setShortcuts(QKeySequence.Undo) undoAct.setStatusTip(tr("Undo the last operation")) connect(undoAct, SIGNAL("triggered()"), self, SLOT("undo()")) redoAct = QAction(tr("&Redo"), self) redoAct.setShortcuts(QKeySequence.Redo) redoAct.setStatusTip(tr("Redo the last operation")) connect(redoAct, SIGNAL("triggered()"), self, SLOT("redo()")) cutAct = QAction(tr("Cu&t"), self) cutAct.setShortcuts(QKeySequence.Cut) cutAct.setStatusTip(tr("Cut the current selection's contents to the " "clipboard")) connect(cutAct, SIGNAL("triggered()"), self, SLOT("cut()")) copyAct = QAction(tr("&Copy"), self) copyAct.setShortcut(tr("Ctrl+C")) copyAct.setStatusTip(tr("Copy the current selection's contents to the " "clipboard")) connect(copyAct, SIGNAL("triggered()"), self, SLOT("copy()")) pasteAct = QAction(tr("&Paste"), self) pasteAct.setShortcuts(QKeySequence.Paste) pasteAct.setStatusTip(tr("Paste the clipboard's contents into the current " "selection")) connect(pasteAct, SIGNAL("triggered()"), self, SLOT("paste()")) boldAct = QAction(tr("&Bold"), self) boldAct.setCheckable(True) boldAct.setShortcut(tr("Ctrl+B")) boldAct.setStatusTip(tr("Make the text bold")) connect(boldAct, SIGNAL("triggered()"), self, SLOT("bold()")) QFont boldFont = boldAct.font() boldFont.setBold(True) boldAct.setFont(boldFont) italicAct = QAction(tr("&Italic"), self) italicAct.setCheckable(True) italicAct.setShortcut(tr("Ctrl+I")) italicAct.setStatusTip(tr("Make the text italic")) connect(italicAct, SIGNAL("triggered()"), self, SLOT("italic()")) QFont italicFont = italicAct.font() italicFont.setItalic(True) italicAct.setFont(italicFont) setLineSpacingAct = QAction(tr("Set &Line Spacing..."), self) setLineSpacingAct.setStatusTip(tr("Change the gap between the lines of a " "paragraph")) connect(setLineSpacingAct, SIGNAL("triggered()"), self, SLOT("setLineSpacing()")) setParagraphSpacingAct = QAction(tr("Set &Paragraph Spacing..."), self) setLineSpacingAct.setStatusTip(tr("Change the gap between paragraphs")) connect(setParagraphSpacingAct, SIGNAL("triggered()"), self, SLOT("setParagraphSpacing()")) aboutAct = QAction(tr("&About"), self) aboutAct.setStatusTip(tr("Show the application's About box")) connect(aboutAct, SIGNAL("triggered()"), self, SLOT("about()")) aboutQtAct = QAction(tr("About &Qt"), self) aboutQtAct.setStatusTip(tr("Show the Qt library's About box")) connect(aboutQtAct, SIGNAL("triggered()"), qApp, SLOT("aboutQt()")) connect(aboutQtAct, SIGNAL("triggered()"), self, SLOT("aboutQt()")) leftAlignAct = QAction(tr("&Left Align"), self) leftAlignAct.setCheckable(True) leftAlignAct.setShortcut(tr("Ctrl+L")) leftAlignAct.setStatusTip(tr("Left align the selected text")) connect(leftAlignAct, SIGNAL("triggered()"), self, SLOT("leftAlign()")) rightAlignAct = QAction(tr("&Right Align"), self) rightAlignAct.setCheckable(True) rightAlignAct.setShortcut(tr("Ctrl+R")) rightAlignAct.setStatusTip(tr("Right align the selected text")) connect(rightAlignAct, SIGNAL("triggered()"), self, SLOT("rightAlign()")) justifyAct = QAction(tr("&Justify"), self) justifyAct.setCheckable(True) justifyAct.setShortcut(tr("Ctrl+J")) justifyAct.setStatusTip(tr("Justify the selected text")) connect(justifyAct, SIGNAL("triggered()"), self, SLOT("justify()")) centerAct = QAction(tr("&Center"), self) centerAct.setCheckable(True) centerAct.setShortcut(tr("Ctrl+E")) centerAct.setStatusTip(tr("Center the selected text")) connect(centerAct, SIGNAL("triggered()"), self, SLOT("center()")) //! [6] //! [7] alignmentGroup = QActionGroup(self) alignmentGroup.addAction(leftAlignAct) alignmentGroup.addAction(rightAlignAct) alignmentGroup.addAction(justifyAct) alignmentGroup.addAction(centerAct) leftAlignAct.setChecked(True) //! [6] //! [7] //! [8] def createMenus(self): //! [9] //! [10] fileMenu = menuBar().addMenu(tr("&File")) fileMenu.addAction(Act) //! [9] fileMenu.addAction(openAct) //! [10] fileMenu.addAction(saveAct) fileMenu.addAction(printAct) //! [11] fileMenu.addSeparator() //! [11] fileMenu.addAction(exitAct) editMenu = menuBar().addMenu(tr("&Edit")) editMenu.addAction(undoAct) editMenu.addAction(redoAct) editMenu.addSeparator() editMenu.addAction(cutAct) editMenu.addAction(copyAct) editMenu.addAction(pasteAct) editMenu.addSeparator() helpMenu = menuBar().addMenu(tr("&Help")) helpMenu.addAction(aboutAct) helpMenu.addAction(aboutQtAct) //! [8] //! [12] formatMenu = editMenu.addMenu(tr("&Format")) formatMenu.addAction(boldAct) formatMenu.addAction(italicAct) formatMenu.addSeparator()->setText(tr("Alignment")) formatMenu.addAction(leftAlignAct) formatMenu.addAction(rightAlignAct) formatMenu.addAction(justifyAct) formatMenu.addAction(centerAct) formatMenu.addSeparator() formatMenu.addAction(setLineSpacingAct) formatMenu.addAction(setParagraphSpacingAct) //! [12] ================================================ FILE: doc/codesnippets/examples/mainwindows/mdi/mainwindow.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the example classes of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ from PySide.QtGui import * def __init__(self): mdiArea = QMdiArea() mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) setCentralWidget(mdiArea) connect(mdiArea, SIGNAL("subWindowActivated(QMdiSubWindow *)"), self, SLOT("updateMenus()")) windowMapper = QSignalMapper(self) connect(windowMapper, SIGNAL("mapped(QWidget *)"), self, SLOT("setActiveSubWindow(QWidget *)")) createActions() createMenus() createToolBars() createStatusBar() updateMenus() readSettings() setWindowTitle(tr("MDI")) setUnifiedTitleAndToolBarOnMac(True) def closeEvent(self, event): mdiArea.closeAllSubWindows() if self.activeMdiChild(): event.ignore() else: self.writeSettings() event.accept() def File(self): child = self.createMdiChild() child.File() child.show() def open(self): fileName = QFileDialog.getOpenFileName(self) if !fileName.isEmpty()): existing = self.findMdiChild(fileName) if existing: mdiArea.setActiveSubWindow(existing) return child = createMdiChild() if child.loadFile(fileName)): statusBar().showMessage(tr("File loaded"), 2000) child.show() else: child.close() def save(self): if self.activeMdiChild() && self.activeMdiChild().save(): self.statusBar().showMessage(tr("File saved"), 2000) def saveAs(self): if self.activeMdiChild() && self.activeMdiChild().saveAs(): self.statusBar().showMessage(tr("File saved"), 2000) def cut(self): if self.activeMdiChild(): self.activeMdiChild().cut() def copy(self): if self.activeMdiChild(): activeMdiChild().copy() def paste(self): if self.activeMdiChild(): activeMdiChild().paste() def about(self): QMessageBox.about(self, tr("About MDI"), tr("The <b>MDI</b> example demonstrates how to write multiple " "document interface applications using Qt.")") def updateMenus(self): hasMdiChild = (activeMdiChild() != 0) self.saveAct.setEnabled(hasMdiChild) self.saveAsAct.setEnabled(hasMdiChild) self.pasteAct.setEnabled(hasMdiChild) self.closeAct.setEnabled(hasMdiChild) self.closeAllAct.setEnabled(hasMdiChild) self.tileAct.setEnabled(hasMdiChild) self.cascadeAct.setEnabled(hasMdiChild) self.nextAct.setEnabled(hasMdiChild) self.previousAct.setEnabled(hasMdiChild) self.separatorAct.setVisible(hasMdiChild) hasSelection = (self.activeMdiChild() && self.activeMdiChild().textCursor().hasSelection()") self.cutAct.setEnabled(hasSelection) self.copyAct.setEnabled(hasSelection) def updateWindowMenu(self): self.windowMenu.clear() self.windowMenu.addAction(closeAct) self.windowMenu.addAction(closeAllAct) self.windowMenu.addSeparator() self.windowMenu.addAction(tileAct) self.windowMenu.addAction(cascadeAct) self.windowMenu.addSeparator() self.windowMenu.addAction(nextAct) self.windowMenu.addAction(previousAct) self.windowMenu.addAction(separatorAct) windows = mdiArea.subWindowList() separatorAct.setVisible(!windows.isEmpty()") for i in range((int i = 0 i < windows.size(); ++i) MdiChild *child = qobject_cast<MdiChild *>(windows.at(i).widget()") QString text if (i < 9) text = tr("&%1 %2").arg(i + 1) .arg(child.userFriendlyCurrentFile()") else text = tr("%1 %2").arg(i + 1) .arg(child.userFriendlyCurrentFile()") QAction *action = windowMenu.addAction(text) action.setCheckable(True) action .setChecked(child == activeMdiChild()") connect(action, SIGNAL("triggered()"), windowMapper, SLOT("map()")) windowMapper.setMapping(action, windows.at(i)") MdiChild *createMdiChild() MdiChild *child = MdiChild mdiArea.addSubWindow(child) connect(child, SIGNAL("copyAvailable(bool)"), cutAct, SLOT("setEnabled(bool)")) connect(child, SIGNAL("copyAvailable(bool)"), copyAct, SLOT("setEnabled(bool)")) return child def createActions() Act = new QAction(QIcon(":/images/new.png"), tr("&New"), self) Act.setShortcuts(QKeySequence.New) Act.setStatusTip(tr("Create a new file")") connect(Act, SIGNAL("triggered()"), self, SLOT("newFile()")) openAct = QAction(QIcon(":/images/open.png"), tr("&Open..."), self) openAct.setShortcuts(QKeySequence.Open) openAct.setStatusTip(tr("Open an existing file")") connect(openAct, SIGNAL("triggered()"), self, SLOT("open()")) saveAct = QAction(QIcon(":/images/save.png"), tr("&Save"), self) saveAct.setShortcuts(QKeySequence.Save) saveAct.setStatusTip(tr("Save the document to disk")") connect(saveAct, SIGNAL("triggered()"), self, SLOT("save()")) saveAsAct = QAction(tr("Save &As..."), self) saveAsAct.setShortcuts(QKeySequence.SaveAs) saveAsAct.setStatusTip(tr("Save the document under a name")") connect(saveAsAct, SIGNAL("triggered()"), self, SLOT("saveAs()")) //! [0] exitAct = QAction(tr("E&xit"), self) exitAct.setShortcut(tr("Ctrl+Q")") exitAct.setStatusTip(tr("Exit the application")") connect(exitAct, SIGNAL("triggered()"), qApp, SLOT("closeAllWindows()")) //! [0] cutAct = QAction(QIcon(":/images/cut.png"), tr("Cu&t"), self) cutAct.setShortcuts(QKeySequence.Cut) cutAct.setStatusTip(tr("Cut the current selection's contents to the " "clipboard")") connect(cutAct, SIGNAL("triggered()"), self, SLOT("cut()")) copyAct = QAction(QIcon(":/images/copy.png"), tr("&Copy"), self) copyAct.setShortcuts(QKeySequence.Copy) copyAct.setStatusTip(tr("Copy the current selection's contents to the " "clipboard")") connect(copyAct, SIGNAL("triggered()"), self, SLOT("copy()")) pasteAct = QAction(QIcon(":/images/paste.png"), tr("&Paste"), self) pasteAct.setShortcuts(QKeySequence.Paste) pasteAct.setStatusTip(tr("Paste the clipboard's contents into the current " "selection")") connect(pasteAct, SIGNAL("triggered()"), self, SLOT("paste()")) closeAct = QAction(tr("Cl&ose"), self) closeAct.setShortcut(tr("Ctrl+F4")") closeAct.setStatusTip(tr("Close the active window")") connect(closeAct, SIGNAL("triggered()"), mdiArea, SLOT("closeActiveSubWindow()")) closeAllAct = QAction(tr("Close &All"), self) closeAllAct.setStatusTip(tr("Close all the windows")") connect(closeAllAct, SIGNAL("triggered()"), mdiArea, SLOT("closeAllSubWindows()")) tileAct = QAction(tr("&Tile"), self) tileAct.setStatusTip(tr("Tile the windows")") connect(tileAct, SIGNAL("triggered()"), mdiArea, SLOT("tileSubWindows()")) cascadeAct = QAction(tr("&Cascade"), self) cascadeAct.setStatusTip(tr("Cascade the windows")") connect(cascadeAct, SIGNAL("triggered()"), mdiArea, SLOT("cascadeSubWindows()")) nextAct = QAction(tr("Ne&xt"), self) nextAct.setShortcuts(QKeySequence.NextChild) nextAct.setStatusTip(tr("Move the focus to the next window")") connect(nextAct, SIGNAL("triggered()"), mdiArea, SLOT("activateNextSubWindow()")) previousAct = QAction(tr("Pre&vious"), self) previousAct.setShortcuts(QKeySequence.PreviousChild) previousAct.setStatusTip(tr("Move the focus to the previous " "window")") connect(previousAct, SIGNAL("triggered()"), mdiArea, SLOT("activatePreviousSubWindow()")) separatorAct = QAction(self) separatorAct.setSeparator(True) aboutAct = QAction(tr("&About"), self) aboutAct.setStatusTip(tr("Show the application's About box")") connect(aboutAct, SIGNAL("triggered()"), self, SLOT("about()")) aboutQtAct = QAction(tr("About &Qt"), self) aboutQtAct.setStatusTip(tr("Show the Qt library's About box")") connect(aboutQtAct, SIGNAL("triggered()"), qApp, SLOT("aboutQt()")) def createMenus() fileMenu = menuBar().addMenu(tr("&File")") fileMenu.addAction(Act) fileMenu.addAction(openAct) fileMenu.addAction(saveAct) fileMenu.addAction(saveAsAct) fileMenu.addSeparator() QAction *action = fileMenu.addAction(tr("Switch layout direction")") connect(action, SIGNAL("triggered()"), self, SLOT("switchLayoutDirection()")) fileMenu.addAction(exitAct) editMenu = menuBar().addMenu(tr("&Edit")") editMenu.addAction(cutAct) editMenu.addAction(copyAct) editMenu.addAction(pasteAct) windowMenu = menuBar().addMenu(tr("&Window")") updateWindowMenu() connect(windowMenu, SIGNAL("aboutToShow()"), self, SLOT("updateWindowMenu()")) menuBar().addSeparator() helpMenu = menuBar().addMenu(tr("&Help")") helpMenu.addAction(aboutAct) helpMenu.addAction(aboutQtAct) def createToolBars() fileToolBar = addToolBar(tr("File")") fileToolBar.addAction(Act) fileToolBar.addAction(openAct) fileToolBar.addAction(saveAct) editToolBar = addToolBar(tr("Edit")") editToolBar.addAction(cutAct) editToolBar.addAction(copyAct) editToolBar.addAction(pasteAct) def createStatusBar() statusBar().showMessage(tr("Ready")") def readSettings() QSettings settings("Trolltech", "MDI Example") QPoint pos = settings.value("pos", QPoint(200, 200)").toPoint() QSize size = settings.value("size", QSize(400, 400)").toSize() move(pos) resize(size) def writeSettings() QSettings settings("Trolltech", "MDI Example") settings.setValue("pos", pos()") settings.setValue("size", size()") MdiChild *activeMdiChild() if (QMdiSubWindow *activeSubWindow = mdiArea.activeSubWindow()") return qobject_cast<MdiChild *>(activeSubWindow.widget()") return 0 QMdiSubWindow *findMdiChild(const QString &fileName) QString canonicalFilePath = QFileInfo(fileName).canonicalFilePath() foreach (QMdiSubWindow *window, mdiArea.subWindowList()") MdiChild *mdiChild = qobject_cast<MdiChild *>(window.widget()") if (mdiChild.currentFile() == canonicalFilePath) return window return 0 def switchLayoutDirection() if (layoutDirection() == Qt.LeftToRight) qApp.setLayoutDirection(Qt.RightToLeft) else qApp.setLayoutDirection(Qt.LeftToRight) def setActiveSubWindow(QWidget *window) if (!window) return mdiArea.setActiveSubWindow(qobject_cast<QMdiSubWindow *>(window)") ================================================ FILE: doc/codesnippets/examples/mainwindows/menus/mainwindow.cpp ================================================ ###################################### # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # Contact: http://www.qt-project.org/legal # # This file is part of the example classes of the Qt Toolkit. # # $QT_BEGIN_LICENSE:LGPL$ # Commercial License Usage # Licensees holding valid commercial Qt licenses may use this file in # accordance with the commercial license agreement provided with the # Software or, alternatively, in accordance with the terms contained in # a written agreement between you and Digia. For licensing terms and # conditions see http://qt.digia.com/licensing. For further information # use the contact form at http://qt.digia.com/contact-us. # # GNU Lesser General Public License Usage # Alternatively, this file may be used under the terms of the GNU Lesser # General Public License version 2.1 as published by the Free Software # Foundation and appearing in the file LICENSE.LGPL included in the # packaging of this file. Please review the following information to # ensure the GNU Lesser General Public License version 2.1 requirements # will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. # # In addition, as a special exception, Digia gives you certain additional # rights. These rights are described in the Digia Qt LGPL Exception # version 1.1, included in the file LGPL_EXCEPTION.txt in this package. # # GNU General Public License Usage # Alternatively, this file may be used under the terms of the GNU # General Public License version 3.0 as published by the Free Software # Foundation and appearing in the file LICENSE.GPL included in the # packaging of this file. Please review the following information to # ensure the GNU General Public License version 3.0 requirements will be # met: http://www.gnu.org/copyleft/gpl.html. # # # $QT_END_LICENSE$ # ###################################### from PySide.QtGui import * //! [0] def __init__(self): Q__init__(self) widget = QWidget() setCentralWidget(widget) //! [0] //! [1] topFiller = QWidget() topFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) infoLabel = QLabel(tr("<i>Choose a menu option, or right-click to " "invoke a context menu</i>")) infoLabel.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) infoLabel.setAlignment(Qt.AlignCenter) bottomFiller = QWidget() bottomFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) layout = QVBoxLayout() layout.setMargin(5) layout.addWidget(topFiller) layout.addWidget(infoLabel) layout.addWidget(bottomFiller) widget.setLayout(layout) //! [1] //! [2] createActions() createMenus() message = tr("A context menu is available by right-clicking") statusBar().showMessage(message) setWindowTitle(tr("Menus")) setMinimumSize(160, 160) resize(480, 320) //! [2] //! [3] def contextMenuEvent(self, event): menu = QMenu(self) menu.addAction(cutAct) menu.addAction(copyAct) menu.addAction(pasteAct) menu.exec_(event.globalPos()") //! [3] def File(self): infoLabel.setText(tr("Invoked <b>File|New</b>")) def open(self): infoLabel.setText(tr("Invoked <b>File|Open</b>")) def save(self): infoLabel.setText(tr("Invoked <b>File|Save</b>")) def print_(self): infoLabel.setText(tr("Invoked <b>File|Print</b>")) def undo(self): infoLabel.setText(tr("Invoked <b>Edit|Undo</b>")) def redo(self): infoLabel.setText(tr("Invoked <b>Edit|Redo</b>")) def cut(self): infoLabel.setText(tr("Invoked <b>Edit|Cut</b>")) def copy(self): infoLabel.setText(tr("Invoked <b>Edit|Copy</b>")) def paste(self): infoLabel.setText(tr("Invoked <b>Edit|Paste</b>")) def bold(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Bold</b>")) def italic(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Italic</b>")) def leftAlign(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Left Align</b>")) def rightAlign(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Right Align</b>")) def justify(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Justify</b>")) def center(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Center</b>")) def setLineSpacing(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Set Line Spacing</b>")) def setParagraphSpacing(self): infoLabel.setText(tr("Invoked <b>Edit|Format|Set Paragraph Spacing</b>")) def about(self): infoLabel.setText(tr("Invoked <b>Help|About</b>")) QMessageBox.about(self, tr("About Menu"), tr("The <b>Menu</b> example shows how to create " "menu-bar menus and context menus.")) def aboutQt(self): infoLabel.setText(tr("Invoked <b>Help|About Qt</b>")) //! [4] def createActions(self): //! [5] Act = new QAction(tr("&New"), self) Act.setShortcuts(QKeySequence.New) Act.setStatusTip(tr("Create a new file")) connect(Act, SIGNAL("triggered()"), self, SLOT("newFile()")) //! [4] openAct = QAction(tr("&Open..."), self) openAct.setShortcuts(QKeySequence.Open) openAct.setStatusTip(tr("Open an existing file")) connect(openAct, SIGNAL("triggered()"), self, SLOT("open()")) //! [5] saveAct = QAction(tr("&Save"), self) saveAct.setShortcuts(QKeySequence.Save) saveAct.setStatusTip(tr("Save the document to disk")) connect(saveAct, SIGNAL("triggered()"), self, SLOT("save()")) printAct = QAction(tr("&Print..."), self) printAct.setShortcuts(QKeySequence.Print) printAct.setStatusTip(tr("Print the document")) connect(printAct, SIGNAL("triggered()"), self, SLOT("print_()")) exitAct = QAction(tr("E&xit"), self) exitAct.setShortcut(tr("Ctrl+Q")) exitAct.setStatusTip(tr("Exit the application")) connect(exitAct, SIGNAL("triggered()"), self, SLOT("close()")) undoAct = QAction(tr("&Undo"), self) undoAct.setShortcuts(QKeySequence.Undo) undoAct.setStatusTip(tr("Undo the last operation")) connect(undoAct, SIGNAL("triggered()"), self, SLOT("undo()")) redoAct = QAction(tr("&Redo"), self) redoAct.setShortcuts(QKeySequence.Redo) redoAct.setStatusTip(tr("Redo the last operation")) connect(redoAct, SIGNAL("triggered()"), self, SLOT("redo()")) cutAct = QAction(tr("Cu&t"), self) cutAct.setShortcuts(QKeySequence.Cut) cutAct.setStatusTip(tr("Cut the current selection's contents to the " "clipboard")) connect(cutAct, SIGNAL("triggered()"), self, SLOT("cut()")) copyAct = QAction(tr("&Copy"), self) copyAct.setShortcut(tr("Ctrl+C")) copyAct.setStatusTip(tr("Copy the current selection's contents to the " "clipboard")) connect(copyAct, SIGNAL("triggered()"), self, SLOT("copy()")) pasteAct = QAction(tr("&Paste"), self) pasteAct.setShortcuts(QKeySequence.Paste) pasteAct.setStatusTip(tr("Paste the clipboard's contents into the current " "selection")) connect(pasteAct, SIGNAL("triggered()"), self, SLOT("paste()")) boldAct = QAction(tr("&Bold"), self) boldAct.setCheckable(True) boldAct.setShortcut(tr("Ctrl+B")) boldAct.setStatusTip(tr("Make the text bold")) connect(boldAct, SIGNAL("triggered()"), self, SLOT("bold()")) QFont boldFont = boldAct.font() boldFont.setBold(True) boldAct.setFont(boldFont) italicAct = QAction(tr("&Italic"), self) italicAct.setCheckable(True) italicAct.setShortcut(tr("Ctrl+I")) italicAct.setStatusTip(tr("Make the text italic")) connect(italicAct, SIGNAL("triggered()"), self, SLOT("italic()")) QFont italicFont = italicAct.font() italicFont.setItalic(True) italicAct.setFont(italicFont) setLineSpacingAct = QAction(tr("Set &Line Spacing..."), self) setLineSpacingAct.setStatusTip(tr("Change the gap between the lines of a " "paragraph")) connect(setLineSpacingAct, SIGNAL("triggered()"), self, SLOT("setLineSpacing()")) setParagraphSpacingAct = QAction(tr("Set &Paragraph Spacing..."), self) setLineSpacingAct.setStatusTip(tr("Change the gap between paragraphs")) connect(setParagraphSpacingAct, SIGNAL("triggered()"), self, SLOT("setParagraphSpacing()")) aboutAct = QAction(tr("&About"), self) aboutAct.setStatusTip(tr("Show the application's About box")) connect(aboutAct, SIGNAL("triggered()"), self, SLOT("about()")) aboutQtAct = QAction(tr("About &Qt"), self) aboutQtAct.setStatusTip(tr("Show the Qt library's About box")) connect(aboutQtAct, SIGNAL("triggered()"), qApp, SLOT("aboutQt()")) connect(aboutQtAct, SIGNAL("triggered()"), self, SLOT("aboutQt()")) leftAlignAct = QAction(tr("&Left Align"), self) leftAlignAct.setCheckable(True) leftAlignAct.setShortcut(tr("Ctrl+L")) leftAlignAct.setStatusTip(tr("Left align the selected text")) connect(leftAlignAct, SIGNAL("triggered()"), self, SLOT("leftAlign()")) rightAlignAct = QAction(tr("&Right Align"), self) rightAlignAct.setCheckable(True) rightAlignAct.setShortcut(tr("Ctrl+R")) rightAlignAct.setStatusTip(tr("Right align the selected text")) connect(rightAlignAct, SIGNAL("triggered()"), self, SLOT("rightAlign()")) justifyAct = QAction(tr("&Justify"), self) justifyAct.setCheckable(True) justifyAct.setShortcut(tr("Ctrl+J")) justifyAct.setStatusTip(tr("Justify the selected text")) connect(justifyAct, SIGNAL("triggered()"), self, SLOT("justify()")) centerAct = QAction(tr("&Center"), self) centerAct.setCheckable(True) centerAct.setShortcut(tr("Ctrl+E")) centerAct.setStatusTip(tr("Center the selected text")) connect(centerAct, SIGNAL("triggered()"), self, SLOT("center()")) //! [6] //! [7] alignmentGroup = QActionGroup(self) alignmentGroup.addAction(leftAlignAct) alignmentGroup.addAction(rightAlignAct) alignmentGroup.addAction(justifyAct) alignmentGroup.addAction(centerAct) leftAlignAct.setChecked(True) //! [6] //! [7] //! [8] def createMenus(self): //! [9] //! [10] fileMenu = menuBar().addMenu(tr("&File")) fileMenu.addAction(Act) //! [9] fileMenu.addAction(openAct) //! [10] fileMenu.addAction(saveAct) fileMenu.addAction(printAct) //! [11] fileMenu.addSeparator() //! [11] fileMenu.addAction(exitAct) editMenu = menuBar().addMenu(tr("&Edit")) editMenu.addAction(undoAct) editMenu.addAction(redoAct) editMenu.addSeparator() editMenu.addAction(cutAct) editMenu.addAction(copyAct) editMenu.addAction(pasteAct) editMenu.addSeparator() helpMenu = menuBar().addMenu(tr("&Help")) helpMenu.addAction(aboutAct) helpMenu.addAction(aboutQtAct) //! [8] //! [12] formatMenu = editMenu.addMenu(tr("&Format")) formatMenu.addAction(boldAct) formatMenu.addAction(italicAct) formatMenu.addSeparator()->setText(tr("Alignment")) formatMenu.addAction(leftAlignAct) formatMenu.addAction(rightAlignAct) formatMenu.addAction(justifyAct) formatMenu.addAction(centerAct) formatMenu.addSeparator() formatMenu.addAction(setLineSpacingAct) formatMenu.addAction(setParagraphSpacingAct) //! [12] ================================================ FILE: doc/codesnippets/examples/mainwindows/sdi/mainwindow.cpp ================================================ //! [implicit tr context] def createMenus(self): fileMenu = menuBar().addMenu("&File") //! [implicit tr context] //! [0] fileToolBar = addToolBar("File") fileToolBar.addAction(newAct) fileToolBar.addAction(openAct) //! [0] ================================================ FILE: doc/codesnippets/examples/painting/svggenerator/window.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QColorDialog> #include <QFileDialog> #include <QPainter> #include <QSvgGenerator> #include "window.h" #include "displaywidget.h" Window::Window(QWidget *parent) : QWidget(parent) { setupUi(this); } void Window::updateBackground(int background) { displayWidget->setBackground(DisplayWidget::Background(background)); } void Window::updateColor() { QColor color = QColorDialog::getColor(displayWidget->color()); if (color.isValid()) displayWidget->setColor(color); } void Window::updateShape(int shape) { displayWidget->setShape(DisplayWidget::Shape(shape)); } //! [save SVG] def saveSvg(self): newPath = QFileDialog.getSaveFileName(self, QObject.tr("Save SVG"), path, QObject.tr("SVG files (*.svg)")) if newPath.isEmpty(): return path = newPath //![configure SVG generator] generator = QSvgGenerator() generator.setFileName(path) generator.setSize(QSize(200, 200)) generator.setViewBox(QRect(0, 0, 200, 200)) generator.setTitle(QObject.tr("SVG Generator Example Drawing")) generator.setDescription(QObject.tr("An SVG drawing created by the SVG Generator Example provided with Qt.")) //![configure SVG generator] //![begin painting] painter = QPainter() painter.begin(generator) //![begin painting] displayWidget->paint(painter) //![end painting] painter.end() //![end painting] //! [save SVG] ================================================ FILE: doc/codesnippets/examples/richtext/textobject/svgtextobject.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the example classes of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef SVGTEXTOBJECT_H #define SVGTEXTOBJECT_H #include <QTextObjectInterface> QT_BEGIN_NAMESPACE class QTextDocument; class QTextFormat; class QPainter; class QRectF; class QSizeF; QT_END_NAMESPACE //![0] //![1] class SvgTextObject(QObject, QTextObjectInterface): def __init__(self,...): super(SvgTextObject, self).__init__(...) ... //![1] public: QSizeF intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format); void drawObject(QPainter *painter, const QRectF &rect, QTextDocument *doc, int posInDocument, const QTextFormat &format); }; //![0] #endif ================================================ FILE: doc/codesnippets/examples/sql/querymodel/editablesqlmodel.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QtSql> #include "editablesqlmodel.h" EditableSqlModel::EditableSqlModel(QObject *parent) : QSqlQueryModel(parent) { } //! [0] def flags(self, index): flags = QSqlQueryModel.flags(index) if index.column() == 1 or index.column() == 2: flags |= Qt.ItemIsEditable return flags //! [0] //! [1] def setData(self, index, value, role): if index.column() < 1 or index.column() > 2: return False primaryKeyIndex = QSqlQueryModel.index(index.row(), 0) id = self.data(primaryKeyIndex).toInt() self.clear() ok = False if index.column() == 1: ok = self.setFirstName(id, value) else: ok = self.setLastName(id, value) self.refresh() return ok } //! [1] void EditableSqlModel::refresh() { setQuery("select * from person"); setHeaderData(0, Qt::Horizontal, QObject::tr("ID")); setHeaderData(1, Qt::Horizontal, QObject::tr("First name")); setHeaderData(2, Qt::Horizontal, QObject::tr("Last name")); } //! [2] def setFirstName(self, personId, firstName): query = QSqlQuery() query.prepare("update person set firstname = ? where id = ?") query.addBindValue(firstName) query.addBindValue(personId) return query.exec() //! [2] bool EditableSqlModel::setLastName(int personId, const QString &lastName) { QSqlQuery query; query.prepare("update person set lastname = ? where id = ?"); query.addBindValue(lastName); query.addBindValue(personId); return query.exec(); } ================================================ FILE: doc/codesnippets/examples/sql/relationaltablemodel/relationaltablemodel.cpp ================================================ ###################################### # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # Contact: http://www.qt-project.org/legal # # This file is part of the example classes of the Qt Toolkit. # # $QT_BEGIN_LICENSE:LGPL$ # Commercial License Usage # Licensees holding valid commercial Qt licenses may use this file in # accordance with the commercial license agreement provided with the # Software or, alternatively, in accordance with the terms contained in # a written agreement between you and Digia. For licensing terms and # conditions see http://qt.digia.com/licensing. For further information # use the contact form at http://qt.digia.com/contact-us. # # GNU Lesser General Public License Usage # Alternatively, this file may be used under the terms of the GNU Lesser # General Public License version 2.1 as published by the Free Software # Foundation and appearing in the file LICENSE.LGPL included in the # packaging of this file. Please review the following information to # ensure the GNU Lesser General Public License version 2.1 requirements # will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. # # In addition, as a special exception, Digia gives you certain additional # rights. These rights are described in the Digia Qt LGPL Exception # version 1.1, included in the file LGPL_EXCEPTION.txt in this package. # # GNU General Public License Usage # Alternatively, this file may be used under the terms of the GNU # General Public License version 3.0 as published by the Free Software # Foundation and appearing in the file LICENSE.GPL included in the # packaging of this file. Please review the following information to # ensure the GNU General Public License version 3.0 requirements will be # met: http://www.gnu.org/copyleft/gpl.html. # # # $QT_END_LICENSE$ # ###################################### from PySide.QtGui import * from PySide.QtSql import * def initializeModel(model): //! [0] model.setTable("employee") //! [0] model.setEditStrategy(QSqlTableModel.OnManualSubmit) //! [1] model.setRelation(2, QSqlRelation("city", "id", "name")) //! [1] //! [2] model.setRelation(3, QSqlRelation("country", "id", "name")) //! [2] //! [3] model.setHeaderData(0, Qt.Horizontal, QObject::tr("ID")) model.setHeaderData(1, Qt.Horizontal, QObject::tr("Name")) model.setHeaderData(2, Qt.Horizontal, QObject::tr("City")) model.setHeaderData(3, Qt.Horizontal, QObject::tr("Country")) //! [3] model.select() def createView(title, model): //! [4] view = QTableView() view.setModel(model) view.setItemDelegate(QSqlRelationalDelegate(view)) //! [4] view.setWindowTitle(title) return view def createRelationalTables(): query = QSqlQuery() query.exec_("create table employee(id int primary key, name varchar(20), city int, country int)") query.exec_("insert into employee values(1, 'Espen', 5000, 47)") query.exec_("insert into employee values(2, 'Harald', 80000, 49)") query.exec_("insert into employee values(3, 'Sam', 100, 1)") query.exec_("create table city(id int, name varchar(20))") query.exec_("insert into city values(100, 'San Jose')") query.exec_("insert into city values(5000, 'Oslo')") query.exec_("insert into city values(80000, 'Munich')") query.exec_("create table country(id int, name varchar(20))") query.exec_("insert into country values(1, 'USA')") query.exec_("insert into country values(47, 'Norway')") query.exec_("insert into country values(49, 'Germany')") def main(): app = QApplication([]) if !createConnection(): return 1 createRelationalTables() model = QSqlRelationalTableModel() initializeModel(model) view = createView(QObject.tr("Relational Table Model"), model) view.show() return app.exec_() ================================================ FILE: doc/codesnippets/examples/uitools/textfinder/textfinder.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QtUiTools> #include <QtGui> #include "textfinder.h" //! [0] def __init__(self, parent = None): QWidget.__init__(self. parent) formWidget = self.loadUiFile() //! [1] self.ui_findButton = qFindChild(QPushButton, self, "findButton") self.ui_textEdit = qFindChild(QTextEdit, self, "textEdit") self.ui_lineEdit = qFindChild(QLineEdit, self, "lineEdit") //! [0] //! [1] //! [2] QMetaObject.connectSlotsByName(self) //! [2] //! [3a] self.loadTextFile() //! [3a] //! [3b] layout = QVBoxLayout() layout.addWidget(formWidget) self.setLayout(layout) //! [3b] //! [3c] self.setWindowTitle("Text Finder") self.isFirstTime = True //! [3c] //! [4] def loadUiFile(self): loader = QUiLoader() return loader.load(":/forms/textfinder.ui", self) //! [4] //! [5] def loadTextFile(self): inputFile = QFile(":/forms/input.txt") inputFile.open(QIODevice.ReadOnly) in = QTextStream(inputFile) line = in.readAll() inputFile.close() self.ui_textEdit.append(line) self.ui_textEdit.setUndoRedoEnabled(False) self.ui_textEdit.setUndoRedoEnabled(True) //! [5] //! [6] //! [7] @Slot() def on_findButton_clicked(self): searchString = self.ui_lineEdit.text() document = self.ui_textEdit.document() found = False if not self.isFirstTime: document.undo() if not searchString: QMessageBox.information(self, "Empty Search Field", "The search field is empty. Please enter a word and click Find.") else: highlightCursor = QTextCursor(document) cursor = QTextCursor(document) cursor.beginEditBlock() //! [6] plainFormat = QTextCharFormat(highlightCursor.charFormat()) colorFormat = QTextCharFormat(plainFormat) colorFormat.setForeground(Qt.red) while not highlightCursor.isNull() and not highlightCursor.atEnd(): highlightCursor = document.find(searchString, highlightCursor, QTextDocument.FindWholeWords) if not highlightCursor.isNull(): found = True highlightCursor.movePosition(QTextCursor.WordRight, QTextCursor.KeepAnchor) highlightCursor.mergeCharFormat(colorFormat) //! [8] cursor.endEditBlock() //! [7] //! [9] self.isFirstTime = False if not found: QMessageBox.information(self, "Word Not Found", "Sorry, the word cannot be found."); //! [8] //! [9] ================================================ FILE: doc/codesnippets/examples/widgets/analogclock/analogclock.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QtGui> #include "analogclock.h" //! [0] //! [1] AnalogClock::AnalogClock(QWidget *parent) //! [0] //! [2] : QWidget(parent) //! [2] //! [3] { //! [3] //! [4] timer = QTimer(self) //! [4] //! [5] self.connect(timer, SIGNAL("timeout()"), self.update) //! [5] //! [6] timer.start(1000) //! [6] setWindowTitle(tr("Analog Clock")); resize(200, 200); //! [7] } //! [1] //! [7] //! [8] //! [9] void AnalogClock::paintEvent(QPaintEvent *) //! [8] //! [10] { static const QPoint hourHand[3] = { QPoint(7, 8), QPoint(-7, 8), QPoint(0, -40) }; static const QPoint minuteHand[3] = { QPoint(7, 8), QPoint(-7, 8), QPoint(0, -70) }; QColor hourColor(127, 0, 127); QColor minuteColor(0, 127, 127, 191); int side = qMin(width(), height()); QTime time = QTime::currentTime(); //! [10] //! [11] QPainter painter(this); //! [11] //! [12] painter.setRenderHint(QPainter::Antialiasing); //! [12] //! [13] painter.translate(width() / 2, height() / 2); //! [13] //! [14] painter.scale(side / 200.0, side / 200.0); //! [9] //! [14] //! [15] painter.setPen(Qt::NoPen); //! [15] //! [16] painter.setBrush(hourColor); //! [16] //! [17] //! [18] painter.save(); //! [17] //! [19] painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))); painter.drawConvexPolygon(hourHand, 3); painter.restore(); //! [18] //! [19] //! [20] painter.setPen(hourColor); //! [20] //! [21] for (int i = 0; i < 12; ++i) { painter.drawLine(88, 0, 96, 0); painter.rotate(30.0); } //! [21] //! [22] painter.setPen(Qt::NoPen); //! [22] //! [23] painter.setBrush(minuteColor); //! [24] painter.save(); painter.rotate(6.0 * (time.minute() + time.second() / 60.0)); painter.drawConvexPolygon(minuteHand, 3); painter.restore(); //! [23] //! [24] //! [25] painter.setPen(minuteColor); //! [25] //! [26] //! [27] for (int j = 0; j < 60; ++j) { if ((j % 5) != 0) painter.drawLine(92, 0, 96, 0); painter.rotate(6.0); } //! [27] } //! [26] ================================================ FILE: doc/codesnippets/examples/widgets/groupbox/window.cpp ================================================ //! [0] def __init__(self, parent = None): QWidget.__init__(self, parent) grid = QGridLayout() grid.addWidget(createFirstExclusiveGroup(), 0, 0) grid.addWidget(createSecondExclusiveGroup(), 1, 0) grid.addWidget(createNonExclusiveGroup(), 0, 1) grid.addWidget(createPushButtonGroup(), 1, 1) setLayout(grid) setWindowTitle("Group Boxes") resize(480, 320) //! [0] //! [1] def createFirstExclusiveGroup(self): //! [2] groupBox = QGroupBox("Exclusive Radio Buttons") radio1 = QRadioButton("&Radio button 1") radio2 = QRadioButton("R&adio button 2") radio3 = QRadioButton("Ra&dio button 3") radio1.setChecked(True) //! [1] //! [3] vbox = QVBoxLayout() vbox.addWidget(radio1) vbox.addWidget(radio2) vbox.addWidget(radio3) vbox.addStretch(1) groupBox.setLayout(vbox) //! [2] return groupBox //! [3] //! [4] def createSecondExclusiveGroup(self): groupBox = QGroupBox("E&xclusive Radio Buttons") groupBox.setCheckable(True) groupBox.setChecked(False) //! [4] //! [5] radio1 = QRadioButton("Rad&io button 1") radio2 = QRadioButton("Radi&o button 2") radio3 = QRadioButton("Radio &button 3") radio1.setChecked(True) checkBox = QCheckBox("Ind&ependent checkbox") checkBox.setChecked(True) //! [5] //! [6] vbox = QVBoxLayout() vbox.addWidget(radio1) vbox.addWidget(radio2) vbox.addWidget(radio3) vbox.addWidget(checkBox) vbox.addStretch(1) groupBox.setLayout(vbox) return groupBox //! [6] //! [7] def createNonExclusiveGroup(self): groupBox = QGroupBox("Non-Exclusive Checkboxes") groupBox.setFlat(True) //! [7] //! [8] checkBox1 = QCheckBox("&Checkbox 1") checkBox2 = QCheckBox("C&heckbox 2") checkBox2.setChecked(True) tristateBox = QCheckBox("Tri-&state button") tristateBox.setTristate(True) //! [8] tristateBox.setCheckState(Qt.PartiallyChecked) //! [9] vbox = QVBoxLayout() vbox.addWidget(checkBox1) vbox.addWidget(checkBox2) vbox.addWidget(tristateBox) vbox.addStretch(1) groupBox.setLayout(vbox) return groupBox //! [9] //! [10] def createPushButtonGroup(self): groupBox = QGroupBox("&Push Buttons") groupBox.setCheckable(True) groupBox.setChecked(True) //! [10] //! [11] pushButton = QPushButton("&Normal Button") toggleButton = QPushButton("&Toggle Button") toggleButton.setCheckable(True) toggleButton.setChecked(True) flatButton = QPushButton("&Flat Button") flatButton.setFlat(True) //! [11] //! [12] popupButton = QPushButton("Pop&up Button") menu = QMenu(self) menu.addAction("&First Item") menu.addAction("&Second Item") menu.addAction("&Third Item") menu.addAction("F&ourth Item") popupButton.setMenu(menu) //! [12] newAction = menu.addAction("Submenu") QMenu *subMenu = QMenu("Popup Submenu") subMenu.addAction("Item 1") subMenu.addAction("Item 2") subMenu.addAction("Item 3") newAction.setMenu(subMenu) //! [13] vbox = QVBoxLayout() vbox.addWidget(pushButton) vbox.addWidget(toggleButton) vbox.addWidget(flatButton) vbox.addWidget(popupButton) vbox.addStretch(1) groupBox.setLayout(vbox) return groupBox } //! [13] ================================================ FILE: doc/codesnippets/examples/widgets/icons/iconsizespinbox.cpp ================================================ ############################################################################ ## ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ## Contact: http://www.qt-project.org/legal ## ## This file is part of the example classes of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and Digia. For licensing terms and ## conditions see http://qt.digia.com/licensing. For further information ## use the contact form at http://qt.digia.com/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Digia gives you certain additional ## rights. These rights are described in the Digia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3.0 as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU General Public License version 3.0 requirements will be ## met: http://www.gnu.org/copyleft/gpl.html. ## ## ## $QT_END_LICENSE$ ## ############################################################################ //! [0] def __init__(self, parent): QSpinBox.__init__(self, parent) //! [0] //! [1] def valueFromText(self, text): regExp = QRegExp(tr("(\\d+)(\\s*[xx]\\s*\\d+)?")) if regExp.exactMatch(text): return regExp.cap(1).toInt() else: return 0 //! [1] //! [2] def textFromValue(self, value): return self.tr("%1 x %1").arg(value) //! [2] ================================================ FILE: doc/codesnippets/examples/widgets/spinboxes/window.cpp ================================================ ###################################### # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # Contact: http://www.qt-project.org/legal # # This file is part of the example classes of the Qt Toolkit. # # $QT_BEGIN_LICENSE:LGPL$ # Commercial License Usage # Licensees holding valid commercial Qt licenses may use this file in # accordance with the commercial license agreement provided with the # Software or, alternatively, in accordance with the terms contained in # a written agreement between you and Digia. For licensing terms and # conditions see http://qt.digia.com/licensing. For further information # use the contact form at http://qt.digia.com/contact-us. # # GNU Lesser General Public License Usage # Alternatively, this file may be used under the terms of the GNU Lesser # General Public License version 2.1 as published by the Free Software # Foundation and appearing in the file LICENSE.LGPL included in the # packaging of this file. Please review the following information to # ensure the GNU Lesser General Public License version 2.1 requirements # will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. # # In addition, as a special exception, Digia gives you certain additional # rights. These rights are described in the Digia Qt LGPL Exception # version 1.1, included in the file LGPL_EXCEPTION.txt in this package. # # GNU General Public License Usage # Alternatively, this file may be used under the terms of the GNU # General Public License version 3.0 as published by the Free Software # Foundation and appearing in the file LICENSE.GPL included in the # packaging of this file. Please review the following information to # ensure the GNU General Public License version 3.0 requirements will be # met: http://www.gnu.org/copyleft/gpl.html. # # # $QT_END_LICENSE$ # ###################################### from PySide.QtGui import * //! [0] def __init__(self): createSpinBoxes() createDateTimeEdits() createDoubleSpinBoxes() layout = QHBoxLayout() layout.addWidget(spinBoxesGroup) layout.addWidget(editsGroup) layout.addWidget(doubleSpinBoxesGroup) setLayout(layout) setWindowTitle(tr("Spin Boxes")) //! [0] //! [1] def createSpinBoxes(self): spinBoxesGroup = QGroupBox(tr("Spinboxes")) integerLabel = QLabel(tr("Enter a value between " "%1 and %2:").arg(-20).arg(20)) integerSpinBox = QSpinBox() integerSpinBox.setRange(-20, 20) integerSpinBox.setSingleStep(1) integerSpinBox.setValue(0) //! [1] //! [2] zoomLabel = QLabel(tr("Enter a zoom value between " "%1 and %2:").arg(0).arg(1000)) //! [3] zoomSpinBox = QSpinBox() zoomSpinBox.setRange(0, 1000) zoomSpinBox.setSingleStep(10) zoomSpinBox.setSuffix("%") zoomSpinBox.setSpecialValueText(tr("Automatic")) zoomSpinBox.setValue(100) //! [2] //! [3] //! [4] priceLabel = QLabel(tr("Enter a price between " "%1 and %2:").arg(0).arg(999)) priceSpinBox = QSpinBox() priceSpinBox.setRange(0, 999) priceSpinBox.setSingleStep(1) priceSpinBox.setPrefix("$") priceSpinBox.setValue(99) //! [4] //! [5] spinBoxLayout = QVBoxLayout() spinBoxLayout.addWidget(integerLabel) spinBoxLayout.addWidget(integerSpinBox) spinBoxLayout.addWidget(zoomLabel) spinBoxLayout.addWidget(zoomSpinBox) spinBoxLayout.addWidget(priceLabel) spinBoxLayout.addWidget(priceSpinBox) spinBoxesGroup.setLayout(spinBoxLayout) //! [5] //! [6] def createDateTimeEdits(self): editsGroup = QGroupBox(tr("Date and time spin boxes")) dateLabel = QLabel() dateEdit = QDateEdit(QDate.currentDate()) dateEdit.setDateRange(QDate(2005, 1, 1), QDate(2010, 12, 31)) dateLabel.setText(tr("Appointment date (between %0 and %1):") .arg(dateEdit.minimumDate().toString(Qt.ISODate)) .arg(dateEdit.maximumDate().toString(Qt.ISODate))) //! [6] //! [7] timeLabel = QLabel() timeEdit = QTimeEdit(QTime.currentTime()) timeEdit.setTimeRange(QTime(9, 0, 0, 0), QTime(16, 30, 0, 0)) timeLabel.setText(tr("Appointment time (between %0 and %1):") .arg(timeEdit.minimumTime().toString(Qt.ISODate)) .arg(timeEdit.maximumTime().toString(Qt.ISODate))) //! [7] //! [8] meetingLabel = QLabel() meetingEdit = QDateTimeEdit(QDateTime.currentDateTime()) //! [8] //! [9] formatLabel = QLabel(tr("Format string for the meeting date " "and time:")) formatComboBox = QComboBox() formatComboBox.addItem("yyyy-MM-dd hh:mm:ss (zzz 'ms')") formatComboBox.addItem("hh:mm:ss MM/dd/yyyy") formatComboBox.addItem("hh:mm:ss dd/MM/yyyy") formatComboBox.addItem("hh:mm:ss") formatComboBox.addItem("hh:mm ap") //! [9] //! [10] connect(formatComboBox, SIGNAL("activated(const QString &)"), self, SLOT("setFormatString(const QString &)")) //! [10] setFormatString(formatComboBox.currentText()) //! [11] editsLayout = QVBoxLayout() editsLayout.addWidget(dateLabel) editsLayout.addWidget(dateEdit) editsLayout.addWidget(timeLabel) editsLayout.addWidget(timeEdit) editsLayout.addWidget(meetingLabel) editsLayout.addWidget(meetingEdit) editsLayout.addWidget(formatLabel) editsLayout.addWidget(formatComboBox) editsGroup.setLayout(editsLayout) //! [11] //! [12] def setFormatString(self, formatString): meetingEdit.setDisplayFormat(formatString) //! [12] //! [13] if meetingEdit.displayedSections() & QDateTimeEdit.DateSections_Mask: meetingEdit.setDateRange(QDate(2004, 11, 1), QDate(2005, 11, 30)) meetingLabel.setText(tr("Meeting date (between %0 and %1):") .arg(meetingEdit.minimumDate().toString(Qt.ISODate)) .arg(meetingEdit.maximumDate().toString(Qt.ISODate))) else: meetingEdit.setTimeRange(QTime(0, 7, 20, 0), QTime(21, 0, 0, 0)) meetingLabel.setText(tr("Meeting time (between %0 and %1):") .arg(meetingEdit.minimumTime().toString(Qt.ISODate)) .arg(meetingEdit.maximumTime().toString(Qt.ISODate))) //! [13] //! [14] def createDoubleSpinBoxes(): doubleSpinBoxesGroup = QGroupBox(tr("Double precision spinboxes")) precisionLabel = QLabel(tr("Number of decimal places " "to show:")) precisionSpinBox = QSpinBox() precisionSpinBox.setRange(0, 100) precisionSpinBox.setValue(2) //! [14] //! [15] doubleLabel = QLabel(tr("Enter a value between " "%1 and %2:").arg(-20).arg(20)) doubleSpinBox = QDoubleSpinBox () doubleSpinBox.setRange(-20.0, 20.0) doubleSpinBox.setSingleStep(1.0) doubleSpinBox.setValue(0.0) //! [15] //! [16] scaleLabel = QLabel(tr("Enter a scale factor between " "%1 and %2:").arg(0).arg(1000.0)) scaleSpinBox = QDoubleSpinBox() scaleSpinBox.setRange(0.0, 1000.0) scaleSpinBox.setSingleStep(10.0) scaleSpinBox.setSuffix("%") scaleSpinBox.setSpecialValueText(tr("No scaling")) scaleSpinBox.setValue(100.0) //! [16] //! [17] priceLabel = QLabel(tr("Enter a price between " "%1 and %2:").arg(0).arg(1000)) priceSpinBox = QDoubleSpinBox() priceSpinBox.setRange(0.0, 1000.0) priceSpinBox.setSingleStep(1.0) priceSpinBox.setPrefix("$") priceSpinBox.setValue(99.99) connect(precisionSpinBox, SIGNAL("valueChanged(int)"), //! [17] self, SLOT("changePrecision(int))") //! [18] spinBoxLayout = QVBoxLayout() spinBoxLayout.addWidget(precisionLabel) spinBoxLayout.addWidget(precisionSpinBox) spinBoxLayout.addWidget(doubleLabel) spinBoxLayout.addWidget(doubleSpinBox) spinBoxLayout.addWidget(scaleLabel) spinBoxLayout.addWidget(scaleSpinBox) spinBoxLayout.addWidget(priceLabel) spinBoxLayout.addWidget(priceSpinBox) doubleSpinBoxesGroup.setLayout(spinBoxLayout) } //! [18] //! [19] def changePrecision(self, int) doubleSpinBox.setDecimals(decimals) scaleSpinBox.setDecimals(decimals) priceSpinBox.setDecimals(decimals) //! [19] ================================================ FILE: doc/codesnippets/examples/xml/streambookmarks/xbelreader.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QtGui> #include "xbelreader.h" //! [0] XbelReader::XbelReader(QTreeWidget *treeWidget) : treeWidget(treeWidget) { QStyle *style = treeWidget->style(); folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon), QIcon::Normal, QIcon::Off); folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), QIcon::Normal, QIcon::On); bookmarkIcon.addPixmap(style->standardPixmap(QStyle::SP_FileIcon)); } //! [0] //! [1] def read(self, device): self.setDevice(device) while not atEnd(): readNext() if isStartElement(): if self.name() == "xbel" and self.attributes().value("version") == "1.0": self.readXBEL() else: self.raiseError(QObject.tr("The file is not an XBEL version 1.0 file.")); return not self.error(); //! [1] //! [2] void XbelReader::readUnknownElement() { Q_ASSERT(isStartElement()); while (!atEnd()) { readNext(); if (isEndElement()) break; if (isStartElement()) readUnknownElement(); } } //! [2] //! [3] void XbelReader::readXBEL() { Q_ASSERT(isStartElement() && name() == "xbel"); while (!atEnd()) { readNext(); if (isEndElement()) break; if (isStartElement()) { if (name() == "folder") readFolder(0); else if (name() == "bookmark") readBookmark(0); else if (name() == "separator") readSeparator(0); else readUnknownElement(); } } } //! [3] //! [4] void XbelReader::readTitle(QTreeWidgetItem *item) { Q_ASSERT(isStartElement() && name() == "title"); QString title = readElementText(); item->setText(0, title); } //! [4] //! [5] void XbelReader::readSeparator(QTreeWidgetItem *item) { QTreeWidgetItem *separator = createChildItem(item); separator->setFlags(item->flags() & ~Qt::ItemIsSelectable); separator->setText(0, QString(30, 0xB7)); readElementText(); } //! [5] void XbelReader::readFolder(QTreeWidgetItem *item) { Q_ASSERT(isStartElement() && name() == "folder"); QTreeWidgetItem *folder = createChildItem(item); bool folded = (attributes().value("folded") != "no"); treeWidget->setItemExpanded(folder, !folded); while (!atEnd()) { readNext(); if (isEndElement()) break; if (isStartElement()) { if (name() == "title") readTitle(folder); else if (name() == "folder") readFolder(folder); else if (name() == "bookmark") readBookmark(folder); else if (name() == "separator") readSeparator(folder); else readUnknownElement(); } } } void XbelReader::readBookmark(QTreeWidgetItem *item) { Q_ASSERT(isStartElement() && name() == "bookmark"); QTreeWidgetItem *bookmark = createChildItem(item); bookmark->setFlags(bookmark->flags() | Qt::ItemIsEditable); bookmark->setIcon(0, bookmarkIcon); bookmark->setText(0, QObject::tr("Unknown title")); bookmark->setText(1, attributes().value("href").toString()); while (!atEnd()) { readNext(); if (isEndElement()) break; if (isStartElement()) { if (name() == "title") readTitle(bookmark); else readUnknownElement(); } } } QTreeWidgetItem *XbelReader::createChildItem(QTreeWidgetItem *item) { QTreeWidgetItem *childItem; if (item) { childItem = new QTreeWidgetItem(item); } else { childItem = new QTreeWidgetItem(treeWidget); } childItem->setData(0, Qt::UserRole, name().toString()); return childItem; } ================================================ FILE: doc/codesnippets/examples/xml/streambookmarks/xbelreader.h ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef XBELREADER_H #define XBELREADER_H #include <QIcon> #include <QXmlStreamReader> QT_BEGIN_NAMESPACE class QTreeWidget; class QTreeWidgetItem; QT_END_NAMESPACE //! [0] class XbelReader (QXmlStreamReader): //! [1] def __init__(self, treeWidget): ... //! [1] def read(self, device); ... //! [2] def readUnknownElement(self): ... def readXBEL(self): ... def readTitle(self, item): ... def readSeparator(self, item): ... def readFolder(self, item): ... def readBookmark(self, item): ... def createChildItem(self, item): ... //! [2] //! [0] #endif ================================================ FILE: doc/codesnippets/examples/xml/streambookmarks/xbelwriter.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QtGui> #include "xbelwriter.h" //! [0] XbelWriter::XbelWriter(QTreeWidget *treeWidget) : treeWidget(treeWidget) { setAutoFormatting(true); } //! [0] //! [1] def writeFile(self, device): self.setDevice(device) self.writeStartDocument() self.writeDTD("<!DOCTYPE xbel>") self.writeStartElement("xbel") self.writeAttribute("version", "1.0") for i in range(0, self.treeWidget.topLevelItemCount()): self.writeItem(self.treeWidget.topLevelItem(i)) self.writeEndDocument() return True; //! [1] //! [2] void XbelWriter::writeItem(QTreeWidgetItem *item) { QString tagName = item->data(0, Qt::UserRole).toString(); if (tagName == "folder") { bool folded = !treeWidget->isItemExpanded(item); writeStartElement(tagName); writeAttribute("folded", folded ? "yes" : "no"); writeTextElement("title", item->text(0)); for (int i = 0; i < item->childCount(); ++i) writeItem(item->child(i)); writeEndElement(); } else if (tagName == "bookmark") { writeStartElement(tagName); if (!item->text(1).isEmpty()) writeAttribute("href", item->text(1)); writeTextElement("title", item->text(0)); writeEndElement(); } else if (tagName == "separator") { writeEmptyElement(tagName); } } //! [2] ================================================ FILE: doc/codesnippets/snippets/customstyle/main.cpp ================================================ //! [using a custom style] import sys from PySide.QtGui import * QApplication.setStyle(CustomStyle()) app = QApplication(sys.argv) spinBox = QSpinBox() spinBox.show() sys.exit(app.exec_()) //! [using a custom style] ================================================ FILE: doc/codesnippets/snippets/phonon/samplebackend/main.cpp ================================================ //! [snippet] def createObject(self, c, parent, args): if c == BackendInterface.MediaObjectClass: return MediaObject(parent) elif c == BackendInterface.VolumeFaderEffectClass: return VolumeFaderEffect(parent) elif c == BackendInterface.AudioOutputClass: return AudioOutput(parent) elif c == BackendInterface.AudioDataOutputClass: return AudioDataOutput(parent) elif c == BackendInterface.VisualizationClass: return Visualization(parent) elif c == BackendInterface.VideoDataOutputClass: return VideoDataOutput(parent) elif c == BackendInterface.EffectClass: return Effect(args[0].toInt(), parent) elif c == BackendInterface.VideoWidgetClass: return VideoWidget(parent) return None def objectDescriptionIndexes(self, type_): retval = set() if type_ == Phonon.AudioOutputDeviceType: # use AudioDeviceEnumerator to list ALSA and OSS devices retval.add(10000) retval.add(10001) elif type_ == Phonon.AudioCaptureDeviceType: retval.add(20000) retval.add(20001) elif type_ == Phonon.VideoCaptureDeviceType: retval.add(30000) retval.add(30001) elif type_ == Phonon.EffectType: retval.add(0x7F000001) return retval def objectDescriptionProperties(self, type_, index): ret = {} if type_ == Phonon.AudioOutputDeviceType: if index == 10000: ret["name"] = "internal Soundcard" elif index == 10001: ret["name"] = "USB Headset" ret["available"] = False elif type_ == Phonon.AudioCaptureDeviceType: if index == 20000: ret["name"] = "Soundcard" ret["description"] = "first description" elif index == 20001: ret["name"] = "DV" ret["description"] = "second description" elif type_ == Phonon.VideoCaptureDeviceType: elif index == 30000: ret["name"] = "USB Webcam" ret["description"] = "first description" elif index == 30001: ret["name"] = "DV")) ret["description"] = "second description" elif type_ == Phonon.EffectType: if index == 0x7F000001: ret["name"] = "Delay" ret["description"] = "Simple delay effect with time, feedback and level controls." return ret //! [snippet] ================================================ FILE: doc/codesnippets/snippets/phonon.cpp ================================================ //![0] music = Phonon.createPlayer(Phonon.MusicCategory, Phonon.MediaSource("/path/mysong.wav")) music.play() //![0] parentWidget = QWidget() url = QUrl("Myfancymusic") //![1] player = Phonon.VideoPlayer(Phonon.VideoCategory, parentWidget) player.play(url) //![1] //![2] mediaObject = Phonon.MediaObject(self) mediaObject.setCurrentSource(Phonon.MediaSource("/mymusic/barbiegirl.wav")) audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self) path = Phonon.createPath(mediaObject, audioOutput) //![2] //![3] effect = Phonon.Effect(Phonon.BackendCapabilities.availableAudioEffects()[0], self) path.insertEffect(effect) //![3] //![4] mediaObject = Phonon.MediaObject(self) videoWidget = Phonon.VideoWidget(self) Phonon.createPath(mediaObject, videoWidget) audioOutput = Phonon.AudioOutput(Phonon.VideoCategory, self) Phonon.createPath(mediaObject, audioOutput) //![4] //![5] mediaObject.play() //![5] ================================================ FILE: doc/codesnippets/snippets/textdocument-resources/main.cpp ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QtGui> QString tr(const char *text) { return QApplication::translate(text, text); } int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextEdit *editor = new QTextEdit; QTextDocument *document = new QTextDocument(editor); QTextCursor cursor(document); QImage image(64, 64, QImage::Format_RGB32); image.fill(qRgb(255, 160, 128)); //! [Adding a resource] document.addResource(QTextDocument.ImageResource, QUrl("mydata://image.png"), image) //! [Adding a resource] //! [Inserting an image with a cursor] imageFormat = QTextImageFormat() imageFormat.setName("mydata://image.png") cursor.insertImage(imageFormat) //! [Inserting an image with a cursor] cursor.insertBlock(); cursor.insertText("Code less. Create more."); editor->setDocument(document); editor->setWindowTitle(tr("Text Document Images")); editor->resize(320, 480); editor->show(); //! [Inserting an image using HTML] editor.append("<img src=\"mydata://image.png\" />") //! [Inserting an image using HTML] return app.exec(); } ================================================ FILE: doc/codesnippets/webkitsnippets/qtwebkit_qwebinspector_snippet.cpp ================================================ def wrapInFunction(): //! [0] # ... page = QWebPage() # ... inspector = QWebInspector() inspector.setPage(page) //! [0] ================================================ FILE: doc/codesnippets/webkitsnippets/qtwebkit_qwebview_snippet.cpp ================================================ def wrapInFunction(): //! [0] view.page().history() //! [0] //! [1] view.page().settings() //! [1] //! [2] view.triggerAction(QWebPage.Copy) //! [2] //! [3] view.page().triggerPageAction(QWebPage.Stop) //! [3] //! [4] view.page().triggerPageAction(QWebPage.GoBack) //! [4] //! [5] view.page().triggerPageAction(QWebPage.GoForward) //! [5] ================================================ FILE: doc/codesnippets/webkitsnippets/simple/main.cpp ================================================ from PySide.QtCore import * from PySide.QtGui import * from PySide.QtWebKit import * import sys app = QApplication(sys.argv) parent = None //! [Using QWebView] view = QWebView(parent) view.load(QUrl("http://qt.nokia.com/")) view.show() //! [Using QWebView] sys.exit(app.exec_()) ================================================ FILE: doc/codesnippets/webkitsnippets/webelement/main.cpp ================================================ def traverse(): //! [Traversing with QWebElement] frame.setHtml("<html><body><p>First Paragraph</p><p>Second Paragraph</p></body></html>") doc = frame.documentElement() body = doc.firstChild() firstParagraph = body.firstChild() secondParagraph = firstParagraph.nextSibling() //! [Traversing with QWebElement] def findButtonAndClick(): frame.setHtml("<form name=\"myform\" action=\"submit_form.asp\" method=\"get\">" \ "<input type=\"text\" name=\"myfield\">" \ "<input type=\"submit\" value=\"Submit\">" \ "</form>") //! [Calling a DOM element method] document = frame.documentElement() # Assume that the document has the following structure: # # <form name="myform" action="submit_form.asp" method="get"> # <input type="text" name="myfield"> # <input type="submit" value="Submit"> # </form> button = document.findFirst("input[type=submit]") button.evaluateJavaScript("click()") //! [Calling a DOM element method] def autocomplete1(): document = frame.documentElement() //! [autocomplete1] firstTextInput = document.findFirst("input[type=text]") storedText = firstTextInput.attribute("value") //! [autocomplete1] def autocomplete2(): document = frame.documentElement() storedText = "text" //! [autocomplete2] firstTextInput = document.findFirst("input[type=text]") textInput.setAttribute("value", storedText) //! [autocomplete2] def findAll(): //! [FindAll] document = frame.documentElement() # Assume the document has the following structure: # # <p class=intro> # <span>Intro</span> # <span>Snippets</span> # </p> # <p> # <span>Content</span> # <span>Here</span> # </p> //! [FindAll intro] allSpans = document.findAll("span") introSpans = document.findAll("p.intro span") //! [FindAll intro] //! [FindAll] ================================================ FILE: doc/codesnippets/webkitsnippets/webpage/main.cpp ================================================ //! [0] class Thumbnailer (QObject): def __init__(self, url): //! [1] QObject.__init__(self) self.page = QWebPage() self.page.mainFrame().load(url) page.loadFinished[bool].connect(self.render) //! [1] finished = Signal() //! [2] def render(self): self.page.setViewportSize(self.page.mainFrame().contentsSize()) image = QImage(self.page.viewportSize(), QImage.Format_ARGB32) painter = QPainter(image) self.page.mainFrame().render(painter) painter.end() thumbnail = image.scaled(400, 400) thumbnail.save("thumbnail.png") self.finished.emit() //! [2] //! [0] app = QApplication(sys.argv) thumbnail = Thumbnailer(QUrl("http://qt.nokia.com")) thumbnail.finished.connect(app.quit) sys.exit(app.exec_()) ================================================ FILE: doc/conf.py.in ================================================ # -*- coding: utf-8 -*- # # PySide documentation build configuration file, created by # sphinx-quickstart on Wed Apr 22 15:04:20 2009. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.append('@CMAKE_CURRENT_SOURCE_DIR@') sys.path.append('@pyside_BINARY_DIR@') # -- General configuration ----------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.todo', 'sphinx.ext.graphviz', 'inheritance_diagram', 'pysideinclude'] rst_epilog = """ .. |project| replace:: PySide """ # Add any paths that contain templates here, relative to this directory. templates_path = ['@CMAKE_CURRENT_SOURCE_DIR@/_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. source_encoding = 'utf-8' # The master toctree document. master_doc = 'contents' # General information about the project. project = u'PySide' copyright = u'2009-2011, Nokia Corporation' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '@BINDING_API_VERSION@' # The full version, including alpha/beta/rc tags. release = '@BINDING_API_VERSION_FULL@' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = ['_build', 'extras'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. html_theme = 'pysidedocs' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = { #} # Add any paths that contain custom themes here, relative to this directory. html_theme_path = ['@CMAKE_CURRENT_SOURCE_DIR@/_themes'] # The name for this set of Sphinx documents. If None, it defaults to # "<project> v<release> documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". #html_static_path = ['@CMAKE_CURRENT_SOURCE_DIR@/_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = { '' : ''} # Additional templates that should be rendered to pages, maps page names to # template names. html_additional_pages = { 'index' : 'index.html'} # If false, no module index is generated. #html_use_modindex = True # If false, no index is generated. html_use_index = False # If true, the index is split into individual pages for each letter. html_split_index = False # If true, links to the reST sources are added to the pages. html_show_sourcelink = False html_add_permalinks = True # If true, an OpenSearch description file will be output, and all pages will # contain a <link> tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. #htmlhelp_basename = 'PySideDoc' ================================================ FILE: doc/contents.rst ================================================ PySide Documentation contents ***************************** .. toctree:: :maxdepth: 2 modules.rst Tutorials ========= .. toctree:: :maxdepth: 2 tutorials/index.rst Other stuff =========== .. toctree:: :maxdepth: 1 pysideapi2.rst pysideversion.rst Module Index ============ * :ref:`modindex` ================================================ FILE: doc/extras/PySide.QtCore.ClassInfo.rst ================================================ .. module:: PySide.QtCore .. _ClassInfo: ClassInfo ********* This class is used to associates extra information to the class, which is available using QObject.metaObject(). Qt and PySide doesn't use this information. The extra information takes the form of a dictionary with key and value in a literal string. .. note:: This Class is a implementation of Q_CLASSINFO macro. Example ------- :: @ClassInfo(Author='PySide Team', URL='http://www.pyside.org') class MyObject(QObject): ... ================================================ FILE: doc/extras/PySide.QtCore.Signal.rst ================================================ .. module:: PySide.QtCore .. _Signal: Signal ****** Synopsis -------- Functions ^^^^^^^^^ +---------------------------------------------------------------------------------------------+ |def :meth:`connect<Signal.connect>` (receiver) | +---------------------------------------------------------------------------------------------+ |def :meth:`disconnect<Signal.disconnect>` (receiver) | +---------------------------------------------------------------------------------------------+ |def :meth:`emit<Signal.disconnect>` (\*args) | +---------------------------------------------------------------------------------------------+ Detailed Description -------------------- The :class:`~.Signal` class provides a way to declare and connect Qt signals in a pythonic way. PySide adopt PyQt's new signal and slot syntax as-is. The PySide implementation is functionally compatible with the PyQt 4.5 one, with the exceptions listed bellow. .. method:: Signal.connect(receiver[, type=Qt.AutoConnection]) Create a connection between this signal and a `receiver`, the `receiver` can be a Python callable, a :class:`Slot` or a :class:`Signal`. .. method:: Signal.disconnect(receiver) Disconnect this signal from a `receiver`, the `receiver` can be a Python callable, a :class:`Slot` or a :class:`Signal`. .. method:: Signal.emit(*args) `args` is the arguments to pass to any connected slots, if any. ================================================ FILE: doc/extras/PySide.QtCore.Slot.rst ================================================ .. module:: PySide.QtCore .. _Slot: Slot **** Detailed Description -------------------- PySide adopt PyQt's new signal and slot syntax as-is. The PySide implementation is functionally compatible with the PyQt 4.5 one, with the exceptions listed bellow. PyQt's new signal and slot style utilizes method and decorator names specific to their implementation. These will be generalized according to the table below: ======= ====================== ============= Module PyQt factory function PySide class ======= ====================== ============= QtCore pyqtSignal Signal QtCore pyqtSlot Slot ======= ====================== ============= Q_INVOKABLE ----------- PySide doesn't offer something identical to Q_INVOKABLE macro of Qt, the reason is simple, PySide slots can have return values, so if you need to create a invokable method that returns some value, declare it as a slot, e.g.: :: class Foo(QObject): @Slot(result=int, float) def getFloatReturnInt(self, f): return int(f) ================================================ FILE: doc/extras/PySide.QtCore.rst ================================================ All other Qt modules rely on this module. To include the definitions of the module's classes, use the following directive: :: import PySide.QtCore ================================================ FILE: doc/extras/PySide.QtDeclarative.ListProperty.rst ================================================ .. module:: PySide.QtDeclarative .. _ListProperty: ListProperty ************ Synopsis -------- The The :class:`~.ListProperty` class allows applications to expose list-like properties to QML. Detailed Description -------------------- The :class:`~.ListProperty` class provides a replacement to QDeclarativeListProperty. :class:`~.ListProperty` is a subclass of :class:`QtCore.Property`, that support the following keywords. `type` the type used in the list `append` Function used to append itens `at` Function used to retrieve item from the list `clear` Function used to clear the list `count` Function used to retrieve the list size QML has many list properties, where more than one object value can be assigned. The use of a list property from QML looks like this: :: FruitBasket { fruit: [ Apple {}, Orange{}, Banana{} ] } The :class:`~.ListProperty` encapsulates a group of callbacks that represent the set of actions QML can perform on the list - adding items, retrieving items and clearing the list. In the future, additional operations may be supported. All list properties must implement the append operation, but the rest are optional. To provide a list property, a class must implement the operation callbacks, and then return an appropriate value from the property getter. List properties should have no setter. In the example above, the ListProperty declarative will look like this: :: slices = ListProperty(PieSlice, append=appendSlice) Note: :class:`~.ListProperty` can only be used for lists of QObject-derived object pointers. ================================================ FILE: doc/extras/PySide.QtDeclarative.rst ================================================ To include the definitions of the module's classes, use the following directive: :: import PySide.QtDeclarative ================================================ FILE: doc/extras/PySide.QtGui.rst ================================================ To include the definitions of modules classes, use the following directive: :: import PySide.QtGui .. seealso:: :mod:`PySide.QtCore` ================================================ FILE: doc/extras/PySide.QtHelp.rst ================================================ To include the definitions of the module's classes, use the following directive: :: import PySide.QtHelp License Information ------------------- The QtHelp module uses the CLucene indexing library to provide full-text searching capabilities for Qt Assistant and applications that use the features of QtHelp. Qt Commercial Edition licensees that wish to distribute applications that use these features of the QtHelp module need to be aware of their obligations under the GNU Lesser General Public License (LGPL). Developers using the Open Source Edition can choose to redistribute the module under the appropriate version of the GNU LGPL; version 2.1 for applications and libraries licensed under the GNU GPL version 2, or version 3 for applications and libraries licensed under the GNU GPL version 3. Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team Changes are Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ================================================ FILE: doc/extras/PySide.QtMultimedia.rst ================================================ To include the definitions of the module's classes, use the following directive: :: import PySide.QtMultimedia ================================================ FILE: doc/extras/PySide.QtNetwork.rst ================================================ To include the definitions of the module's classes, use the following directive: :: import PySide.QtNetwork ================================================ FILE: doc/extras/PySide.QtOpenGL.rst ================================================ OpenGL is a standard API for rendering 3D graphics. OpenGL only deals with 3D rendering and provides little or no support for GUI programming issues. The user interface for an OpenGL application must be created with another toolkit, such as Motif on the X platform, Microsoft Foundation Classes (MFC) under Windows, or Qt on both platforms. .. note:: OpenGL is a trademark of Silicon Graphics, Inc. in the United States and other countries. The Qt OpenGL module makes it easy to use OpenGL in Qt applications. It provides an OpenGL widget class that can be used just like any other Qt widget, except that it opens an OpenGL display buffer where you can use the OpenGL API to render the contents. To include the definitions of the module's classes, use the following directive: :: import PySide.QtOpenGL The Qt OpenGL module is implemented as a platform-independent wrapper around the platform-dependent GLX (version 1.3 or later), WGL, or AGL C APIs. Although the basic functionality provided is very similar to Mark Kilgard's GLUT library, applications using the Qt OpenGL module can take advantage of the whole Qt API for non-OpenGL-specific GUI functionality. The QtOpenGL module is available on Windows, X11 and Mac OS X. Qt for Embedded Linux and OpenGL supports OpenGL ES (OpenGL for Embedded Systems). ================================================ FILE: doc/extras/PySide.QtScript.rst ================================================ The QtScript module only provides core scripting facilities; the QtScriptTools module provides additional Qt Script-related components that application developers may find useful. To include the definitions of the module's classes, use the following directive: :: import PySide.QtScript License Information ------------------- Qt Commercial Edition licensees that wish to distribute applications that use the QtScript module need to be aware of their obligations under the GNU Library General Public License (LGPL). Developers using the Open Source Edition can choose to redistribute the module under the appropriate version of the GNU LGPL. QtScript is licensed under the GNU Library General Public License. Individual contributor names and copyright dates can be found inline in the code. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ================================================ FILE: doc/extras/PySide.QtScriptTools.rst ================================================ Applications that use the Qt Script Tools classes need to be configured to be built against the QtScriptTools module. To include the definitions of the module's classes, use the following directive: :: import PySide.QtScriptTools ================================================ FILE: doc/extras/PySide.QtSql.rst ================================================ To include the definitions of the module's classes, use the following directive: :: import PySide.QtSql ================================================ FILE: doc/extras/PySide.QtSvg.rst ================================================ To include the definitions of the module's classes, use the following directive: :: import PySide.QtSvg License Information ------------------- Some code for arc handling in this module is derived from code with the following license: Copyright 2002 USC/Information Sciences Institute Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Information Sciences Institute not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Information Sciences Institute makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. INFORMATION SCIENCES INSTITUTE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL INFORMATION SCIENCES INSTITUTE BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ================================================ FILE: doc/extras/PySide.QtTest.rst ================================================ To include the definitions of the module's classes, use the following directive: :: import PySide.QtTest .. note:: All macros in the C++ version of QtTest were not binded in PySide, this module is useful only for GUI testing and benchmarking, for ordinary unit testing you should use the ``unittest`` Python module. ================================================ FILE: doc/extras/PySide.QtUiTools.rst ================================================ These forms are processed at run-time to produce dynamically-generated user interfaces. In order to generate a form at run-time, a resource file containing a UI file is needed. A form loader object, provided by the QUiLoader class, is used to construct the user interface. This user interface can be retrieved from any QIODevice; for example, a QFile object can be used to obtain a form stored in a project's resources. The :meth:`PySide.QtUiTools.QUiLoader.load` function takes the user interface description contained in the file and constructs the form widget. To include the definitions of the module's classes, use the following directive: :: import PySide..QtUiTools ================================================ FILE: doc/extras/PySide.QtWebKit.rst ================================================ QtWebKit provides a Web browser engine that makes it easy to embed content from the World Wide Web into your Qt application. At the same time Web content can be enhanced with native controls. QtWebKit provides facilities for rendering of HyperText Markup Language (HTML), Extensible HyperText Markup Language (XHTML) and Scalable Vector Graphics (SVG) documents, styled using Cascading Style Sheets (CSS) and scripted with JavaScript. A bridge between the JavaScript execution environment and the Qt object model makes it possible for custom QObjects to be scripted. Integration with the Qt networking module enables Web pages to be transparently loaded from Web servers, the local file system or even the Qt resource system. In addition to providing pure rendering features, HTML documents can be made fully editable to the user through the use of the contenteditable attribute on HTML elements. QtWebKit is based on the Open Source WebKit engine. More information about WebKit itself can be found on the _`WebKit Open Source Project <http://webkit.org/>` Web site. Including In Your Project ------------------------- To include the definitions of the module's classes, use the following directive: :: import PySide.QtWebKit .. note:: Web site icons, also known as "FavIcons", are currently not supported on Windows. We plan to address this in a future release. Architecture ------------ The easiest way to render content is through the QWebView class. As a widget it can be embedded into your forms or a graphics view, and it provides convenience functions for downloading and rendering web sites. :: view = QWebView(parent) view.load(QUrl("http://qt.nokia.com/")) view.show() QWebView is used to view Web pages. An instance of QWebView has one QWebPage. QWebPage provides access to the document structure in a page, describing features such as frames, the navigation history, and the undo/redo stack for editable content. HTML documents can be nested using frames in a frameset. An individual frame in HTML is represented using the QWebFrame class. This class includes the bridge to the JavaScript window object and can be painted using QPainter. Each QWebPage has one QWebFrame object as its main frame, and the main frame may contain many child frames. Individual elements of an HTML document can be accessed via DOM JavaScript interfaces from within a web page. The equivalent of this API in QtWebKit is represented by QWebElement. QWebElement objects are obtained using QWebFrame's findAllElements() and findFirstElement() functions with CSS selector queries. Common web browser features, defaults and other settings can be configured through the QWebSettings class. It is possible to provide defaults for all QWebPage instances through the default settings. Individual attributes can be overidden by the page specific settings object. Netscape Plugin Support ----------------------- .. note:: Netscape plugin support is only available on desktop platforms. Since WebKit supports the Netscape Plugin API, Qt applications can display Web pages that embed common plugins on platforms for which those plugins are available. To enable plugin support, the user must have the appropriate binary files for those plugins installed and the ``QWebSettings.PluginsEnabled`` attribute must be enabled for the application. The following locations are searched for plugins: * Linux/Unix (X11) * .mozilla/plugins in the user's home directory * .netscape/plugins in the user's home directory * System locations, such as * /usr/lib/browser/plugins * /usr/local/lib/mozilla/plugins * /usr/lib/firefox/plugins * /usr/lib64/browser-plugins * /usr/lib/browser-plugins * /usr/lib/mozilla/plugins * /usr/local/netscape/plugins * /opt/mozilla/plugins * /opt/mozilla/lib/plugins * /opt/netscape/plugins * /opt/netscape/communicator/plugins * /usr/lib/netscape/plugins * /usr/lib/netscape/plugins-libc5 * /usr/lib/netscape/plugins-libc6 * /usr/lib64/netscape/plugins * /usr/lib64/mozilla/plugins * Locations specified by environment variables: * $MOZILLA_HOME/plugins * $MOZ_PLUGIN_PATH * $QTWEBKIT_PLUGIN_PATH * Windows * The user's Application Data\Mozilla\plugins directory * Standard system locations of plugins for Quicktime, Flash, etc. * Mac OS X * Library/Internet Plug-Ins in the user's home directory * The system /Library/Internet Plug-Ins directory License Information ------------------- Qt Commercial Edition licensees that wish to distribute applications that use the QtWebKit module need to be aware of their obligations under the GNU Library General Public License (LGPL). Developers using the Open Source Edition can choose to redistribute the module under the appropriate version of the GNU LGPL. WebKit is licensed under the GNU Library General Public License. Individual contributor names and copyright dates can be found inline in the code. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ================================================ FILE: doc/extras/PySide.QtXml.rst ================================================ To include the definitions of the module's classes, use the following directive: :: import PySide.QtXml ================================================ FILE: doc/extras/PySide.QtXmlPatterns.rst ================================================ To include the definitions of the module's classes, use the following directive: :: import PySide.QtXmlPatterns Further Reading --------------- General overviews of XQuery and XSchema can be found in the XQuery document. An introduction to the XQuery language can be found in A Short Path to XQuery. License Information ------------------- The XML Schema implementation provided by this module contains the xml.xsd file (located in src/xmlpatterns/schema/schemas) which is licensed under the terms given below. This module is always built with XML Schema support enabled. W3C© SOFTWARE NOTICE AND LICENSE This license came from: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 This work (and included software, documentation such as READMEs, or other related items) is being provided by the copyright holders under the following license. By obtaining, using and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions. Permission to copy, modify, and distribute this software and its documentation, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the software and documentation or portions thereof, including modifications: * The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. * Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software Short Notice should be included (hypertext is preferred, text is permitted) within the body of any redistributed or derivative code. * Notice of any changes or modifications to the files, including the date changes were made. (We recommend you provide URIs to the location from which the code is derived.) THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software without specific, written prior permission. Title to copyright in this software and any associated documentation will at all times remain with copyright holders. ================================================ FILE: doc/extras/PySide.phonon.rst ================================================ Phonon is a cross-platform multimedia framework that enables the use of audio and video content in Qt applications. The Phonon Overview document provides an introduction to the architecture and features included in Phonon. The Phonon namespace contains a list of all classes, functions and namespaces provided by the module. To include the definitions of modules classes, use the following directive: :: import PySide.phonon Qt Backends ----------- Qt Backends are currently developed for Phonon version 4.1. The Phonon project has moved on and introduced new features that the Qt Backends do not implement. We have chosen not to document the part of Phonon that we do not support. Any class or function not appearing in our documentation can be considered unsupported. License Information ------------------- Qt Commercial Edition licensees that wish to distribute applications that use the Phonon module need to be aware of their obligations under the GNU Lesser General Public License (LGPL). Developers using the Open Source Edition can choose to redistribute the module under the appropriate version of the GNU LGPL; version 2.1 for applications and libraries licensed under the GNU GPL version 2, or version 3 for applications and libraries licensed under the GNU GPL version 3. This file is part of the KDE project * Copyright (C) 2004-2009 Matthias Kretz <kretz@kde.org> * Copyright (C) 2008 Ian Monroe <ian@monroe.nu> * Copyright (C) 2007-2008 Trolltech ASA * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). Contact: http://www.qt-project.org/legal This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ================================================ FILE: doc/inheritance_diagram.py ================================================ # -*- coding: utf-8 -*- r""" sphinx.ext.inheritance_diagram ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines a docutils directive for inserting inheritance diagrams. Provide the directive with one or more classes or modules (separated by whitespace). For modules, all of the classes in that module will be used. Example:: Given the following classes: class A: pass class B(A): pass class C(A): pass class D(B, C): pass class E(B): pass .. inheritance-diagram: D E Produces a graph like the following: A / \ B C / \ / E D The graph is inserted as a PNG+image map into HTML and a PDF in LaTeX. :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :copyright: Copyright 2010-2011 by the PySide team. :license: BSD, see LICENSE for details. """ import os import re import sys import inspect try: from hashlib import md5 except ImportError: from md5 import md5 from docutils import nodes from docutils.parsers.rst import directives from sphinx.ext.graphviz import render_dot_html, render_dot_latex from sphinx.util.compat import Directive class_sig_re = re.compile(r'''^([\w.]*\.)? # module names (\w+) \s* $ # class/final module name ''', re.VERBOSE) class InheritanceException(Exception): pass class InheritanceGraph(object): """ Given a list of classes, determines the set of classes that they inherit from all the way to the root "object", and then is able to generate a graphviz dot graph from them. """ def __init__(self, class_names, currmodule, show_builtins=False, parts=0): """ *class_names* is a list of child classes to show bases from. If *show_builtins* is True, then Python builtins will be shown in the graph. """ self.class_names = class_names classes = self._import_classes(class_names, currmodule) self.class_info = self._class_info(classes, show_builtins, parts) if not self.class_info: raise InheritanceException('No classes found for ' 'inheritance diagram') def _import_class_or_module(self, name, currmodule): """ Import a class using its fully-qualified *name*. """ try: path, base = class_sig_re.match(name).groups() except (AttributeError, ValueError): raise InheritanceException('Invalid class or module %r specified ' 'for inheritance diagram' % name) fullname = (path or '') + base path = (path and path.rstrip('.') or '') # two possibilities: either it is a module, then import it try: __import__(fullname) todoc = sys.modules[fullname] except ImportError: # else it is a class, then import the module if not path: if currmodule: # try the current module path = currmodule else: raise InheritanceException( 'Could not import class %r specified for ' 'inheritance diagram' % base) try: __import__(path) todoc = getattr(sys.modules[path], base) except (ImportError, AttributeError): raise InheritanceException( 'Could not import class or module %r specified for ' 'inheritance diagram' % (path + '.' + base)) # If a class, just return it if inspect.isclass(todoc): return [todoc] elif inspect.ismodule(todoc): classes = [] for cls in todoc.__dict__.values(): if inspect.isclass(cls) and cls.__module__ == todoc.__name__: classes.append(cls) return classes raise InheritanceException('%r specified for inheritance diagram is ' 'not a class or module' % name) def _import_classes(self, class_names, currmodule): """Import a list of classes.""" classes = [] for name in class_names: classes.extend(self._import_class_or_module(name, currmodule)) return classes def _class_info(self, classes, show_builtins, parts): """Return name and bases for all classes that are ancestors of *classes*. *parts* gives the number of dotted name parts that is removed from the displayed node names. """ all_classes = {} builtins = __builtins__.values() def recurse(cls): if not show_builtins and cls in builtins: return nodename = self.class_name(cls, parts) fullname = self.class_name(cls, 0) baselist = [] all_classes[cls] = (nodename, fullname, baselist) for base in cls.__bases__: if not show_builtins and base in builtins: continue if base.__name__ == "Object" and base.__module__ == "Shiboken": continue baselist.append(self.class_name(base, parts)) if base not in all_classes: recurse(base) for cls in classes: recurse(cls) return all_classes.values() def class_name(self, cls, parts=0): """Given a class object, return a fully-qualified name. This works for things I've tested in matplotlib so far, but may not be completely general. """ module = cls.__module__ if module == '__builtin__': fullname = cls.__name__ else: fullname = '%s.%s' % (module, cls.__name__) if parts == 0: return fullname name_parts = fullname.split('.') return '.'.join(name_parts[-parts:]) def get_all_class_names(self): """ Get all of the class names involved in the graph. """ return [fullname for (_, fullname, _) in self.class_info] # These are the default attrs for graphviz default_graph_attrs = { 'rankdir': 'LR', 'size': '"8.0, 12.0"', } default_node_attrs = { 'shape': 'box', 'fontsize': 10, 'height': 0.25, 'fontname': 'Vera Sans, DejaVu Sans, Liberation Sans, ' 'Arial, Helvetica, sans', 'style': '"setlinewidth(0.5)"', } default_edge_attrs = { 'arrowsize': 0.5, 'style': '"setlinewidth(0.5)"', } def _format_node_attrs(self, attrs): return ','.join(['%s=%s' % x for x in attrs.items()]) def _format_graph_attrs(self, attrs): return ''.join(['%s=%s;\n' % x for x in attrs.items()]) def generate_dot(self, name, urls={}, env=None, graph_attrs={}, node_attrs={}, edge_attrs={}): """ Generate a graphviz dot graph from the classes that were passed in to __init__. *name* is the name of the graph. *urls* is a dictionary mapping class names to HTTP URLs. *graph_attrs*, *node_attrs*, *edge_attrs* are dictionaries containing key/value pairs to pass on as graphviz properties. """ g_attrs = self.default_graph_attrs.copy() n_attrs = self.default_node_attrs.copy() e_attrs = self.default_edge_attrs.copy() g_attrs.update(graph_attrs) n_attrs.update(node_attrs) e_attrs.update(edge_attrs) if env: g_attrs.update(env.config.inheritance_graph_attrs) n_attrs.update(env.config.inheritance_node_attrs) e_attrs.update(env.config.inheritance_edge_attrs) res = [] res.append('digraph %s {\n' % name) res.append(self._format_graph_attrs(g_attrs)) for name, fullname, bases in self.class_info: # Write the node this_node_attrs = n_attrs.copy() url = urls.get(fullname) if url is not None: this_node_attrs['URL'] = '"%s"' % url res.append(' "%s" [%s];\n' % (name, self._format_node_attrs(this_node_attrs))) # Write the edges for base_name in bases: res.append(' "%s" -> "%s" [%s];\n' % (base_name, name, self._format_node_attrs(e_attrs))) res.append('}\n') return ''.join(res) class inheritance_diagram(nodes.General, nodes.Element): """ A docutils node to use as a placeholder for the inheritance diagram. """ pass class InheritanceDiagram(Directive): """ Run when the inheritance_diagram directive is first encountered. """ has_content = False required_arguments = 1 optional_arguments = 0 final_argument_whitespace = True option_spec = { 'parts': directives.nonnegative_int, } def run(self): node = inheritance_diagram() node.document = self.state.document env = self.state.document.settings.env class_names = self.arguments[0].split() class_role = env.get_domain('py').role('class') # Store the original content for use as a hash node['parts'] = self.options.get('parts', 0) node['content'] = ', '.join(class_names) # Create a graph starting with the list of classes try: graph = InheritanceGraph( class_names, env.temp_data.get('py:module'), parts=node['parts']) except InheritanceException, err: return [node.document.reporter.warning(err.args[0], line=self.lineno)] # Create xref nodes for each target of the graph's image map and # add them to the doc tree so that Sphinx can resolve the # references to real URLs later. These nodes will eventually be # removed from the doctree after we're done with them. for name in graph.get_all_class_names(): refnodes, x = class_role( 'class', ':class:`%s`' % name, name, 0, self.state) node.extend(refnodes) # Store the graph object so we can use it to generate the # dot file later node['graph'] = graph return [node] def get_graph_hash(node): return md5(node['content'] + str(node['parts'])).hexdigest()[-10:] def html_visit_inheritance_diagram(self, node): """ Output the graph for HTML. This will insert a PNG with clickable image map. """ graph = node['graph'] graph_hash = get_graph_hash(node) name = 'inheritance%s' % graph_hash # Create a mapping from fully-qualified class names to URLs. urls = {} for child in node: if child.get('refuri') is not None: urls[child['reftitle']] = child.get('refuri') elif child.get('refid') is not None: urls[child['reftitle']] = '#' + child.get('refid') dotcode = graph.generate_dot(name, urls, env=self.builder.env) render_dot_html(self, node, dotcode, [], 'inheritance', 'inheritance', alt='Inheritance diagram of ' + node['content']) raise nodes.SkipNode def latex_visit_inheritance_diagram(self, node): """ Output the graph for LaTeX. This will insert a PDF. """ graph = node['graph'] graph_hash = get_graph_hash(node) name = 'inheritance%s' % graph_hash dotcode = graph.generate_dot(name, env=self.builder.env, graph_attrs={'size': '"6.0,6.0"'}) render_dot_latex(self, node, dotcode, [], 'inheritance') raise nodes.SkipNode def skip(self, node): raise nodes.SkipNode def setup(app): app.setup_extension('sphinx.ext.graphviz') app.add_node( inheritance_diagram, latex=(latex_visit_inheritance_diagram, None), html=(html_visit_inheritance_diagram, None), text=(skip, None), man=(skip, None)) app.add_directive('inheritance-diagram', InheritanceDiagram) app.add_config_value('inheritance_graph_attrs', {}, False), app.add_config_value('inheritance_node_attrs', {}, False), app.add_config_value('inheritance_edge_attrs', {}, False), ================================================ FILE: doc/modules.rst ================================================ PySide modules ************** Qt is splitted in several modules. .. toctree:: :maxdepth: 1 PySide/QtCore/index.rst PySide/QtDeclarative/index.rst PySide/QtGui/index.rst PySide/QtHelp/index.rst PySide/QtMaemo5/index.rst PySide/QtMultimedia/index.rst PySide/QtNetwork/index.rst PySide/QtOpenGL/index.rst PySide/QtScript/index.rst PySide/QtScriptTools/index.rst PySide/QtSql/index.rst PySide/QtSvg/index.rst PySide/QtUiTools/index.rst PySide/QtXml/index.rst PySide/QtWebKit/index.rst PySide/phonon/index.rst ================================================ FILE: doc/pyhtml2devhelp.py ================================================ """ This script is based on Python2.6 Ubuntu package script: Copyright (C) 2009 Matthias Klose <doko@debian.org> Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ #! /usr/bin/python import formatter, htmllib import os, sys, re class PyHTMLParser(htmllib.HTMLParser): pages_to_include = set(('index.html', 'PySide/QtHelp/index.html', 'PySide/QtSvg/index.html', 'PySide/QtGui/index.html', 'PySide/QtNetwork/index.html', 'PySide/QtWebKit/index.html', 'PySide/QtUiTools/index.html', 'PySide/QtXml/index.html', 'PySide/QtCore/index.html', 'PySide/QtScriptTools/index.html', 'PySide/QtOpenGL/index.html', 'PySide/QtScript/index.html', 'PySide/QtSql/index.html', 'howto-build/index.html')) def __init__(self, formatter, basedir, fn, indent, parents=set()): htmllib.HTMLParser.__init__(self, formatter) self.basedir = basedir self.dir, self.fn = os.path.split(fn) self.data = '' self.parents = parents self.link = {} self.indent = indent self.last_indent = indent - 1 self.sub_indent = 0 self.sub_count = 0 self.next_link = False def process_link(self): new_href = os.path.join(self.dir, self.link['href']) text = self.link['text'] indent = self.indent + self.sub_indent if self.last_indent == indent: print '%s</sub>' % (' ' * self.last_indent) self.sub_count -= 1 print '%s<sub link="%s" name="%s">' % (' ' * indent, new_href, text) self.sub_count += 1 self.last_indent = self.indent + self.sub_indent def start_li(self, attrs): self.sub_indent += 1 self.next_link = True def end_li(self): indent = self.indent + self.sub_indent if self.sub_count > 0: print '%s</sub>' % (' ' * self.last_indent) self.sub_count -= 1 self.last_indent -= 1 self.sub_indent -= 1 def start_a(self, attrs): self.link = {} for attr in attrs: self.link[attr[0]] = attr[1] self.data = '' def end_a(self): process = False text = self.data.replace('\t', '').replace('\n', ' ').replace('&', '&').replace('<', '<').replace('>', '>') self.link['text'] = text # handle a tag without href attribute try: href = self.link['href'] except KeyError: return abs_href = os.path.join(self.basedir, href) if abs_href in self.parents: return if href.startswith('..') or href.startswith('http:') \ or href.startswith('mailto:') or href.startswith('news:'): return if href in ('', 'about.html', 'modindex.html', 'genindex.html', 'glossary.html', 'search.html', 'contents.html', 'download.html', 'bugs.html', 'license.html', 'copyright.html'): return if self.link.has_key('class'): if self.link['class'] in ('biglink'): process = True if self.link['class'] in ('reference external'): if self.next_link: process = True next_link = False if process == True: self.process_link() if href in self.pages_to_include: self.parse_file(os.path.join(self.dir, href)) def finish(self): if self.sub_count > 0: print '%s</sub>' % (' ' * self.last_indent) def handle_data(self, data): self.data += data def parse_file(self, href): # TODO basedir bestimmen parent = os.path.join(self.basedir, self.fn) self.parents.add(parent) parser = PyHTMLParser(formatter.NullFormatter(), self.basedir, href, self.indent + 1, self.parents) text = file(self.basedir + '/' + href).read() parser.feed(text) parser.finish() parser.close() if parent in self.parents: self.parents.remove(parent) class PyIdxHTMLParser(htmllib.HTMLParser): def __init__(self, formatter, basedir, fn, indent): htmllib.HTMLParser.__init__(self, formatter) self.basedir = basedir self.dir, self.fn = os.path.split(fn) self.data = '' self.link = {} self.indent = indent self.active = False self.indented = False self.nolink = False self.header = '' self.last_letter = 'Z' self.last_text = '' def process_link(self): new_href = os.path.join(self.dir, self.link['href']) text = self.link['text'] if not self.active: return if text.startswith('['): return if self.link.get('rel', None) in ('prev', 'parent', 'next', 'contents', 'index'): return if self.indented: text = self.last_text + ' ' + text else: # Save it in case we need it again self.last_text = re.sub(' \([\w\-\.\s]+\)', '', text) indent = self.indent print '%s<function link="%s" name="%s"/>' % (' ' * indent, new_href, text) def start_dl(self, attrs): if self.last_text: # Looks like we found the second part to a command self.indented = True def end_dl(self): self.indented = False def start_dt(self, attrs): self.data = '' self.nolink = True def end_dt(self): if not self.active: return if self.nolink == True: # Looks like we found the first part to a command self.last_text = re.sub(' \([\w\-\.\s]+\)', '', self.data) self.nolink = False def start_h2(self, attrs): for k, v in attrs: if k == 'id': self.header = v if v == '_': self.active = True def start_td(self, attrs): self.indented = False self.last_text = '' def start_table(self, attrs): pass def end_table(self): if self.header == self.last_letter: self.active = False def start_a(self, attrs): self.nolink = False self.link = {} for attr in attrs: self.link[attr[0]] = attr[1] self.data = '' def end_a(self): text = self.data.replace('\t', '').replace('\n', ' ').replace('&', '&').replace('<', '<').replace('>', '>') self.link['text'] = text # handle a tag without href attribute try: href = self.link['href'] except KeyError: return self.process_link() def handle_data(self, data): self.data += data def main(): base = sys.argv[1] fn = sys.argv[2] parser = PyHTMLParser(formatter.NullFormatter(), base, fn, indent=0) print '<?xml version="1.0" encoding="iso-8859-1"?>' print '<book title="PySide %s Documentation" name="PySide" version="%s" link="index.html">' % (sys.argv[3], sys.argv[3]) print '<chapters>' parser.parse_file(fn) print '</chapters>' print '<functions>' fn = 'genindex.html' parser = PyIdxHTMLParser(formatter.NullFormatter(), base, fn, indent=1) text = file(base + '/' + fn).read() parser.feed(text) parser.close() print '</functions>' print '</book>' main() ================================================ FILE: doc/pyside.qdocconf.in ================================================ ######################## compat.qdocconf alias.i = e alias.include = input macro.0 = "\\\\0" macro.b = "\\\\b" macro.n = "\\\\n" macro.r = "\\\\r" macro.i = "\\o" macro.i11 = "\\o{1,1}" macro.i12 = "\\o{1,2}" macro.i13 = "\\o{1,3}" macro.i14 = "\\o{1,4}" macro.i15 = "\\o{1,5}" macro.i16 = "\\o{1,6}" macro.i17 = "\\o{1,7}" macro.i18 = "\\o{1,8}" macro.i19 = "\\o{1,9}" macro.i21 = "\\o{2,1}" macro.i31 = "\\o{3,1}" macro.i41 = "\\o{4,1}" macro.i51 = "\\o{5,1}" macro.i61 = "\\o{6,1}" macro.i71 = "\\o{7,1}" macro.i81 = "\\o{8,1}" macro.i91 = "\\o{9,1}" macro.img = "\\image" macro.endquote = "\\endquotation" macro.relatesto = "\\relates" spurious = "Missing comma in .*" \ "Missing pattern .*" ######################## macros.qdocconf macro.aacute.HTML = "á" macro.Aring.HTML = "Å" macro.aring.HTML = "å" macro.Auml.HTML = "Ä" macro.author = "\\bold{Author:}" macro.br.HTML = "<br />" macro.BR.HTML = "<br />" macro.copyright.HTML = "©" macro.eacute.HTML = "é" macro.gui = "\\bold" macro.hr.HTML = "<hr />" macro.iacute.HTML = "í" macro.key = "\\bold" macro.menu = "\\bold" macro.note = "\\bold{Note:}" macro.oslash.HTML = "ø" macro.ouml.HTML = "ö" macro.QA = "\\e{Qt Assistant}" macro.QD = "\\e{Qt Designer}" macro.QL = "\\e{Qt Linguist}" macro.QQV = "\\e{Qt QML Viewer}" macro.qmlbasictype = "\\e" macro.param = "\\e" macro.raisedaster.HTML = "<sup>*</sup>" macro.rarrow.HTML = "→" macro.reg.HTML = "<sup>®</sup>" macro.return = "Returns" macro.starslash = "\\c{*/}" macro.begincomment = "\\c{/*}" macro.endcomment = "\\c{*/}" macro.uuml.HTML = "ü" macro.mdash.HTML = "—" macro.beginfloatleft.HTML = "<div style=\"float: left; margin-right: 2em\">" macro.beginfloatright.HTML = "<div style=\"float: right; margin-left: 2em\">" macro.endfloat.HTML = "</div>" macro.clearfloat.HTML = "<br style=\"clear: both\" />" ######################## qt-cpp-ignore.qdocconf Cpp.ignoretokens = QAXFACTORY_EXPORT \ QDESIGNER_COMPONENTS_LIBRARY \ QDESIGNER_EXTENSION_LIBRARY \ QDESIGNER_SDK_LIBRARY \ QDESIGNER_SHARED_LIBRARY \ QDESIGNER_UILIB_LIBRARY \ QM_EXPORT_CANVAS \ QM_EXPORT_DNS \ QM_EXPORT_DOM \ QM_EXPORT_FTP \ QM_EXPORT_HTTP \ QM_EXPORT_ICONVIEW \ QM_EXPORT_NETWORK \ QM_EXPORT_OPENGL \ QM_EXPORT_OPENVG \ QM_EXPORT_SQL \ QM_EXPORT_TABLE \ QM_EXPORT_WORKSPACE \ QM_EXPORT_XML \ QT_ASCII_CAST_WARN \ QT_ASCII_CAST_WARN_CONSTRUCTOR \ QT_BEGIN_HEADER \ QT_DESIGNER_STATIC \ QT_END_HEADER \ QT_FASTCALL \ QT_WIDGET_PLUGIN_EXPORT \ Q_COMPAT_EXPORT \ Q_CORE_EXPORT \ Q_CORE_EXPORT_INLINE \ Q_EXPLICIT \ Q_EXPORT \ Q_EXPORT_CODECS_CN \ Q_EXPORT_CODECS_JP \ Q_EXPORT_CODECS_KR \ Q_EXPORT_PLUGIN \ Q_GFX_INLINE \ Q_AUTOTEST_EXPORT \ Q_GUI_EXPORT \ Q_GUI_EXPORT_INLINE \ Q_GUI_EXPORT_STYLE_CDE \ Q_GUI_EXPORT_STYLE_COMPACT \ Q_GUI_EXPORT_STYLE_MAC \ Q_GUI_EXPORT_STYLE_MOTIF \ Q_GUI_EXPORT_STYLE_MOTIFPLUS \ Q_GUI_EXPORT_STYLE_PLATINUM \ Q_GUI_EXPORT_STYLE_POCKETPC \ Q_GUI_EXPORT_STYLE_SGI \ Q_GUI_EXPORT_STYLE_WINDOWS \ Q_GUI_EXPORT_STYLE_WINDOWSXP \ QHELP_EXPORT \ Q_INLINE_TEMPLATE \ Q_INTERNAL_WIN_NO_THROW \ Q_NETWORK_EXPORT \ Q_OPENGL_EXPORT \ Q_OPENVG_EXPORT \ Q_OUTOFLINE_TEMPLATE \ Q_SQL_EXPORT \ Q_SVG_EXPORT \ Q_SCRIPT_EXPORT \ Q_SCRIPTTOOLS_EXPORT \ Q_TESTLIB_EXPORT \ Q_TYPENAME \ Q_XML_EXPORT \ Q_XMLSTREAM_EXPORT \ Q_XMLPATTERNS_EXPORT \ QDBUS_EXPORT \ QT_BEGIN_NAMESPACE \ QT_BEGIN_INCLUDE_NAMESPACE \ QT_END_NAMESPACE \ QT_END_INCLUDE_NAMESPACE \ PHONON_EXPORT \ Q_DECLARATIVE_EXPORT \ Q_GADGET \ QWEBKIT_EXPORT Cpp.ignoredirectives = Q_DECLARE_HANDLE \ Q_DECLARE_INTERFACE \ Q_DECLARE_METATYPE \ Q_DECLARE_OPERATORS_FOR_FLAGS \ Q_DECLARE_PRIVATE \ Q_DECLARE_PUBLIC \ Q_DECLARE_SHARED \ Q_DECLARE_TR_FUNCTIONS \ Q_DECLARE_TYPEINFO \ Q_DISABLE_COPY \ QT_FORWARD_DECLARE_CLASS \ Q_DUMMY_COMPARISON_OPERATOR \ Q_ENUMS \ Q_FLAGS \ Q_INTERFACES \ __attribute__ \ K_DECLARE_PRIVATE \ PHONON_OBJECT \ PHONON_HEIR \ Q_PRIVATE_PROPERTY \ Q_DECLARE_PRIVATE_D \ Q_CLASSINFO ######################## qt-defines.qdocconf defines = Q_QDOC \ QT_.*_SUPPORT \ QT_.*_LIB \ QT_COMPAT \ QT_KEYPAD_NAVIGATION \ QT3_SUPPORT \ Q_WS_.* \ Q_OS_.* \ Q_BYTE_ORDER \ QT_DEPRECATED \ Q_NO_USING_KEYWORD \ __cplusplus versionsym = QT_VERSION_STR codeindent = 1 ######################## qt.qdocconf project = Qt versionsym = version = @PYSIDE_QT_VERSION@ description = Qt Reference Documentation url = http://www.pyside.org/docs/pyside-@PYSIDE_QT_VERSION@ language = Cpp headerdirs = @QT_SRC_DIR@/src \ @QT_SRC_DIR@/extensions/activeqt \ @QT_SRC_DIR@/tools/assistant/lib \ @QT_SRC_DIR@/tools/assistant/compat/lib \ @QT_SRC_DIR@/tools/designer/src/uitools \ @QT_SRC_DIR@/tools/designer/src/lib/extension \ @QT_SRC_DIR@/tools/designer/src/lib/sdk \ @QT_SRC_DIR@/tools/designer/src/lib/uilib \ @QT_SRC_DIR@/tools/qtestlib/src \ @QT_SRC_DIR@/tools/qdbus/src \ @pyside_SOURCE_DIR@ sourcedirs = @QT_SRC_DIR@/src \ @QT_SRC_DIR@/doc/src \ @QT_SRC_DIR@/extensions/activeqt \ @QT_SRC_DIR@/tools/assistant/lib \ @QT_SRC_DIR@/tools/assistant/compat/lib \ @QT_SRC_DIR@/tools/designer/src/uitools \ @QT_SRC_DIR@/tools/designer/src/lib/extension \ @QT_SRC_DIR@/tools/designer/src/lib/sdk \ @QT_SRC_DIR@/tools/designer/src/lib/uilib \ @QT_SRC_DIR@/tools/qtestlib/src \ @QT_SRC_DIR@/tools/qdbus \ @pyside_SOURCE_DIR@ excludedirs = @QT_SRC_DIR@/src/3rdparty/clucene \ @QT_SRC_DIR@/src/3rdparty/des \ @QT_SRC_DIR@/src/3rdparty/freetype \ @QT_SRC_DIR@/src/3rdparty/harfbuzz \ @QT_SRC_DIR@/src/3rdparty/kdebase \ @QT_SRC_DIR@/src/3rdparty/libjpeg \ @QT_SRC_DIR@/src/3rdparty/libmng \ @QT_SRC_DIR@/src/3rdparty/libpng \ @QT_SRC_DIR@/src/3rdparty/libtiff \ @QT_SRC_DIR@/src/3rdparty/md4 \ @QT_SRC_DIR@/src/3rdparty/md5 \ @QT_SRC_DIR@/src/3rdparty/patches \ @QT_SRC_DIR@/src/3rdparty/sha1 \ @QT_SRC_DIR@/src/3rdparty/sqlite \ @QT_SRC_DIR@/src/3rdparty/webkit/JavaScriptCore \ @QT_SRC_DIR@/src/3rdparty/webkit/WebCore \ @QT_SRC_DIR@/src/3rdparty/wintab \ @QT_SRC_DIR@/src/3rdparty/zlib \ @QT_SRC_DIR@/src/3rdparty/phonon/gstreamer \ @QT_SRC_DIR@/src/3rdparty/phonon/ds9 \ @QT_SRC_DIR@/src/3rdparty/phonon/qt7 \ @QT_SRC_DIR@/src/3rdparty/phonon/mmf \ @QT_SRC_DIR@/src/3rdparty/phonon/waveout \ @QT_SRC_DIR@/doc/src/snippets \ @QT_SRC_DIR@/doc/src/ja_JP \ @QT_SRC_DIR@/doc/src/zh_CN sources.fileextensions = "*.cpp *.qdoc *.mm" examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp" examples.imageextensions = "*.png" tagfile = @QT_SRC_DIR@/doc/html/qt.tags base = file:@QT_SRC_DIR@/doc/html HTML.generatemacrefs = "true" ######################## pyside.qdocconf quotinginformation = true exampledirs = @QT_SRC_DIR@/doc/src \ @QT_SRC_DIR@/examples \ @QT_SRC_DIR@/examples/tutorials \ @QT_SRC_DIR@ \ @QT_SRC_DIR@/qmake/examples \ @QT_SRC_DIR@/src/3rdparty/webkit/WebKit/qt/docs imagedirs = @QT_SRC_DIR@/doc/src/images \ @QT_SRC_DIR@/examples \ @QT_SRC_DIR@/doc/src/declarative/pics \ @QT_SRC_DIR@/doc/src/template/image outputdir = @DOC_DATA_DIR@ outputformats = WebXML generateindex = false url = . ================================================ FILE: doc/pysideapi2.rst ================================================ .. _pysideapi2: PySide API 2 ************ Since the beginning one of the PySide goals was to be API compatible with PyQt4, but with some (documented) exceptions. For example, PySide will not export to Python components marked as deprecated on C++ Qt. All the modifications follow the `PSEP101 <http://www.pyside.org/docs/pseps/psep-0101.html>`_ as its guideline. The release 4.7 of PyQt4 came with improvements on the pythonic front, being the extinction of QString a good example. PySide followed this change, except in one point: while PyQt4 has conserved the old behavior as optional, PySide bindings fully adopted the new API - completely removing QString. No turning back. Thus remember to update your source code to the new API, this will ensure your code will run on both bindings. __hash__() function return value ================================ The hash value returned for the classes :class:`PySide.QtCore.QDate`, :class:`PySide.QtCore.QDateTime`, :class:`PySide.QtCore.QTime`, :class:`PySide.QtCore.QUrl` will be based on their string representations, thus objects with the same value will produce the same hash. QString ======= Methods that change QString arguments ------------------------------------- Methods and functions that change the contents of a QString argument were modified to receive an immutable Python unicode (or str) and return another Python unicode/str as the modified string. The following methods had their return types modified this way: **Classes:** QAbstractSpinBox, QDateTimeEdit, QDoubleSpinBox, QSpinBox, QValidator - *fixup(string)*: string - *validate(string, int)*: [QValidator.State, string, int] **Classes:** QDoubleValidator, QIntValidator, QRegExpValidator - *validate(string, int)*: [QValidator.State, string, int] **Class:** QClipboard - *text(string, QClipboard.Mode mode=QClipboard.Clipboard)*: [string, string] **Class:** QFileDialog Instead of *getOpenFileNameAndFilter()*, *getOpenFileNamesAndFilter()* and *getSaveFileNameAndFilter()* like PyQt4 does, PySide has modified the original methods to return a tuple. - *getOpenFileName(QWidget parent=None, str caption=None, str dir=None, str filter=None, QFileDialog.Options options=0)*: [string, filter] - *getOpenFileNames(QWidget parent=None, str caption=None, str dir=None, str filter=None, QFileDialog.Options options=0)*: [list(string), filter] - *getSaveFileName(QWidget parent=None, str caption=None, str dir=None, str filter=None, QFileDialog.Options options=0)*: [string, filter] **Class:** QWebPage - *javaScriptPrompt(QWebFrame, string, string)*: [bool, string] Other QString related changes ----------------------------- **Classes:** QFontMetrics and QFontMetricsF They had two new methods added. Both take a string of one character and convert to a QChar (to call the C++ counterpart): - widthChar(string) - boundingRectChar(string) QTextStream =========== Inside this class some renames were applied to avoid clashes with native Python functions. They are: *bin_()*, *hex_()* and *oct_()*. The only modification was the addition of '_' character. QVariant ======== As QVariant was removed, any function expecting it can receive any Python object (None is an invalid QVariant). The same rule is valid when returning something: the returned QVariant will be converted to the its original Python object type. When a method expects a *QVariant::Type* the programmer can use a string (the type name) or the type itself. ================================================ FILE: doc/pysideinclude.py ================================================ # # This code is a modified version of the code found in sphinx distribution # the same license of sphinx distribution applies to this file as well. # import os import sys import codecs from os import path from docutils import nodes from docutils.parsers.rst import Directive, directives from sphinx import addnodes from sphinx.util import parselinenos class PySideInclude(Directive): """ Like ``.. include:: :literal:``, but only warns if the include file is not found, and does not raise errors. Also has several options for selecting what to include. """ has_content = False required_arguments = 1 optional_arguments = 0 final_argument_whitespace = False option_spec = { 'linenos': directives.flag, 'tab-width': int, 'language': directives.unchanged_required, 'encoding': directives.encoding, 'pyobject': directives.unchanged_required, 'lines': directives.unchanged_required, 'start-after': directives.unchanged_required, 'end-before': directives.unchanged_required, 'prepend': directives.unchanged_required, 'append': directives.unchanged_required, 'snippet': directives.unchanged_required, } def run(self): document = self.state.document filename = self.arguments[0] if not document.settings.file_insertion_enabled: return [document.reporter.warning('File insertion disabled', line=self.lineno)] env = document.settings.env if filename.startswith('/') or filename.startswith(os.sep): rel_fn = filename[1:] else: docdir = path.dirname(env.doc2path(env.docname, base=None)) rel_fn = path.join(docdir, filename) try: fn = path.join(env.srcdir, rel_fn) except UnicodeDecodeError: # the source directory is a bytestring with non-ASCII characters; # let's try to encode the rel_fn in the file system encoding rel_fn = rel_fn.encode(sys.getfilesystemencoding()) fn = path.join(env.srcdir, rel_fn) if 'pyobject' in self.options and 'lines' in self.options: return [document.reporter.warning( 'Cannot use both "pyobject" and "lines" options', line=self.lineno)] encoding = self.options.get('encoding', env.config.source_encoding) codec_info = codecs.lookup(encoding) try: f = codecs.StreamReaderWriter(open(fn, 'U'), codec_info[2], codec_info[3], 'strict') lines = f.readlines() f.close() except (IOError, OSError): return [document.reporter.warning( 'Include file %r not found or reading it failed' % filename, line=self.lineno)] except UnicodeError: return [document.reporter.warning( 'Encoding %r used for reading included file %r seems to ' 'be wrong, try giving an :encoding: option' % (encoding, filename))] objectname = self.options.get('pyobject') if objectname is not None: from sphinx.pycode import ModuleAnalyzer analyzer = ModuleAnalyzer.for_file(fn, '') tags = analyzer.find_tags() if objectname not in tags: return [document.reporter.warning( 'Object named %r not found in include file %r' % (objectname, filename), line=self.lineno)] else: lines = lines[tags[objectname][1]-1 : tags[objectname][2]-1] linespec = self.options.get('lines') if linespec is not None: try: linelist = parselinenos(linespec, len(lines)) except ValueError, err: return [document.reporter.warning(str(err), line=self.lineno)] lines = [lines[i] for i in linelist] startafter = self.options.get('start-after') endbefore = self.options.get('end-before') prepend = self.options.get('prepend') append = self.options.get('append') snippet = self.options.get('snippet') if snippet: startafter = "//![%s]" % snippet endbefore = "//![%s]" % snippet if startafter is not None or endbefore is not None: use = not startafter res = [] for line in lines: if not use and startafter and startafter in line: use = True elif use and endbefore and endbefore in line: use = False break elif use: if not line.startswith("//!"): res.append(line) lines = res if prepend: lines.insert(0, prepend + '\n') if append: lines.append(append + '\n') text = ''.join(lines) if self.options.get('tab-width'): text = text.expandtabs(self.options['tab-width']) retnode = nodes.literal_block(text, text, source=fn) retnode.line = 1 retnode.attributes['line_number'] = self.lineno if self.options.get('language', ''): retnode['language'] = self.options['language'] if 'linenos' in self.options: retnode['linenos'] = True document.settings.env.note_dependency(rel_fn) return [retnode] def setup(app): app.add_directive('pysideinclude', PySideInclude) ================================================ FILE: doc/pysideversion.rst ================================================ Getting PySide and Qt version ***************************** PySide exports their version numbers among the version of Qt used to compile PySide in a pythonnic way, you can check it using the variables: :: import PySide # Prints PySide version # e.g. 1.0.2 print PySide.__version__ # Gets a tuple with each version component # e.g. (1, 0, 2, 'final', 1) print PySide.__version_info__ # Prints the Qt version used to compile PySide # e.g. "4.7.2" print PySide.QtCore.__version__ # Gets a tuple with each version components of Qt used to compile PySide # e.g. (4, 7, 2) print PySide.QtCore.__version_info__ Note that the Qt version used to compile PySide may differ from the version used to run PySide, to get the current running Qt version you can do: :: print PySide.QtCore.qVersion() ================================================ FILE: doc/tutorials/index.rst ================================================ PySide tutorials **************** A collection of tutorials and "walkthrough" guides are provided with PySide to help new users get started with PySide development. These documents were ported from C++ to Python and cover a range of topics, from basic use of widgets to step-by-step tutorials that show how an application is put together. .. toctree:: :maxdepth: 2 qmltutorial/index.rst qmladvancedtutorial/index.rst ================================================ FILE: doc/tutorials/qmladvancedtutorial/index.rst ================================================ .. _qmladvancedtutorial: QML Advanced Tutorial ********************* This tutorial walks step-by-step through the creation of a full application using QML. It assumes that you already know the basics of QML (for example, from reading the :ref:`qmltutorial`. In this tutorial we write a game, *Same Game*, based on the Same Game application included in the declarative demos directory, which looks like this: .. figure:: declarative-samegame.png :align: center We will cover concepts for producing a fully functioning application, including JavaScript integration, using QML States and Behaviors to manage components and enhance your interface, and storing persistent application data. An understanding of JavaScript is helpful to understand parts of this tutorial, but if you don't know JavaScript you can still get a feel for how you can integrate backend logic to create and control QML elements. Tutorial chapters: .. toctree:: :maxdepth: 1 samegame1.rst samegame2.rst samegame3.rst samegame4.rst All the code in this tutorial can be found :download:`here <samegame.tar.bz2>`. ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame1/Block.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] import QtQuick 1.0 Item { id: block Image { id: img anchors.fill: parent source: "../shared/pics/redStone.png" } } //![0] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame1/Button.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] import QtQuick 1.0 Rectangle { id: container property string text: "Button" signal clicked width: buttonLabel.width + 20; height: buttonLabel.height + 5 border { width: 1; color: Qt.darker(activePalette.button) } smooth: true radius: 8 // color the button with a gradient gradient: Gradient { GradientStop { position: 0.0 color: { if (mouseArea.pressed) return activePalette.dark else return activePalette.light } } GradientStop { position: 1.0; color: activePalette.button } } MouseArea { id: mouseArea anchors.fill: parent onClicked: container.clicked(); } Text { id: buttonLabel anchors.centerIn: container color: activePalette.buttonText text: container.text } } //![0] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame1/samegame.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] import QtQuick 1.0 Rectangle { id: screen width: 490; height: 720 SystemPalette { id: activePalette } Item { width: parent.width anchors { top: parent.top; bottom: toolBar.top } Image { id: background anchors.fill: parent source: "../shared/pics/background.jpg" fillMode: Image.PreserveAspectCrop } } Rectangle { id: toolBar width: parent.width; height: 30 color: activePalette.window anchors.bottom: screen.bottom Button { anchors { left: parent.left; verticalCenter: parent.verticalCenter } text: "New Game" onClicked: console.log("This doesn't do anything yet...") } Text { id: score anchors { right: parent.right; verticalCenter: parent.verticalCenter } text: "Score: Who knows?" } } } //![0] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame1/samegame1.qmlproject ================================================ import QmlProject 1.0 Project { /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { directory: "." } JavaScriptFiles { directory: "." } ImageFiles { directory: "." } /* List of plugin directories passed to QML runtime */ // importPaths: [ " ../exampleplugin " ] } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame2/Block.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 1.0 Item { id: block Image { id: img anchors.fill: parent source: "../shared/pics/redStone.png" } } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame2/Button.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 1.0 Rectangle { id: container property string text: "Button" signal clicked width: buttonLabel.width + 20; height: buttonLabel.height + 5 border { width: 1; color: Qt.darker(activePalette.button) } smooth: true radius: 8 // color the button with a gradient gradient: Gradient { GradientStop { position: 0.0 color: { if (mouseArea.pressed) return activePalette.dark else return activePalette.light } } GradientStop { position: 1.0; color: activePalette.button } } MouseArea { id: mouseArea anchors.fill: parent onClicked: container.clicked(); } Text { id: buttonLabel anchors.centerIn: container color: activePalette.buttonText text: container.text } } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame2/samegame.js ================================================ //![0] var blockSize = 40; var maxColumn = 10; var maxRow = 15; var maxIndex = maxColumn * maxRow; var board = new Array(maxIndex); var component; //Index function used instead of a 2D array function index(column, row) { return column + (row * maxColumn); } function startNewGame() { //Delete blocks from previous game for (var i = 0; i < maxIndex; i++) { if (board[i] != null) board[i].destroy(); } //Calculate board size maxColumn = Math.floor(background.width / blockSize); maxRow = Math.floor(background.height / blockSize); maxIndex = maxRow * maxColumn; //Initialize Board board = new Array(maxIndex); for (var column = 0; column < maxColumn; column++) { for (var row = 0; row < maxRow; row++) { board[index(column, row)] = null; createBlock(column, row); } } } function createBlock(column, row) { if (component == null) component = Qt.createComponent("Block.qml"); // Note that if Block.qml was not a local file, component.status would be // Loading and we should wait for the component's statusChanged() signal to // know when the file is downloaded and ready before calling createObject(). if (component.status == Component.Ready) { var dynamicObject = component.createObject(background); if (dynamicObject == null) { console.log("error creating block"); console.log(component.errorString()); return false; } dynamicObject.x = column * blockSize; dynamicObject.y = row * blockSize; dynamicObject.width = blockSize; dynamicObject.height = blockSize; board[index(column, row)] = dynamicObject; } else { console.log("error loading block component"); console.log(component.errorString()); return false; } return true; } //![0] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame2/samegame.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 1.0 //![2] import "samegame.js" as SameGame //![2] Rectangle { id: screen width: 490; height: 720 SystemPalette { id: activePalette } Item { width: parent.width anchors { top: parent.top; bottom: toolBar.top } Image { id: background anchors.fill: parent source: "../shared/pics/background.jpg" fillMode: Image.PreserveAspectCrop } } Rectangle { id: toolBar width: parent.width; height: 32 color: activePalette.window anchors.bottom: screen.bottom //![1] Button { anchors { left: parent.left; verticalCenter: parent.verticalCenter } text: "New Game" onClicked: SameGame.startNewGame() } //![1] Text { id: score anchors { right: parent.right; verticalCenter: parent.verticalCenter } text: "Score: Who knows?" } } } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame2/samegame2.qmlproject ================================================ import QmlProject 1.0 Project { /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { directory: "." } JavaScriptFiles { directory: "." } ImageFiles { directory: "." } /* List of plugin directories passed to QML runtime */ // importPaths: [ " ../exampleplugin " ] } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame3/Block.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] import QtQuick 1.0 Item { id: block property int type: 0 Image { id: img anchors.fill: parent source: { if (type == 0) return "../shared/pics/redStone.png"; else if (type == 1) return "../shared/pics/blueStone.png"; else return "../shared/pics/greenStone.png"; } } } //![0] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame3/Button.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 1.0 Rectangle { id: container property string text: "Button" signal clicked width: buttonLabel.width + 20; height: buttonLabel.height + 5 border { width: 1; color: Qt.darker(activePalette.button) } smooth: true radius: 8 // color the button with a gradient gradient: Gradient { GradientStop { position: 0.0 color: { if (mouseArea.pressed) return activePalette.dark else return activePalette.light } } GradientStop { position: 1.0; color: activePalette.button } } MouseArea { id: mouseArea anchors.fill: parent onClicked: container.clicked(); } Text { id: buttonLabel anchors.centerIn: container color: activePalette.buttonText text: container.text } } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame3/Dialog.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] import QtQuick 1.0 Rectangle { id: container function show(text) { dialogText.text = text; container.opacity = 1; } function hide() { container.opacity = 0; } width: dialogText.width + 20 height: dialogText.height + 20 opacity: 0 Text { id: dialogText anchors.centerIn: parent text: "" } MouseArea { anchors.fill: parent onClicked: hide(); } } //![0] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame3/samegame.js ================================================ /* This script file handles the game logic */ var maxColumn = 10; var maxRow = 15; var maxIndex = maxColumn * maxRow; var board = new Array(maxIndex); var component; //Index function used instead of a 2D array function index(column, row) { return column + (row * maxColumn); } function startNewGame() { //Calculate board size maxColumn = Math.floor(gameCanvas.width / gameCanvas.blockSize); maxRow = Math.floor(gameCanvas.height / gameCanvas.blockSize); maxIndex = maxRow * maxColumn; //Close dialogs dialog.hide(); //Initialize Board board = new Array(maxIndex); gameCanvas.score = 0; for (var column = 0; column < maxColumn; column++) { for (var row = 0; row < maxRow; row++) { board[index(column, row)] = null; createBlock(column, row); } } } function createBlock(column, row) { if (component == null) component = Qt.createComponent("Block.qml"); // Note that if Block.qml was not a local file, component.status would be // Loading and we should wait for the component's statusChanged() signal to // know when the file is downloaded and ready before calling createObject(). if (component.status == Component.Ready) { var dynamicObject = component.createObject(gameCanvas); if (dynamicObject == null) { console.log("error creating block"); console.log(component.errorString()); return false; } dynamicObject.type = Math.floor(Math.random() * 3); dynamicObject.x = column * gameCanvas.blockSize; dynamicObject.y = row * gameCanvas.blockSize; dynamicObject.width = gameCanvas.blockSize; dynamicObject.height = gameCanvas.blockSize; board[index(column, row)] = dynamicObject; } else { console.log("error loading block component"); console.log(component.errorString()); return false; } return true; } var fillFound; //Set after a floodFill call to the number of blocks found var floodBoard; //Set to 1 if the floodFill reaches off that node //![1] function handleClick(xPos, yPos) { var column = Math.floor(xPos / gameCanvas.blockSize); var row = Math.floor(yPos / gameCanvas.blockSize); if (column >= maxColumn || column < 0 || row >= maxRow || row < 0) return; if (board[index(column, row)] == null) return; //If it's a valid block, remove it and all connected (does nothing if it's not connected) floodFill(column, row, -1); if (fillFound <= 0) return; gameCanvas.score += (fillFound - 1) * (fillFound - 1); shuffleDown(); victoryCheck(); } //![1] function floodFill(column, row, type) { if (board[index(column, row)] == null) return; var first = false; if (type == -1) { first = true; type = board[index(column, row)].type; //Flood fill initialization fillFound = 0; floodBoard = new Array(maxIndex); } if (column >= maxColumn || column < 0 || row >= maxRow || row < 0) return; if (floodBoard[index(column, row)] == 1 || (!first && type != board[index(column, row)].type)) return; floodBoard[index(column, row)] = 1; floodFill(column + 1, row, type); floodFill(column - 1, row, type); floodFill(column, row + 1, type); floodFill(column, row - 1, type); if (first == true && fillFound == 0) return; //Can't remove single blocks board[index(column, row)].opacity = 0; board[index(column, row)] = null; fillFound += 1; } function shuffleDown() { //Fall down for (var column = 0; column < maxColumn; column++) { var fallDist = 0; for (var row = maxRow - 1; row >= 0; row--) { if (board[index(column, row)] == null) { fallDist += 1; } else { if (fallDist > 0) { var obj = board[index(column, row)]; obj.y += fallDist * gameCanvas.blockSize; board[index(column, row + fallDist)] = obj; board[index(column, row)] = null; } } } } //Fall to the left var fallDist = 0; for (var column = 0; column < maxColumn; column++) { if (board[index(column, maxRow - 1)] == null) { fallDist += 1; } else { if (fallDist > 0) { for (var row = 0; row < maxRow; row++) { var obj = board[index(column, row)]; if (obj == null) continue; obj.x -= fallDist * gameCanvas.blockSize; board[index(column - fallDist, row)] = obj; board[index(column, row)] = null; } } } } } //![2] function victoryCheck() { //Award bonus points if no blocks left var deservesBonus = true; for (var column = maxColumn - 1; column >= 0; column--) if (board[index(column, maxRow - 1)] != null) deservesBonus = false; if (deservesBonus) gameCanvas.score += 500; //Check whether game has finished if (deservesBonus || !(floodMoveCheck(0, maxRow - 1, -1))) dialog.show("Game Over. Your score is " + gameCanvas.score); } //![2] //only floods up and right, to see if it can find adjacent same-typed blocks function floodMoveCheck(column, row, type) { if (column >= maxColumn || column < 0 || row >= maxRow || row < 0) return false; if (board[index(column, row)] == null) return false; var myType = board[index(column, row)].type; if (type == myType) return true; return floodMoveCheck(column + 1, row, myType) || floodMoveCheck(column, row - 1, board[index(column, row)].type); } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame3/samegame.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] import QtQuick 1.0 import "samegame.js" as SameGame Rectangle { id: screen width: 490; height: 720 SystemPalette { id: activePalette } Item { width: parent.width anchors { top: parent.top; bottom: toolBar.top } Image { id: background anchors.fill: parent source: "../shared/pics/background.jpg" fillMode: Image.PreserveAspectCrop } //![1] Item { id: gameCanvas property int score: 0 property int blockSize: 40 width: parent.width - (parent.width % blockSize) height: parent.height - (parent.height % blockSize) anchors.centerIn: parent MouseArea { anchors.fill: parent onClicked: SameGame.handleClick(mouse.x, mouse.y) } } //![1] } //![2] Dialog { id: dialog anchors.centerIn: parent z: 100 } //![2] Rectangle { id: toolBar width: parent.width; height: 30 color: activePalette.window anchors.bottom: screen.bottom Button { anchors { left: parent.left; verticalCenter: parent.verticalCenter } text: "New Game" onClicked: SameGame.startNewGame() } Text { id: score anchors { right: parent.right; verticalCenter: parent.verticalCenter } text: "Score: Who knows?" } } } //![0] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame3/samegame3.qmlproject ================================================ import QmlProject 1.0 Project { /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { directory: "." } JavaScriptFiles { directory: "." } ImageFiles { directory: "." } /* List of plugin directories passed to QML runtime */ // importPaths: [ " ../exampleplugin " ] } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame4/content/BoomBlock.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 1.0 import Qt.labs.particles 1.0 Item { id: block property int type: 0 property bool dying: false //![1] property bool spawned: false Behavior on x { enabled: spawned; SpringAnimation{ spring: 2; damping: 0.2 } } Behavior on y { SpringAnimation{ spring: 2; damping: 0.2 } } //![1] //![2] Image { id: img anchors.fill: parent source: { if (type == 0) return "../../shared/pics/redStone.png"; else if (type == 1) return "../../shared/pics/blueStone.png"; else return "../../shared/pics/greenStone.png"; } opacity: 0 Behavior on opacity { NumberAnimation { properties:"opacity"; duration: 200 } } } //![2] //![3] Particles { id: particles width: 1; height: 1 anchors.centerIn: parent emissionRate: 0 lifeSpan: 700; lifeSpanDeviation: 600 angle: 0; angleDeviation: 360; velocity: 100; velocityDeviation: 30 source: { if (type == 0) return "../../shared/pics/redStar.png"; else if (type == 1) return "../../shared/pics/blueStar.png"; else return "../../shared/pics/greenStar.png"; } } //![3] //![4] states: [ State { name: "AliveState" when: spawned == true && dying == false PropertyChanges { target: img; opacity: 1 } }, State { name: "DeathState" when: dying == true StateChangeScript { script: particles.burst(50); } PropertyChanges { target: img; opacity: 0 } StateChangeScript { script: block.destroy(1000); } } ] //![4] } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame4/content/Button.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 1.0 Rectangle { id: container property string text: "Button" signal clicked width: buttonLabel.width + 20; height: buttonLabel.height + 5 border { width: 1; color: Qt.darker(activePalette.button) } smooth: true radius: 8 // color the button with a gradient gradient: Gradient { GradientStop { position: 0.0 color: { if (mouseArea.pressed) return activePalette.dark else return activePalette.light } } GradientStop { position: 1.0; color: activePalette.button } } MouseArea { id: mouseArea anchors.fill: parent onClicked: container.clicked(); } Text { id: buttonLabel anchors.centerIn: container color: activePalette.buttonText text: container.text } } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame4/content/Dialog.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 1.0 //![0] Rectangle { id: container //![0] //![1] property string inputText: textInput.text signal closed function show(text) { dialogText.text = text; container.opacity = 1; textInput.opacity = 0; } function showWithInput(text) { show(text); textInput.opacity = 1; textInput.focus = true; textInput.text = "" } function hide() { textInput.focus = false; container.opacity = 0; container.closed(); } //![1] width: dialogText.width + textInput.width + 20 height: dialogText.height + 20 opacity: 0 visible: opacity > 0 Text { id: dialogText anchors { verticalCenter: parent.verticalCenter; left: parent.left; leftMargin: 10 } text: "" } //![2] TextInput { id: textInput anchors { verticalCenter: parent.verticalCenter; left: dialogText.right } width: 80 text: "" onAccepted: container.hide() // close dialog when Enter is pressed } //![2] MouseArea { anchors.fill: parent onClicked: { if (textInput.text == "" && textInput.opacity > 0) textInput.openSoftwareInputPanel(); else hide(); } } //![3] } //![3] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame4/content/samegame.js ================================================ /* This script file handles the game logic */ var maxColumn = 10; var maxRow = 15; var maxIndex = maxColumn * maxRow; var board = new Array(maxIndex); var component; var scoresURL = ""; var gameDuration; //Index function used instead of a 2D array function index(column, row) { return column + (row * maxColumn); } function startNewGame() { //Delete blocks from previous game for (var i = 0; i < maxIndex; i++) { if (board[i] != null) board[i].destroy(); } //Calculate board size maxColumn = Math.floor(gameCanvas.width / gameCanvas.blockSize); maxRow = Math.floor(gameCanvas.height / gameCanvas.blockSize); maxIndex = maxRow * maxColumn; //Close dialogs nameInputDialog.hide(); dialog.hide(); //Initialize Board board = new Array(maxIndex); gameCanvas.score = 0; for (var column = 0; column < maxColumn; column++) { for (var row = 0; row < maxRow; row++) { board[index(column, row)] = null; createBlock(column, row); } } gameDuration = new Date(); } function createBlock(column, row) { if (component == null) component = Qt.createComponent("content/BoomBlock.qml"); // Note that if Block.qml was not a local file, component.status would be // Loading and we should wait for the component's statusChanged() signal to // know when the file is downloaded and ready before calling createObject(). if (component.status == Component.Ready) { var dynamicObject = component.createObject(gameCanvas); if (dynamicObject == null) { console.log("error creating block"); console.log(component.errorString()); return false; } dynamicObject.type = Math.floor(Math.random() * 3); dynamicObject.x = column * gameCanvas.blockSize; dynamicObject.y = row * gameCanvas.blockSize; dynamicObject.width = gameCanvas.blockSize; dynamicObject.height = gameCanvas.blockSize; dynamicObject.spawned = true; board[index(column, row)] = dynamicObject; } else { console.log("error loading block component"); console.log(component.errorString()); return false; } return true; } var fillFound; //Set after a floodFill call to the number of blocks found var floodBoard; //Set to 1 if the floodFill reaches off that node function handleClick(xPos, yPos) { var column = Math.floor(xPos / gameCanvas.blockSize); var row = Math.floor(yPos / gameCanvas.blockSize); if (column >= maxColumn || column < 0 || row >= maxRow || row < 0) return; if (board[index(column, row)] == null) return; //If it's a valid block, remove it and all connected (does nothing if it's not connected) floodFill(column, row, -1); if (fillFound <= 0) return; gameCanvas.score += (fillFound - 1) * (fillFound - 1); shuffleDown(); victoryCheck(); } function floodFill(column, row, type) { if (board[index(column, row)] == null) return; var first = false; if (type == -1) { first = true; type = board[index(column, row)].type; //Flood fill initialization fillFound = 0; floodBoard = new Array(maxIndex); } if (column >= maxColumn || column < 0 || row >= maxRow || row < 0) return; if (floodBoard[index(column, row)] == 1 || (!first && type != board[index(column, row)].type)) return; floodBoard[index(column, row)] = 1; floodFill(column + 1, row, type); floodFill(column - 1, row, type); floodFill(column, row + 1, type); floodFill(column, row - 1, type); if (first == true && fillFound == 0) return; //Can't remove single blocks board[index(column, row)].dying = true; board[index(column, row)] = null; fillFound += 1; } function shuffleDown() { //Fall down for (var column = 0; column < maxColumn; column++) { var fallDist = 0; for (var row = maxRow - 1; row >= 0; row--) { if (board[index(column, row)] == null) { fallDist += 1; } else { if (fallDist > 0) { var obj = board[index(column, row)]; obj.y = (row + fallDist) * gameCanvas.blockSize; board[index(column, row + fallDist)] = obj; board[index(column, row)] = null; } } } } //Fall to the left fallDist = 0; for (column = 0; column < maxColumn; column++) { if (board[index(column, maxRow - 1)] == null) { fallDist += 1; } else { if (fallDist > 0) { for (row = 0; row < maxRow; row++) { obj = board[index(column, row)]; if (obj == null) continue; obj.x = (fallDist - column) * gameCanvas.blockSize; board[index(column - fallDist, row)] = obj; board[index(column, row)] = null; } } } } } //![3] function victoryCheck() { //![3] //Award bonus points if no blocks left var deservesBonus = true; for (var column = maxColumn - 1; column >= 0; column--) if (board[index(column, maxRow - 1)] != null) deservesBonus = false; if (deservesBonus) gameCanvas.score += 500; //![4] //Check whether game has finished if (deservesBonus || !(floodMoveCheck(0, maxRow - 1, -1))) { gameDuration = new Date() - gameDuration; nameInputDialog.showWithInput("You won! Please enter your name: "); } } //![4] //only floods up and right, to see if it can find adjacent same-typed blocks function floodMoveCheck(column, row, type) { if (column >= maxColumn || column < 0 || row >= maxRow || row < 0) return false; if (board[index(column, row)] == null) return false; var myType = board[index(column, row)].type; if (type == myType) return true; return floodMoveCheck(column + 1, row, myType) || floodMoveCheck(column, row - 1, board[index(column, row)].type); } //![2] function saveHighScore(name) { if (scoresURL != "") sendHighScore(name); var db = openDatabaseSync("SameGameScores", "1.0", "Local SameGame High Scores", 100); var dataStr = "INSERT INTO Scores VALUES(?, ?, ?, ?)"; var data = [name, gameCanvas.score, maxColumn + "x" + maxRow, Math.floor(gameDuration / 1000)]; db.transaction(function(tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS Scores(name TEXT, score NUMBER, gridSize TEXT, time NUMBER)'); tx.executeSql(dataStr, data); var rs = tx.executeSql('SELECT * FROM Scores WHERE gridSize = "12x17" ORDER BY score desc LIMIT 10'); var r = "\nHIGH SCORES for a standard sized grid\n\n" for (var i = 0; i < rs.rows.length; i++) { r += (i + 1) + ". " + rs.rows.item(i).name + ' got ' + rs.rows.item(i).score + ' points in ' + rs.rows.item(i).time + ' seconds.\n'; } dialog.show(r); }); } //![2] //![1] function sendHighScore(name) { var postman = new XMLHttpRequest() var postData = "name=" + name + "&score=" + gameCanvas.score + "&gridSize=" + maxColumn + "x" + maxRow + "&time=" + Math.floor(gameDuration / 1000); postman.open("POST", scoresURL, true); postman.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); postman.onreadystatechange = function() { if (postman.readyState == postman.DONE) { dialog.show("Your score has been uploaded."); } } postman.send(postData); } //![1] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame4/highscores/README ================================================ The SameGame example can interface with a simple PHP script to store XML high score data on a remote server. We do not have a publically accessible server available for this use, but if you have access to a PHP capable webserver you can copy the files (score_data.xml, score.php, score_style.xsl) to it and alter the highscore_server variable at the top of the samegame.js file to point to it. ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame4/highscores/score_data.xml ================================================ <record><score>1000000</score><name>Alan the Tester</name><gridSize>0x0</gridSize><seconds>0</seconds></record> <record><score>6213</score><name>Alan</name><gridSize>12x17</gridSize><seconds>51</seconds></record> ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame4/highscores/score_style.xsl ================================================ <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head><title>SameGame High Scores

SameGame High Scores

Name Score Grid Size Time, s
================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame4/highscores/scores.php ================================================ "; echo "SameGame High Scores"; if($score > 0){#Sending in a new high score $name = $_POST["name"]; $grid = $_POST["gridSize"]; $time = $_POST["time"]; if($name == "") $name = "Anonymous"; $file = fopen("score_data.xml", "a"); $ret = fwrite($file, "". $score . "" . $name . "" . $grid . "" . $time . "\n"); echo "Your score has been recorded. Thanks for playing!"; if($ret == False) echo "
There was an error though, so don't expect to see that score again."; }else{#Read high score list #Now uses XSLT to display. So just print the file. With XML cruft added. #Note that firefox at least won't apply the XSLT on a php file. So redirecting $file = fopen("scores.xml", "w"); $ret = fwrite($file, '' . "\n" . '' . "\n" . "\n" . file_get_contents("score_data.xml") . "\n"); if($ret == False) echo "There was an internal error. Sorry."; else echo ''; } echo ""; ?> ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame4/samegame.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 1.0 import "content" import "content/samegame.js" as SameGame Rectangle { id: screen width: 490; height: 720 SystemPalette { id: activePalette } Item { width: parent.width anchors { top: parent.top; bottom: toolBar.top } Image { id: background anchors.fill: parent source: "../shared/pics/background.jpg" fillMode: Image.PreserveAspectCrop } Item { id: gameCanvas property int score: 0 property int blockSize: 40 anchors.centerIn: parent width: parent.width - (parent.width % blockSize); height: parent.height - (parent.height % blockSize); MouseArea { anchors.fill: parent; onClicked: SameGame.handleClick(mouse.x,mouse.y); } } } Dialog { id: dialog anchors.centerIn: parent z: 100 } //![0] Dialog { id: nameInputDialog anchors.centerIn: parent z: 100 onClosed: { if (nameInputDialog.inputText != "") SameGame.saveHighScore(nameInputDialog.inputText); } } //![0] Rectangle { id: toolBar width: parent.width; height: 30 color: activePalette.window anchors.bottom: screen.bottom Button { anchors { left: parent.left; verticalCenter: parent.verticalCenter } text: "New Game" onClicked: SameGame.startNewGame() } Text { id: score anchors { right: parent.right; verticalCenter: parent.verticalCenter } text: "Score: " + gameCanvas.score } } } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame/samegame4/samegame4.qmlproject ================================================ import QmlProject 1.0 Project { /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { directory: "." } JavaScriptFiles { directory: "." } ImageFiles { directory: "." } /* List of plugin directories passed to QML runtime */ // importPaths: [ " ../exampleplugin " ] } ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame1.rst ================================================ .. _samegame1: QML Advanced Tutorial 1 - Creating the Game Canvas and Blocks ************************************************************* Creating the application screen =============================== The first step is to create the basic QML items in your application. To begin with, we create our Same Game application with a main screen like this: .. figure:: declarative-adv-tutorial1.png :align: center This is defined by the main application file, ``samegame.qml``, which looks like this: .. pysideinclude:: samegame/samegame1/samegame.qml :snippet: 0 This gives you a basic game window that includes the main canvas for the blocks, a "New Game" button and a score display. One item you may not recognize here is the SystemPalette item. This provides access to the Qt system palette and is used to give the button a more native look-and-feel. Notice the anchors for the ``Item``, ``Button`` and ``Text`` elements are set using group notation for readability. Adding Button and Block components ================================== The ``Button`` item in the code above is defined in a separate component file named ``Button.qml``. To create a functional button, we use the QML elements Text and MouseArea inside a Rectangle. Here is the ``Button.qml`` code: .. pysideinclude:: samegame/samegame1/Button.qml :snippet: 0 This essentially defines a rectangle that contains text and can be clicked. The MouseArea has an ``onClicked()`` handler that is implemented to emit the ``clicked()`` signal of the ``container`` when the area is clicked. In Same Game, the screen is filled with small blocks when the game begins. Each block is just an item that contains an image. The block code is defined in a separate ``Block.qml`` file: .. pysideinclude:: samegame/samegame1/Block.qml :snippet: 0 At the moment, the block doesn't do anything; it is just an image. As the tutorial progresses we will animate and give behaviors to the blocks. We have not added any code yet to create the blocks; we will do this in the next chapter. We have set the image to be the size of its parent Item using ``anchors.fill: parent``. This means that when we dynamically create and resize the block items later on in the tutorial, the image will be scaled automatically to the correct size. Notice the relative path for the Image element's ``source`` property. This path is relative to the location of the file that contains the Image element. Alternatively, you could set the Image source to an absolute file path or a URL that contains an image. You should be familiar with the code so far. We have just created some basic elements to get started. Next, we will populate the game canvas with some blocks. [Previous :ref:`qmladvancedtutorial`] [Next :ref:`samegame2`] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame2.rst ================================================ .. _samegame2: QML Advanced Tutorial 2 - Populating the Game Canvas **************************************************** Generating the blocks in JavaScript =================================== Now that we've written some basic elements, let's start writing the game. The first task is to generate the game blocks. Each time the New Game button is clicked, the game canvas is populated with a new, random set of blocks. Since we need to dynamically generate new blocks for each new game, we cannot use Repeater to define the blocks. Instead, we will create the blocks in JavaScript. Here is the JavaScript code for generating the blocks, contained in a new file, ``samegame.js``. The code is explained below. .. pysideinclude:: samegame/samegame2/samegame.js :snippet: 0 The ``startNewGame()`` function deletes the blocks created in the previous game and calculates the number of rows and columns of blocks required to fill the game window for the new game. Then, it creates an array to store all the game blocks, and calls ``createBlock()`` to create enough blocks to fill the game window. The ``createBlock()`` function creates a block from the ``Block.qml`` file and moves the new block to its position on the game canvas. This involves several steps: * ``Qt.createComponent()`` is called to generate an element from ``Block.qml``. If the component is ready, we can call ``createObject()`` to create an instance of the ``Block`` item. * If ``createObject()`` returned null (i.e. if there was an error while loading the object), print the error information. * Place the block in its position on the board and set its width and height. Also, store it in the blocks array for future reference. * Finally, print error information to the console if the component could not be loaded for some reason (for example, if the file is missing). Connecting JavaScript components to QML ======================================= Now we need to call the JavaScript code in ``samegame.js`` from our QML files. To do this, we add this line to ``samegame.qml`` which imports the JavaScript file as a module: .. pysideinclude:: samegame/samegame2/samegame.qml :snippet: 2 This allows us to refer to any functions within ``samegame.js`` using "SameGame" as a prefix: for example, ``SameGame.startNewGame()`` or ``SameGame.createBlock()``. This means we can now connect the New Game button's ``onClicked`` handler to the ``startNewGame()`` function, like this: .. pysideinclude:: samegame/samegame2/samegame.qml :snippet: 1 So, when you click the New Game button, ``startNewGame()`` is called and generates a field of blocks, like this: .. figure:: declarative-adv-tutorial2.png :align: center Now, we have a screen of blocks, and we can begin to add the game mechanics. [Previous :ref:`samegame1`] [Next :ref:`samegame3`] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame3.rst ================================================ .. _samegame3: QML Advanced Tutorial 3 - Implementing the Game Logic ***************************************************** Making a playable game ====================== Now that we have all the game components, we can add the game logic that dictates how a player interacts with the blocks and plays the game until it is won or lost. To do this, we have added the following functions to ``samegame.js``: * ``handleClick(x,y)`` * ``floodFill(xIdx,yIdx,type)`` * ``shuffleDown()`` * ``victoryCheck()`` * ``floodMoveCheck(xIdx, yIdx, type)`` As this is a tutorial about QML, not game design, we will only discuss ``handleClick()`` and ``victoryCheck()`` below since they interface directly with the QML elements. Note that although the game logic here is written in JavaScript, it could have been written in Python and then exposed to QML. Enabling mouse click interaction ================================ To make it easier for the JavaScript code to interface with the QML elements, we have added an Item called ``gameCanvas`` to ``samegame.qml``. It replaces the background as the item which contains the blocks. It also accepts mouse input from the user. Here is the item code: .. pysideinclude:: samegame/samegame3/samegame.qml :snippet: 1 The ``gameCanvas`` item is the exact size of the board, and has a ``score`` property and a MouseArea to handle mouse clicks. The blocks are now created as its children, and its dimensions are used to determine the board size so that the application scales to the available screen size. Since its size is bound to a multiple of ``blockSize``, ``blockSize`` was moved out of ``samegame.js`` and into ``samegame.qml`` as a QML property. Note that it can still be accessed from the script. When clicked, the MouseArea calls ``handleClick()`` in ``samegame.js``, which determines whether the player's click should cause any blocks to be removed, and updates ``gameCanvas.score`` with the current score if necessary. Here is the ``handleClick()`` function: .. pysideinclude:: samegame/samegame3/samegame.js :snippet: 1 Note that if ``score`` was a global variable in the ``samegame.js`` file you would not be able to bind to it. You can only bind to QML properties. Updating the score ================== When the player clicks a block and triggers \c handleClick(), \c handleClick() also calls \c victoryCheck() to update the score and to check whether the player has completed the game. Here is the \c victoryCheck() code: .. pysideinclude:: samegame/samegame3/samegame.js :snippet: 2 This updates the ``gameCanvas.score`` value and displays a "Game Over" dialog if the game is finished. The Game Over dialog is created using a ``Dialog`` element that is defined in ``Dialog.qml``. Here is the ``Dialog.qml`` code. Notice how it is designed to be usable imperatively from the script file, via the functions and signals: .. pysideinclude:: samegame/samegame3/Dialog.qml :snippet: 0 And this is how it is used in the main ``samegame.qml`` file: .. pysideinclude:: samegame/samegame3/samegame.qml :snippet: 2 We give the dialog a ``z`` value of 100 to ensure it is displayed on top of our other components. The default ``z`` value for an item is 0. A dash of color --------------- It's not much fun to play Same Game if all the blocks are the same color, so we've modified the ``createBlock()`` function in ``samegame.js`` to randomly create a different type of block (for either red, green or blue) each time it is called. ``Block.qml`` has also changed so that each block contains a different image depending on its type: .. pysideinclude:: samegame/samegame3/Block.qml :snippet: 0 A working game ============== Now we now have a working game! The blocks can be clicked, the player can score, and the game can end (and then you can start a new one). Here is a screenshot of what has been accomplished so far: .. figure:: declarative-adv-tutorial3.png :align: center This is what ``samegame.qml`` looks like now: .. pysideinclude:: samegame/samegame3/samegame.qml :snippet: 0 The game works, but it's a little boring right now. Where are the smooth animated transitions? Where are the high scores? If you were a QML expert you could have written these in the first iteration, but in this tutorial they've been saved until the next chapter - where your application becomes alive! [Previous :ref:`samegame2`] [Next :ref:`samegame4`] ================================================ FILE: doc/tutorials/qmladvancedtutorial/samegame4.rst ================================================ .. _samegame4: QML Advanced Tutorial 4 - Finishing Touches ******************************************* Adding some flair ================= Now we're going to do two things to liven up the game: animate the blocks and add a High Score system. We've also cleaned up the directory structure for our application files. We now have a lot of files, so all the JavaScript and QML files outside of ``samegame.qml`` have been moved into a new sub-directory named "content". In anticipation of the new block animations, ``Block.qml`` file is now renamed to ``BoomBlock.qml``. Animating block movement ------------------------ First we will animate the blocks so that they move in a fluid manner. QML has a number of methods for adding fluid movement, and in this case we're going to use the Behavior element to add a SpringAnimation. In ``BoomBlock.qml``, we apply a SpringAnimation behavior to the ``x`` and ``y`` properties so that the block will follow and animate its movement in a spring-like fashion towards the specified position (whose values will be set by ``samegame.js``).Here is the code added to ``BoomBlock.qml``: .. pysideinclude:: samegame/samegame4/content/BoomBlock.qml :snippet: 1 The ``spring`` and ``damping`` values can be changed to modify the spring-like effect of the animation. The ``enabled: spawned`` setting refers to the ``spawned`` value that is set from ``createBlock()`` in ``samegame.js``. This ensures the SpringAnimation on the ``x`` is only enabled after ``createBlock()`` has set the block to the correct position. Otherwise, the blocks will slide out of the corner (0,0) when a game begins, instead of falling from the top in rows. (Try commenting out ``enabled: spawned`` and see for yourself.) Animating block opacity changes ------------------------------- Next, we will add a smooth exit animation. For this, we'll use a Behavior element, which allows us to specify a default animation when a property change occurs. In this case, when the ``opacity`` of a Block changes, we will animate the opacity value so that it gradually fades in and out, instead of abruptly changing between fully visible and invisible. To do this, we'll apply a Behavior on the ``opacity`` property of the ``Image`` element in ``BoomBlock.qml``: .. pysideinclude:: samegame/samegame4/content/BoomBlock.qml :snippet: 2 Note the ``opacity: 0`` which means the block is transparent when it is first created. We could set the opacity in ``samegame.js`` when we create and destroy the blocks, but instead we'll use states, since this is useful for the next animation we're going to add. Initially, we add these States to the root element of ``BoomBlock.qml``: :: property bool dying: false states: [ State{ name: "AliveState"; when: spawned == true && dying == false PropertyChanges { target: img; opacity: 1 } }, State{ name: "DeathState"; when: dying == true PropertyChanges { target: img; opacity: 0 } } ] Now blocks will automatically fade in, as we already set ``spawned`` to true when we implemented the block animations. To fade out, we set ``dying`` to true instead of setting opacity to 0 when a block is destroyed (in the ``floodFill()`` function). Adding particle effects ----------------------- Finally, we'll add a cool-looking particle effect to the blocks when they are destroyed. To do this, we first add a Particles element in ``BoomBlock.qml``, like so: .. pysideinclude:: samegame/samegame4/content/BoomBlock.qml :snippet: 3 To fully understand this you should read the Particles documentation, but it's important to note that ``emissionRate`` is set to zero so that particles are not emitted normally. Also, we extend the ``dying`` State, which creates a burst of particles by calling the ``burst()`` method on the particles element. The code for the states now look like this: .. pysideinclude:: samegame/samegame4/content/BoomBlock.qml :snippet: 4 Now the game is beautifully animated, with subtle (or not-so-subtle) animations added for all of the player's actions. The end result is shown below, with a different set of images to demonstrate basic theming: .. figure:: declarative-adv-tutorial4.gif :align: center The theme change here is produced simply by replacing the block images. This can be done at runtime by changing the \l Image \c source property, so for a further challenge, you could add a button that toggles between themes with different images. Keeping a High Scores table =========================== Another feature we might want to add to the game is a method of storing and retrieving high scores. To do this, we will show a dialog when the game is over to request the player's name and add it to a High Scores table. This requires a few changes to ``Dialog.qml``. In addition to a ``Text`` element, it now has a ``TextInput`` child item for receiving keyboard text input: .. pysideinclude:: samegame/samegame4/content/Dialog.qml :snippet: 2 :prepend: Rectangle { ... :append: ... } We'll also add a ``showWithInput()`` function. The text input will only be visible if this function is called instead of ``show()``. When the dialog is closed, it emits a ``closed()`` signal, and other elements can retrieve the text entered by the user through an ``inputText`` property: .. pysideinclude:: samegame/samegame4/content/Dialog.qml :snippet: 1 :prepend: Rectangle { ... :append: ... } Now the dialog can be used in ``samegame.qml``: .. pysideinclude:: samegame/samegame4/samegame.qml :snippet: 0 When the dialog emits the ``closed`` signal, we call the new ``saveHighScore()`` function in ``samegame.js``, which stores the high score locally in an SQL database and also send the score to an online database if possible. The ``nameInputDialog`` is activated in the ``victoryCheck()`` function in ``samegame.js``: .. pysideinclude:: samegame/samegame4/content/samegame.js :snippet: 4 :prepend: function vitoryCheck() { ... Storing high scores offline --------------------------- Now we need to implement the functionality to actually save the High Scores table. Here is the ``saveHighScore()`` function in ``samegame.js``: .. pysideinclude:: samegame/samegame4/content/samegame.js :snippet: 2 First we call ``sendHighScore()`` (explained in the section below) if it is possible to send the high scores to an online database. Then, we use the Offline Storage API to maintain a persistant SQL database unique to this application. We create an offline storage database for the high scores using ``openDatabase()`` and prepare the data and SQL query that we want to use to save it. The offline storage API uses SQL queries for data manipulation and retrival, and in the ``db.transaction()`` call we use three SQL queries to initialize the database (if necessary), and then add to and retrieve high scores. To use the returned data, we turn it into a string with one line per row returned, and show a dialog containing that string. This is one way of storing and displaying high scores locally, but certainly not the only way. A more complex alternative would be to create a high score dialog component, and pass it the results for processing and display (instead of reusing the ``Dialog``). This would allow a more themeable dialog that could beter present the high scores. If your QML is the UI for a Python application, you could also have passed the score to a Python function to store it locally in a variety of ways, including a simple format without SQL or in another SQL database. Storing high scores online -------------------------- You've seen how you can store high scores locally, but it is also easy to integrate a web-enabled high score storage into your QML application. The implementation we've done here is very simple: the high score data is posted to a php script running on a server somewhere, and that server then stores it and displays it to visitors. You could also request an XML or QML file from that same server, which contains and displays the scores, but that's beyond the scope of this tutorial. The php script we use here is available in the ``examples`` directory. If the player entered their name we can send the data to the web service us If the player enters a name, we send the data to the service using this code in ``samegame.js``: .. pysideinclude:: samegame/samegame4/content/samegame.js :snippet: 1 The XMLHttpRequest in this code is the same as the ``XMLHttpRequest()`` as you'll find in standard browser JavaScript, and can be used in the same way to dynamically get XML or QML from the web service to display the high scores. We don't worry about the response in this case - we just post the high score data to the web server. If it had returned a QML file (or a URL to a QML file) you could instantiate it in much the same way as you did with the blocks. An alternate way to access and submit web-based data would be to use QML elements designed for this purpose. XmlListModel makes it very easy to fetch and display XML based data such as RSS in a QML application (see the Flickr demo for an example). That's it! ========== By following this tutorial you've seen how you can write a fully functional application in QML: * Build your application with QML elements. * Add application logic with JavaScript code. * Add animations with Behaviors and states. * Store persistent application data using, for example, the Offline Storage API or XMLHttpRequest. There is so much more to learn about QML that we haven't been able to cover in this tutorial. Check out all the demos and examples and the documentation to see all the things you can do with QML! [Previous :ref:`samegame3`] ================================================ FILE: doc/tutorials/qmltutorial/helloworld/Cell.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] import QtQuick 1.0 //![1] Item { id: container //![4] property alias cellColor: rectangle.color //![4] //![5] signal clicked(color cellColor) //![5] width: 40; height: 25 //![1] //![2] Rectangle { id: rectangle border.color: "white" anchors.fill: parent } //![2] //![3] MouseArea { anchors.fill: parent onClicked: container.clicked(container.cellColor) } //![3] } //![0] ================================================ FILE: doc/tutorials/qmltutorial/helloworld/tutorial1.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] //![3] import QtQuick 1.0 //![3] //![1] Rectangle { id: page width: 500; height: 200 color: "lightgray" //![1] //![2] Text { id: helloText text: "Hello world!" y: 30 anchors.horizontalCenter: page.horizontalCenter font.pointSize: 24; font.bold: true } //![2] } //![0] ================================================ FILE: doc/tutorials/qmltutorial/helloworld/tutorial2.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] import QtQuick 1.0 Rectangle { id: page width: 500; height: 200 color: "lightgray" Text { id: helloText text: "Hello world!" y: 30 anchors.horizontalCenter: page.horizontalCenter font.pointSize: 24; font.bold: true } Grid { id: colorPicker x: 4; anchors.bottom: page.bottom; anchors.bottomMargin: 4 rows: 2; columns: 3; spacing: 3 //![1] Cell { cellColor: "red"; onClicked: helloText.color = cellColor } //![1] Cell { cellColor: "green"; onClicked: helloText.color = cellColor } Cell { cellColor: "blue"; onClicked: helloText.color = cellColor } Cell { cellColor: "yellow"; onClicked: helloText.color = cellColor } Cell { cellColor: "steelblue"; onClicked: helloText.color = cellColor } Cell { cellColor: "black"; onClicked: helloText.color = cellColor } } } //![0] ================================================ FILE: doc/tutorials/qmltutorial/helloworld/tutorial3.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //![0] import QtQuick 1.0 Rectangle { id: page width: 500; height: 200 color: "lightgray" Text { id: helloText text: "Hello world!" y: 30 anchors.horizontalCenter: page.horizontalCenter font.pointSize: 24; font.bold: true //![1] MouseArea { id: mouseArea; anchors.fill: parent } //![1] //![2] states: State { name: "down"; when: mouseArea.pressed == true PropertyChanges { target: helloText; y: 160; rotation: 180; color: "red" } } //![2] //![3] transitions: Transition { from: ""; to: "down"; reversible: true ParallelAnimation { NumberAnimation { properties: "y,rotation"; duration: 500; easing.type: Easing.InOutQuad } ColorAnimation { duration: 500 } } } //![3] } Grid { id: colorPicker x: 4; anchors.bottom: page.bottom; anchors.bottomMargin: 4 rows: 2; columns: 3; spacing: 3 Cell { cellColor: "red"; onClicked: helloText.color = cellColor } Cell { cellColor: "green"; onClicked: helloText.color = cellColor } Cell { cellColor: "blue"; onClicked: helloText.color = cellColor } Cell { cellColor: "yellow"; onClicked: helloText.color = cellColor } Cell { cellColor: "steelblue"; onClicked: helloText.color = cellColor } Cell { cellColor: "black"; onClicked: helloText.color = cellColor } } } //![0] ================================================ FILE: doc/tutorials/qmltutorial/index.rst ================================================ .. _qmltutorial: QML Tutorial ************ This tutorial gives an introduction to QML, the mark up language for Qt Quick. It doesn't cover everything; the emphasis is on teaching the key principles, and features are introduced as needed. Through the different steps of this tutorial we will learn about QML basic types, we will create our own QML component with properties and signals, and we will create a simple animation with the help of states and transitions. Chapter one starts with a minimal "Hello world" program and the following chapters introduce new concepts. The tutorial's source code can be downloaded :download:`here`. Tutorial chapters: .. toctree:: :maxdepth: 1 step1.rst step2.rst step3.rst ================================================ FILE: doc/tutorials/qmltutorial/step1.rst ================================================ .. _qmlbasictypes: QML Tutorial 1 - Basic Types **************************** This first program is a very simple "Hello world" example that introduces some basic QML concepts. The picture below is a screenshot of this program. .. figure:: declarative-tutorial1.png :align: center Here is the QML code for the application: .. pysideinclude:: helloworld/tutorial1.qml :snippet: 0 Walkthrough =========== Import ------ First, we need to import the types that we need for this example. Most QML files will import the built-in QML types (like Rectangle, Image, ...) that come with Qt, using: .. pysideinclude:: helloworld/tutorial1.qml :snippet: 3 Rectangle element ----------------- .. pysideinclude:: helloworld/tutorial1.qml :snippet: 1 We declare a root element of type Rectangle. It is one of the basic building blocks you can use to create an application in QML. We give it an ``id`` to be able to refer to it later. In this case, we call it "page". We also set the ``width``, ``height`` and ``color`` properties. The Rectangle element contains many other properties (such as ``x`` and ``y``), but these are left at their default values. Text element ------------ .. pysideinclude code/tutorial1.qml :snippet: 2 We add a Text element as a child of the root Rectangle element that displays the text 'Hello world!'. The ``y`` property is used to position the text vertically at 30 pixels from the top of its parent. The ``anchors.horizontalCenter`` property refers to the horizontal center of an element. In this case, we specify that our text element should be horizontally centered in the *page* element. The ``font.pointSize`` and ``font.bold properties`` are related to fonts and use the dot notation. Viewing the example ------------------- To view what you have created, run the QML Viewer tool (located in the ``bin directory`` of your Qt installation) with your filename as the first argument. For example, to run the provided completed Tutorial 1 example from the install location, you would type: :: bin/qmlviewer tutorial1.qml [Previous :ref:`qmltutorial`][Next :ref:`qmlcomponents`] ================================================ FILE: doc/tutorials/qmltutorial/step2.rst ================================================ .. _qmlcomponents: QML Tutorial 2 - QML Components ******************************* This chapter adds a color picker to change the color of the text. .. figure:: declarative-tutorial2.png :align: center Our color picker is made of six cells with different colors. To avoid writing the same code multiple times for each cell, we create a new ``Cell`` component. A component provides a way of defining a new type that we can re-use in other QML files. A QML component is like a black-box and interacts with the outside world through properties, signals and functions and is generally defined in its own QML file. The component's filename must always start with a capital letter. Here is the QML code for ``Cell.qml``: .. pysideinclude:: helloworld/Cell.qml :snippet: 0 Walkthrough =========== The Cell Component ------------------ .. pysideinclude:: helloworld/Cell.qml :snippet: 1 The root element of our component is an Item with the ``id`` *container*. An Item is the most basic visual element in QML and is often used as a container for other elements. .. pysideinclude:: helloworld/Cell.qml :snippet: 4 We declare a ``cellColor`` property. This property is accessible from *outside* our component, this allows us to instantiate the cells with different colors. This property is just an alias to an existing property - the color of the rectangle that compose the cell. .. pysideinclude:: helloworld/Cell.qml :snippet: 5 We want our component to also have a signal that we call *clicked* with a *cellColor* parameter of type *color*. We will use this signal to change the color of the text in the main QML file later. .. pysideinclude:: helloworld/Cell.qml :snippet: 2 Our cell component is basically a colored rectangle with the ``id`` *rectangle*. The ``anchors.fill`` property is a convenient way to set the size of an element. In this case the rectangle will have the same size as its parent. .. pysideinclude:: helloworld/Cell.qml :snippet: 3 In order to change the color of the text when clicking on a cell, we create a MouseArea element with the same size as its parent. A MouseArea defines a signal called *clicked*. When this signal is triggered we want to emit our own *clicked* signal with the color as parameter. The main QML file ----------------- In our main QML file, we use our ``Cell`` component to create the color picker: .. pysideinclude:: helloworld/tutorial2.qml :snippet: 0 We create the color picker by putting 6 cells with different colors in a grid. .. pysideinclude:: helloworld/tutorial2.qml :snippet: 1 When the *clicked* signal of our cell is triggered, we want to set the color of the text to the *cellColor* passed as a parameter. We can react to any signal of our component through a property of the name *'onSignalName'*. [Previous :ref:`qmlbasictypes`][Next :ref:`qmlstatesandtransitions`] ================================================ FILE: doc/tutorials/qmltutorial/step3.rst ================================================ .. _qmlstatesandtransitions: QML Tutorial 3 - States and Transitions *************************************** In this chapter, we make this example a little bit more dynamic by introducing states and transitions. We want our text to move to the bottom of the screen, rotate and become red when clicked. .. figure:: declarative-tutorial3_animation.gif :align: center Here is the QML code: .. pysideinclude:: helloworld/tutorial3.qml :snippet: 0 Walkthrough =========== .. pysideinclude:: helloworld/tutorial3.qml :snippet: 2 First, we create a new *down* state for our text element. This state will be activated when the MouseArea is pressed, and deactivated when it is released. The *down* state includes a set of property changes from our implicit *default state* (the items as they were initially defined in the QML). Specifically, we set the ``y`` property of the text to ``160``, the rotation to ``180`` and the ``color`` to red. .. pysideinclude:: helloworld/tutorial3.qml :snippet: 3 Because we don't want the text to appear at the bottom instantly but rather move smoothly, we add a transition between our two states. ``from`` and ``to`` define the states between which the transition will run. In this case, we want a transition from the default state to our *down* state. Because we want the same transition to be run in reverse when changing back from the *down* state to the default state, we set ``reversible`` to ``true``. This is equivalent to writing the two transitions separately. The ParallelAnimation element makes sure that the two types of animations (number and color) start at the same time. We could also run them one after the other by using SequentialAnimation instead. [Previous :ref:`qmlcomponents`] ================================================ FILE: doc/typesystem_doc.xml.in ================================================ @if_QtNetwork@ @end_QtNetwork@ @if_QtXml@ @end_QtXml@ @if_QtScript@ @end_QtScript@ @if_QtGui@ @end_QtGui@ @if_QtHelp@ @end_QtHelp@ @if_Maemo5@ @end_Maemo5@ @if_QtMultimedia@ @end_QtMultimedia@ @if_QtDeclarative@ @end_QtDeclarative@ @if_QtOpenGL@ @end_QtOpenGL@ @if_QtScriptTools@ @end_QtScriptTools@ @if_QtSql@ @end_QtSql@ @if_QtSvg@ @end_QtSvg@ @if_QtTest@ @end_QtTest@ @if_QtUiTools@ @end_QtUiTools@ @if_QtWebKit@ @end_QtWebKit@ @if_QtXmlPatterns@ @end_QtXmlPatterns@ @if_phonon@ @end_phonon@ ================================================ FILE: libpyside/CMakeLists.txt ================================================ project(libpyside) qt4_wrap_cpp(DESTROYLISTENER_MOC "destroylistener.h") set(libpyside_SRC dynamicqmetaobject.cpp destroylistener.cpp signalmanager.cpp globalreceiver.cpp globalreceiverv2.cpp pysideclassinfo.cpp pysidemetafunction.cpp pysidesignal.cpp pysideslot.cpp pysideproperty.cpp pysideqflags.cpp pysideweakref.cpp pyside.cpp ${DESTROYLISTENER_MOC} ) include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR}) add_library(pyside SHARED ${libpyside_SRC}) target_link_libraries(pyside ${SHIBOKEN_PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTCORE_LIBRARY}) set_target_properties(pyside PROPERTIES VERSION ${BINDING_API_VERSION} SOVERSION "${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION}" OUTPUT_NAME "pyside${pyside_SUFFIX}${SHIBOKEN_PYTHON_SUFFIX}" DEFINE_SYMBOL PYSIDE_EXPORTS) # # install stuff # set(libpyside_HEADERS destroylistener.h dynamicqmetaobject.h globalreceiver.h pysideclassinfo.h pysideconversions.h pysidemacros.h signalmanager.h pyside.h pysidemetafunction.h pysidesignal.h pysideproperty.h pysideqflags.h pysideweakref.h ) if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(LIBRARY_OUTPUT_SUFFIX ${CMAKE_DEBUG_POSTFIX}) else() set(LIBRARY_OUTPUT_SUFFIX ${CMAKE_RELEASE_POSTFIX}) endif() # create pkg-config file configure_file("${CMAKE_CURRENT_SOURCE_DIR}/pyside.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/pyside${pyside_SUFFIX}.pc" @ONLY) # create cmake-config files configure_file("${CMAKE_CURRENT_SOURCE_DIR}/PySideConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/PySideConfig.cmake" @ONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/PySideConfig-spec.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/PySideConfig${SHIBOKEN_PYTHON_SUFFIX}.cmake" @ONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/PySideConfigVersion.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/PySideConfigVersion.cmake" @ONLY) install(FILES ${libpyside_HEADERS} DESTINATION include/${BINDING_NAME}${pyside_SUFFIX}) install(TARGETS pyside EXPORT pyside LIBRARY DESTINATION "${LIB_INSTALL_DIR}" ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" RUNTIME DESTINATION bin) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pyside${pyside_SUFFIX}.pc" DESTINATION "${LIB_INSTALL_DIR}/pkgconfig") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/PySideConfig.cmake" DESTINATION "${LIB_INSTALL_DIR}/cmake/PySide-${BINDING_API_VERSION}") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/PySideConfig${SHIBOKEN_PYTHON_SUFFIX}.cmake" DESTINATION "${LIB_INSTALL_DIR}/cmake/PySide-${BINDING_API_VERSION}") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/PySideConfigVersion.cmake" DESTINATION "${LIB_INSTALL_DIR}/cmake/PySide-${BINDING_API_VERSION}") ================================================ FILE: libpyside/PySideConfig-spec.cmake.in ================================================ # PYSIDE_INCLUDE_DIR - Directories to include to use PySide # PYSIDE_LIBRARY - Files to link against to use PySide # PYSIDE_PYTHONPATH - Path to where the PySide Python module files could be found # PYSIDE_TYPESYSTEMS - Type system files that should be used by other bindings extending PySide SET(PYSIDE_INCLUDE_DIR "@CMAKE_INSTALL_PREFIX@/include/PySide@pyside_SUFFIX@") # Platform specific library names if(MSVC) SET(PYSIDE_LIBRARY "@LIB_INSTALL_DIR@/@CMAKE_SHARED_LIBRARY_PREFIX@pyside@pyside_SUFFIX@@LIBRARY_OUTPUT_SUFFIX@@SHIBOKEN_PYTHON_SUFFIX@.lib") elseif(CYGWIN) SET(PYSIDE_LIBRARY "@LIB_INSTALL_DIR@/@CMAKE_SHARED_LIBRARY_PREFIX@pyside@pyside_SUFFIX@@LIBRARY_OUTPUT_SUFFIX@@SHIBOKEN_PYTHON_SUFFIX@@CMAKE_IMPORT_LIBRARY_SUFFIX@") elseif(WIN32) SET(PYSIDE_LIBRARY "@CMAKE_INSTALL_PREFIX@/bin/@CMAKE_SHARED_LIBRARY_PREFIX@pyside@pyside_SUFFIX@@LIBRARY_OUTPUT_SUFFIX@@SHIBOKEN_PYTHON_SUFFIX@@CMAKE_SHARED_LIBRARY_SUFFIX@") else() SET(PYSIDE_LIBRARY "@LIB_INSTALL_DIR@/@CMAKE_SHARED_LIBRARY_PREFIX@pyside@pyside_SUFFIX@@LIBRARY_OUTPUT_SUFFIX@@SHIBOKEN_PYTHON_SUFFIX@@CMAKE_SHARED_LIBRARY_SUFFIX@") endif() SET(PYSIDE_PYTHONPATH "@SITE_PACKAGE@") SET(PYSIDE_TYPESYSTEMS "@CMAKE_INSTALL_PREFIX@/share/PySide@pyside_SUFFIX@/typesystems") ================================================ FILE: libpyside/PySideConfig.cmake.in ================================================ if (NOT PYTHON_BASENAME) message(STATUS "Using default python: @SHIBOKEN_PYTHON_SUFFIX@") SET(PYTHON_BASENAME @SHIBOKEN_PYTHON_SUFFIX@) endif() include(@LIB_INSTALL_DIR@/cmake/PySide-@BINDING_API_VERSION@/PySideConfig${PYTHON_BASENAME}.cmake) ================================================ FILE: libpyside/PySideConfigVersion.cmake.in ================================================ set(PACKAGE_VERSION @BINDING_API_VERSION@) if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" ) set(PACKAGE_VERSION_COMPATIBLE FALSE) else("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" ) set(PACKAGE_VERSION_COMPATIBLE TRUE) if( "${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}") set(PACKAGE_VERSION_EXACT TRUE) endif( "${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}") endif("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" ) ================================================ FILE: libpyside/destroylistener.cpp ================================================ #include #include "destroylistener.h" #include #include #include #include PySide::DestroyListener* PySide::DestroyListener::m_instance = 0; namespace PySide { struct DestroyListenerPrivate { static bool m_destroyed; }; DestroyListener* DestroyListener::instance() { if (!m_instance) m_instance = new DestroyListener(0); return m_instance; } void DestroyListener::destroy() { if (m_instance) { m_instance->disconnect(); delete m_instance; m_instance = 0; } } void DestroyListener::listen(QObject *obj) { SbkObject* wrapper = Shiboken::BindingManager::instance().retrieveWrapper(obj); if (!wrapper) // avoid problem with multiple inheritance return; if (Py_IsInitialized() == 0) onObjectDestroyed(obj); else QObject::connect(obj, SIGNAL(destroyed(QObject*)), this, SLOT(onObjectDestroyed(QObject*)), Qt::DirectConnection); } void DestroyListener::onObjectDestroyed(QObject* obj) { SbkObject* wrapper = Shiboken::BindingManager::instance().retrieveWrapper(obj); if (wrapper) //make sure the object exists before destroy Shiboken::Object::destroy(wrapper, obj); } DestroyListener::DestroyListener(QObject *parent) : QObject(parent) { m_d = new DestroyListenerPrivate(); } DestroyListener::~DestroyListener() { delete m_d; } }//namespace ================================================ FILE: libpyside/destroylistener.h ================================================ #ifndef PYSIDE_DESTROY_LISTENER #define PYSIDE_DESTROY_LISTENER #include #include "pysidemacros.h" namespace PySide { class DestroyListenerPrivate; /// \deprecated This class is deprecated and isn't used by libpyside anymore. class PYSIDE_API DestroyListener : public QObject { Q_OBJECT public: PYSIDE_DEPRECATED(static DestroyListener* instance()); static void destroy(); void listen(QObject* obj); public slots: void onObjectDestroyed(QObject* obj); private: static DestroyListener* m_instance; DestroyListenerPrivate* m_d; DestroyListener(QObject *parent); ~DestroyListener(); }; }//namespace #endif ================================================ FILE: libpyside/dynamicqmetaobject.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "dynamicqmetaobject.h" #include "dynamicqmetaobject_p.h" #include "pysidesignal.h" #include "pysidesignal_p.h" #include "pysideproperty.h" #include "pysideproperty_p.h" #include "pysideslot_p.h" #include #include #include #include #include #include #include #include #include #include #define EMPTY_META_METHOD "0()" using namespace PySide; enum PropertyFlags { Invalid = 0x00000000, Readable = 0x00000001, Writable = 0x00000002, Resettable = 0x00000004, EnumOrFlag = 0x00000008, StdCppSet = 0x00000100, // Override = 0x00000200, Constant = 0x00000400, Final = 0x00000800, Designable = 0x00001000, ResolveDesignable = 0x00002000, Scriptable = 0x00004000, ResolveScriptable = 0x00008000, Stored = 0x00010000, ResolveStored = 0x00020000, Editable = 0x00040000, ResolveEditable = 0x00080000, User = 0x00100000, ResolveUser = 0x00200000, Notify = 0x00400000 }; // these values are from moc source code, generator.cpp:66 enum MethodFlags { AccessPrivate = 0x00, AccessProtected = 0x01, AccessPublic = 0x02, MethodMethod = 0x00, MethodSignal = 0x04, MethodSlot = 0x08, MethodConstructor = 0x0c, MethodCompatibility = 0x10, MethodCloned = 0x20, MethodScriptable = 0x40 }; class DynamicQMetaObject::DynamicQMetaObjectPrivate { public: QList m_methods; QList m_properties; // methods added/remove not writed on metadata yet int m_lastMethod; int m_lastProperty; int m_lastInfo; QMap m_info; QByteArray m_className; bool m_updated; // when the meta data is not update bool m_invalid; // when the object need to be reconstructed int m_methodOffset; int m_propertyOffset; int m_count; int m_dataSize; int m_stringDataSize; int m_emptyMethod; int m_nullIndex; DynamicQMetaObjectPrivate() : m_lastMethod(0), m_lastProperty(0), m_lastInfo(0), m_updated(false), m_invalid(true), m_methodOffset(0), m_propertyOffset(0), m_count(0), m_dataSize(0), m_stringDataSize(0), m_emptyMethod(-1), m_nullIndex(0) {} int createMetaData(QMetaObject* metaObj, QLinkedList &strings); void updateMetaObject(QMetaObject* metaObj); void writeMethodsData(const QList& methods, unsigned int** data, QLinkedList& strings, int* prtIndex, int nullIndex, int flags); }; static int registerString(const QByteArray& s, QLinkedList& strings) { int idx = 0; QLinkedList::const_iterator it = strings.begin(); QLinkedList::const_iterator itEnd = strings.end(); while (it != itEnd) { if (strcmp(*it, s) == 0) return idx; idx += it->size() + 1; ++it; } strings.append(s); return idx; } static int qvariant_nameToType(const char* name) { if (!name) return 0; if (strcmp(name, "QVariant") == 0) return 0xffffffff; if (strcmp(name, "QCString") == 0) return QMetaType::QByteArray; if (strcmp(name, "Q_LLONG") == 0) return QMetaType::LongLong; if (strcmp(name, "Q_ULLONG") == 0) return QMetaType::ULongLong; if (strcmp(name, "QIconSet") == 0) return QMetaType::QIcon; uint tp = QMetaType::type(name); return tp < QMetaType::User ? tp : 0; } /* Returns true if the type is a QVariant types. */ static bool isVariantType(const char* type) { return qvariant_nameToType(type) != 0; } /*! Returns true if the type is qreal. */ static bool isQRealType(const char *type) { return strcmp(type, "qreal") == 0; } uint PropertyData::flags() const { const char* typeName = type().data(); uint flags = Invalid; if (!isVariantType(typeName)) flags |= EnumOrFlag; else if (!isQRealType(typeName)) flags |= qvariant_nameToType(typeName) << 24; if (PySide::Property::isReadable(m_data)) flags |= Readable; if (PySide::Property::isWritable(m_data)) flags |= Writable; if (PySide::Property::hasReset(m_data)) flags |= Resettable; if (PySide::Property::isDesignable(m_data)) flags |= Designable; else flags |= ResolveDesignable; if (PySide::Property::isScriptable(m_data)) flags |= Scriptable; else flags |= ResolveScriptable; if (PySide::Property::isStored(m_data)) flags |= Stored; else flags |= ResolveStored; //EDITABLE flags |= ResolveEditable; if (PySide::Property::isUser(m_data)) flags |= User; else flags |= ResolveUser; if (m_notifyId != -1) flags |= Notify; if (PySide::Property::isConstant(m_data)) flags |= Constant; if (PySide::Property::isFinal(m_data)) flags |= Final; return flags; } // const QByteArray with EMPTY_META_METHOD, used to save some memory const QByteArray MethodData::m_emptySig(EMPTY_META_METHOD); MethodData::MethodData() : m_signature(m_emptySig) { } MethodData::MethodData(QMetaMethod::MethodType mtype, const char* signature, const char* type) : m_signature(signature), m_mtype(mtype) { if (qstrcmp(type, "void")) m_type = type; } void MethodData::clear() { m_signature = m_emptySig; m_type.clear(); } bool MethodData::isValid() const { return m_signature != m_emptySig; } QMetaMethod::MethodType MethodData::methodType() const { return m_mtype; } PropertyData::PropertyData() : m_notifyId(0), m_data(0) { } PropertyData::PropertyData(const char* name, int notifyId, PySideProperty* data) : m_name(name), m_notifyId(notifyId), m_data(data) { } QByteArray PropertyData::type() const { return QByteArray(PySide::Property::getTypeName(m_data)); } bool PropertyData::isValid() const { return !m_name.isEmpty(); } int PropertyData::notifyId() const { return m_notifyId; } bool PropertyData::operator==(const PropertyData& other) const { return m_data == other.m_data; } bool PropertyData::operator==(const char* name) const { return m_name == QString(name); } DynamicQMetaObject::DynamicQMetaObject(PyTypeObject* type, const QMetaObject* base) : m_d(new DynamicQMetaObjectPrivate) { d.superdata = base; d.stringdata = NULL; d.data = NULL; d.extradata = NULL; m_d->m_className = QByteArray(type->tp_name).split('.').last(); m_d->m_methodOffset = base->methodCount() - 1; m_d->m_propertyOffset = base->propertyCount() - 1; parsePythonType(type); } DynamicQMetaObject::DynamicQMetaObject(const char* className, const QMetaObject* metaObject) : m_d(new DynamicQMetaObjectPrivate) { d.superdata = metaObject; d.stringdata = 0; d.data = 0; d.extradata = 0; m_d->m_className = className; m_d->m_methodOffset = metaObject->methodCount() - 1; m_d->m_propertyOffset = metaObject->propertyCount() - 1; } DynamicQMetaObject::~DynamicQMetaObject() { free(const_cast(d.stringdata)); free(const_cast(d.data)); delete m_d; } int DynamicQMetaObject::addMethod(QMetaMethod::MethodType mtype, const char* signature, const char* type) { int index = -1; int counter = 0; QList::iterator it = m_d->m_methods.begin(); for (; it != m_d->m_methods.end(); ++it) { if ((it->signature() == signature) && (it->methodType() == mtype)) return m_d->m_methodOffset + counter; else if (!it->isValid()) { index = counter; m_d->m_invalid = true; // need rewrite all methods again } counter++; } //has blank method if (index != -1) { m_d->m_methods[index] = MethodData(mtype, signature, type); index++; } else { m_d->m_methods << MethodData(mtype, signature, type); index = m_d->m_methods.size(); } m_d->m_updated = false; return m_d->m_methodOffset + index; } void DynamicQMetaObject::removeMethod(QMetaMethod::MethodType mtype, uint index) { const char* methodSig = method(index).signature(); QList::iterator it = m_d->m_methods.begin(); for (; it != m_d->m_methods.end(); ++it) { if ((it->signature() == methodSig) && (it->methodType() == mtype)){ it->clear(); m_d->m_invalid = true; break; } } } int DynamicQMetaObject::addSignal(const char* signal, const char* type) { return addMethod(QMetaMethod::Signal, signal, type); } int DynamicQMetaObject::addSlot(const char* slot, const char* type) { return addMethod(QMetaMethod::Slot, slot, type); } void DynamicQMetaObject::removeSlot(uint index) { removeMethod(QMetaMethod::Slot, index); } void DynamicQMetaObject::removeSignal(uint index) { removeMethod(QMetaMethod::Signal, index); } int DynamicQMetaObject::addProperty(const char* propertyName, PyObject* data) { int index = m_d->m_properties.indexOf(propertyName); if (index != -1) return m_d->m_propertyOffset + index; // retrieve notifyId int notifyId = -1; PySideProperty* property = reinterpret_cast(data); if (property->d->notify) { const char* signalNotify = PySide::Property::getNotifyName(property); if (signalNotify) { MethodData signalObject(QMetaMethod::Signal, signalNotify, ""); notifyId = m_d->m_methods.indexOf(signalObject); } } //search for a empty space PropertyData blank; index = m_d->m_properties.indexOf(blank); if (index != -1) { m_d->m_properties[index] = PropertyData(propertyName, notifyId, property); m_d->m_invalid = true; } else { m_d->m_properties << PropertyData(propertyName, notifyId, property); index = m_d->m_properties.size(); } m_d->m_updated = false; return m_d->m_propertyOffset + index; } void DynamicQMetaObject::addInfo(const char* key, const char* value) { m_d->m_info[key] = value; } void DynamicQMetaObject::addInfo(QMap info) { QMap::const_iterator i = info.constBegin(); while (i != info.constEnd()) { m_d->m_info[i.key()] = i.value(); ++i; } m_d->m_updated = false; } const QMetaObject* DynamicQMetaObject::update() const { if (!m_d->m_updated || m_d->m_invalid) { m_d->updateMetaObject(const_cast(this)); m_d->m_updated = true; } return this; } void DynamicQMetaObject::DynamicQMetaObjectPrivate::writeMethodsData(const QList& methods, unsigned int** data, QLinkedList& strings, int* prtIndex, int nullIndex, int flags) { int index = *prtIndex; //skip to last registered method QList::const_iterator it = methods.begin() + m_lastMethod; if (m_emptyMethod == -1) m_emptyMethod = registerString(EMPTY_META_METHOD, strings) + m_stringDataSize; for (; it != methods.end(); ++it) { if (it->signature() != EMPTY_META_METHOD) (*data)[index++] = registerString(it->signature(), strings) + m_stringDataSize; // func name else (*data)[index++] = m_emptyMethod; // func name (*data)[index++] = nullIndex; // arguments (*data)[index++] = !it->type().isEmpty() ? registerString(it->type(), strings) : nullIndex; // normalized type (*data)[index++] = nullIndex; // tags (*data)[index++] = flags | (it->methodType() == QMetaMethod::Signal ? MethodSignal : MethodSlot); } *prtIndex = index; //update last registered method m_lastMethod = methods.size(); } void DynamicQMetaObject::parsePythonType(PyTypeObject* type) { PyObject* attrs = type->tp_dict; PyObject* key = 0; PyObject* value = 0; Py_ssize_t pos = 0; Shiboken::GilState gil; typedef std::pair PropPair; QLinkedList properties; Shiboken::AutoDecRef slotAttrName(Shiboken::String::fromCString(PYSIDE_SLOT_LIST_ATTR)); while (PyDict_Next(attrs, &pos, &key, &value)) { if (Property::checkType(value)) { // Leave the properties to be register after signals because they may depend on notify signals int index = d.superdata->indexOfProperty(Shiboken::String::toCString(key)); if (index == -1) properties << PropPair(Shiboken::String::toCString(key), value); } else if (Signal::checkType(value)) { // Register signals PySideSignal* data = reinterpret_cast(value); const char* signalName = Shiboken::String::toCString(key); data->signalName = strdup(signalName); QByteArray sig; sig.reserve(128); for (int i = 0; i < data->signaturesSize; ++i) { sig = signalName; sig += '('; if (data->signatures[i]) sig += data->signatures[i]; sig += ')'; if (d.superdata->indexOfSignal(sig) == -1) addSignal(sig); } } else if (PyFunction_Check(value)) { // Register slots if (PyObject_HasAttr(value, slotAttrName)) { PyObject* signatureList = PyObject_GetAttr(value, slotAttrName); for(Py_ssize_t i = 0, i_max = PyList_Size(signatureList); i < i_max; ++i) { PyObject* signature = PyList_GET_ITEM(signatureList, i); QByteArray sig(Shiboken::String::toCString(signature)); //slot the slot type and signature QList slotInfo = sig.split(' '); int index = d.superdata->indexOfSlot(slotInfo[1]); if (index == -1) addSlot(slotInfo[1], slotInfo[0]); } } } } // Register properties foreach (PropPair propPair, properties) addProperty(propPair.first, propPair.second); } int DynamicQMetaObject::DynamicQMetaObjectPrivate::createMetaData(QMetaObject* metaObj, QLinkedList &strings) { uint n_methods = m_methods.size(); uint n_properties = m_properties.size(); uint n_info = m_info.size(); int header[] = {3, // revision 0, // class name index in m_metadata int(n_info), 0, // classinfo and classinfo index int(n_methods), 0, // method count and method list index int(n_properties), 0, // prop count and prop indexes 0, 0, // enum count and enum index 0, 0, // constructors 0}; // flags const int HEADER_LENGHT = sizeof(header)/sizeof(int); m_dataSize = HEADER_LENGHT + n_methods*5 + n_properties*4 + n_info*2 + 1; uint* data = reinterpret_cast(realloc(const_cast(metaObj->d.data), m_dataSize * sizeof(uint))); Q_ASSERT(data); std::memcpy(data, header, sizeof(header)); registerString(m_className, strings); // register class string m_nullIndex = registerString("", strings); // register a null string metaObj->d.data = data; return HEADER_LENGHT; } void DynamicQMetaObject::DynamicQMetaObjectPrivate::updateMetaObject(QMetaObject* metaObj) { uint *data = const_cast(metaObj->d.data); int index = m_dataSize - 1; // remove the last 0 QLinkedList strings; if (!data || m_invalid) { if (m_invalid) { strings.clear(); m_dataSize = m_stringDataSize = 0; m_lastMethod = m_lastInfo = m_lastProperty = 0; m_invalid = false; } index = createMetaData(metaObj, strings); data = const_cast(metaObj->d.data); } else { int n_methods = m_methods.size() - m_lastMethod; int n_info = m_info.size() - m_lastInfo; uint n_properties = m_properties.size() - m_lastProperty; int extraSize = n_methods*5 + n_properties*4 + n_info*2; if (extraSize > 0) { m_dataSize += extraSize; //realloc data data = reinterpret_cast(realloc(const_cast(metaObj->d.data), m_dataSize * sizeof(uint))); Q_ASSERT(data); data[2] = m_info.size(); //update info size data[4] = m_methods.size(); //update number of methods data[6] = m_properties.size(); // update property size metaObj->d.data = data; } else { data = const_cast(metaObj->d.data); } } //write class info if (m_info.size()) { if (data[3] == 0) data[3] = index; QMap::const_iterator i = m_info.constBegin() + m_lastInfo; //TODO: info is a hash this can fail while (i != m_info.constEnd()) { int valueIndex = registerString(i.value(), strings); int keyIndex = registerString(i.key(), strings); data[index++] = keyIndex + m_stringDataSize; data[index++] = valueIndex + m_stringDataSize; i++; } m_lastInfo = m_info.size(); } //write properties if (m_properties.size()) { if (data[7] == 0) data[7] = index; QList::const_iterator i = m_properties.constBegin() + m_lastProperty; while(i != m_properties.constEnd()) { if (i->isValid()) { data[index++] = registerString(i->name(), strings) + m_stringDataSize; // name } else data[index++] = m_nullIndex; data[index++] = (i->isValid() ? (registerString(i->type(), strings) + m_stringDataSize) : m_nullIndex); // normalized type data[index++] = i->flags(); i++; } //write properties notify i = m_properties.constBegin() + m_lastProperty; while(i != m_properties.constEnd()) { data[index++] = i->notifyId() >= 0 ? i->notifyId() : 0; //signal notify index i++; } m_lastProperty = m_properties.size(); } //write signals/slots if (m_methods.size()) { if (data[5] == 0) data[5] = index; writeMethodsData(m_methods, &data, strings, &index, m_nullIndex, AccessPublic); } data[index++] = 0; // the end // create the m_metadata string QByteArray str; QByteArray debugStr; foreach(QByteArray field, strings) { debugStr.append(field); debugStr.append('|'); str.append(field); str.append(char(0)); } int newSize = (m_stringDataSize + str.count()) * sizeof(char); char *stringdata = reinterpret_cast(realloc(const_cast(metaObj->d.stringdata), newSize)); Q_ASSERT(stringdata); metaObj->d.stringdata = stringdata; stringdata += m_stringDataSize; //shift to the end of old position std::copy(str.begin(), str.end(), stringdata); m_stringDataSize = newSize; metaObj->d.data = data; } ================================================ FILE: libpyside/dynamicqmetaobject.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef DYNAMICQMETAOBJECT_H #define DYNAMICQMETAOBJECT_H #include "pysidemacros.h" #include #include #include namespace PySide { class DynamicQMetaObject : public QMetaObject { public: DynamicQMetaObject(const char* className, const QMetaObject* metaObject); DynamicQMetaObject(PyTypeObject* type, const QMetaObject* metaobject); ~DynamicQMetaObject(); int addMethod(QMetaMethod::MethodType mtype, const char* signature, const char* type); void removeMethod(QMetaMethod::MethodType mtype, uint index); int addSignal(const char* signal, const char* type = 0); int addSlot(const char* slot, const char* type = 0); int addProperty(const char* property, PyObject* data); void addInfo(const char* key, const char* value); void addInfo(QMap info); void removeSignal(uint idex); void removeSlot(uint index); void removeProperty(uint index); const QMetaObject* update() const; private: class DynamicQMetaObjectPrivate; DynamicQMetaObjectPrivate* m_d; void parsePythonType(PyTypeObject* type); }; } #endif ================================================ FILE: libpyside/dynamicqmetaobject_p.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef DYNAMICMETAPROPERTY_P_H #define DYNAMICMETAPROPERTY_P_H #include #include #include #define GLOBAL_RECEIVER_CLASS_NAME "__GlobalReceiver__" struct PySideProperty; namespace PySide { class MethodData { public: MethodData(); /** * \param signature method signature * \param type method return type */ MethodData(QMetaMethod::MethodType mtype, const char* signature, const char* type = 0); void clear(); bool isValid() const; const QByteArray& signature() const { return m_signature; } const QByteArray& type() const { return m_type; } QMetaMethod::MethodType methodType() const; bool operator==(const MethodData& other) const; private: QByteArray m_signature; QByteArray m_type; QMetaMethod::MethodType m_mtype; static const QByteArray m_emptySig; }; class PropertyData { public: PropertyData(); PropertyData(const char* name, int notifyId=0, PySideProperty* data = 0); const QByteArray& name() const { return m_name; } QByteArray type() const; uint flags() const; bool isValid() const; int notifyId() const; bool operator==(const PropertyData& other) const; bool operator==(const char* name) const; private: QByteArray m_name; int m_notifyId; PySideProperty* m_data; }; inline bool MethodData::operator==(const MethodData& other) const { return m_mtype == other.methodType() && m_signature == other.signature(); } } #endif ================================================ FILE: libpyside/globalreceiver.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "globalreceiver.h" #include "dynamicqmetaobject_p.h" #include "pysideweakref.h" #include #include #include #include #include #include #include #include "typeresolver.h" #include "signalmanager.h" #define RECEIVER_DESTROYED_SLOT_NAME "__receiverDestroyed__(QObject*)" namespace PySide { class DynamicSlotData { public: DynamicSlotData(int id, PyObject* callback, GlobalReceiver* parent); void addRef(const QObject* o); void decRef(const QObject* o); void clear(); int hasRefTo(const QObject* o) const; int refCount() const; int id() const; PyObject* call(PyObject* args); ~DynamicSlotData(); static void onCallbackDestroyed(void* data); private: int m_id; bool m_isMethod; PyObject* m_callback; PyObject* m_pythonSelf; PyObject* m_pyClass; PyObject* m_weakRef; GlobalReceiver* m_parent; QLinkedList m_refs; }; } using namespace PySide; DynamicSlotData::DynamicSlotData(int id, PyObject* callback, GlobalReceiver* parent) : m_id(id), m_pythonSelf(0), m_pyClass(0), m_weakRef(0), m_parent(parent) { Shiboken::GilState gil; m_isMethod = PyMethod_Check(callback); if (m_isMethod) { //Can not store calback pointe because this will be destroyed at the end of the scope //To avoid increment intance reference keep the callback information m_callback = PyMethod_GET_FUNCTION(callback); #ifdef IS_PY3K m_pyClass = 0; #else m_pyClass = PyMethod_GET_CLASS(callback); #endif m_pythonSelf = PyMethod_GET_SELF(callback); //monitor class from method lifetime m_weakRef = WeakRef::create(m_pythonSelf, DynamicSlotData::onCallbackDestroyed, this); } else { m_callback = callback; Py_INCREF(m_callback); } } PyObject* DynamicSlotData::call(PyObject* args) { PyObject* callback = m_callback; //create a callback based on method data Shiboken::GilState gil; if (m_isMethod) #ifdef IS_PY3K callback = PyMethod_New(callback, m_pythonSelf); #else callback = PyMethod_New(callback, m_pythonSelf, m_pyClass); #endif PyObject* result = PyObject_CallObject(callback, args); if (m_isMethod) Py_DECREF(callback); return result; } void DynamicSlotData::addRef(const QObject *o) { m_refs.append(o); } void DynamicSlotData::decRef(const QObject *o) { m_refs.removeOne(o); } int DynamicSlotData::refCount() const { return m_refs.size(); } int DynamicSlotData::id() const { return m_id; } int DynamicSlotData::hasRefTo(const QObject *o) const { return m_refs.count(o); } void DynamicSlotData::clear() { Shiboken::GilState gil; Py_XDECREF(m_weakRef); m_weakRef = 0; m_refs.clear(); } DynamicSlotData::~DynamicSlotData() { Shiboken::GilState gil; clear(); if (!m_isMethod) Py_DECREF(m_callback); } void DynamicSlotData::onCallbackDestroyed(void *data) { Shiboken::GilState gil; DynamicSlotData* self = reinterpret_cast(data); //Disconnect all sources QMetaMethod m = self->m_parent->metaObject()->method(self->m_id); QByteArray methodName = QByteArray::number(m.methodType()).append(m.signature()); QLinkedList sources = self->m_refs; foreach(const QObject* src, sources) const_cast(src)->disconnect(self->m_parent, methodName); self->m_weakRef = 0; } GlobalReceiver::GlobalReceiver() : m_metaObject(GLOBAL_RECEIVER_CLASS_NAME, &QObject::staticMetaObject) { //slot used to be notifyed of object destrouction m_metaObject.addSlot(RECEIVER_DESTROYED_SLOT_NAME); m_metaObject.update(); setObjectName("GLOBAL RECEIVER"); } GlobalReceiver::~GlobalReceiver() { while(!m_slotReceivers.empty()) { DynamicSlotData* data = m_slotReceivers.take(m_slotReceivers.begin().key()); data->clear(); delete data; } } void GlobalReceiver::connectNotify(QObject* source, int slotId) { if (m_slotReceivers.contains(slotId)) { DynamicSlotData* data = m_slotReceivers[slotId]; if (!data->hasRefTo(source)) QObject::connect(source, SIGNAL(destroyed(QObject*)), this, "1" RECEIVER_DESTROYED_SLOT_NAME); data->addRef(source); } } void GlobalReceiver::disconnectNotify(QObject* source, int slotId) { if (m_slotReceivers.contains(slotId)) { DynamicSlotData *data = m_slotReceivers[slotId]; data->decRef(source); if (data->refCount() == 0) removeSlot(slotId); if (!hasConnectionWith(source)) QObject::disconnect(source, SIGNAL(destroyed(QObject*)), this, "1" RECEIVER_DESTROYED_SLOT_NAME); } } const QMetaObject* GlobalReceiver::metaObject() const { return m_metaObject.update(); } int GlobalReceiver::addSlot(const char* slot, PyObject* callback) { int slotId = m_metaObject.addSlot(slot); if (!m_slotReceivers.contains(slotId)) m_slotReceivers[slotId] = new DynamicSlotData(slotId, callback, this); bool isShortCircuit = true; for (int i = 0; slot[i]; ++i) { if (slot[i] == '(') { isShortCircuit = false; break; } } if (isShortCircuit) m_shortCircuitSlots << slotId; Q_ASSERT(slotId >= QObject::staticMetaObject.methodCount()); return slotId; } void GlobalReceiver::removeSlot(int slotId) { if (m_slotReceivers.contains(slotId)) { delete m_slotReceivers.take(slotId); m_metaObject.removeSlot(slotId); m_shortCircuitSlots.remove(slotId); } } bool GlobalReceiver::hasConnectionWith(const QObject *object) { QHash::iterator i = m_slotReceivers.begin(); while(i != m_slotReceivers.end()) { if (i.value()->hasRefTo(object)) { return true; } i++; } return false; } int GlobalReceiver::qt_metacall(QMetaObject::Call call, int id, void** args) { Q_ASSERT(call == QMetaObject::InvokeMetaMethod); Q_ASSERT(id >= QObject::staticMetaObject.methodCount()); QMetaMethod slot = metaObject()->method(id); Q_ASSERT(slot.methodType() == QMetaMethod::Slot); if (strcmp(slot.signature(), RECEIVER_DESTROYED_SLOT_NAME) == 0) { QObject *arg = *(QObject**)args[1]; //avoid hash changes during the destruction QHash copy = m_slotReceivers; QHash::iterator i = copy.begin(); while(i != copy.end()) { //Remove all refs int refs = i.value()->hasRefTo(arg); while(refs) { disconnectNotify(arg, i.key()); refs--; } i++; } return -1; } DynamicSlotData* data = m_slotReceivers.value(id); if (!data) { qWarning() << "Unknown global slot, id:" << id; return -1; } Shiboken::GilState gil; PyObject* retval = 0; if (m_shortCircuitSlots.contains(id)) { retval = data->call(reinterpret_cast(args[1])); } else { QList paramTypes = slot.parameterTypes(); Shiboken::AutoDecRef preparedArgs(PyTuple_New(paramTypes.count())); for (int i = 0, max = paramTypes.count(); i < max; ++i) { const QByteArray& paramType = paramTypes[i]; Shiboken::Conversions::SpecificConverter converter(paramType.constData()); PyTuple_SET_ITEM(preparedArgs.object(), i, converter.toPython(args[i+1])); } retval = data->call(preparedArgs); } if (!retval) PyErr_Print(); else Py_DECREF(retval); return -1; } ================================================ FILE: libpyside/globalreceiver.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef GLOBALRECEIVER_H #define GLOBALRECEIVER_H #include #include #include #include #include "dynamicqmetaobject.h" namespace PySide { class DynamicSlotData; class GlobalReceiver : public QObject { public: GlobalReceiver(); ~GlobalReceiver(); int qt_metacall(QMetaObject::Call call, int id, void** args); const QMetaObject* metaObject() const; int addSlot(const char* slot, PyObject* callback); void removeSlot(int slotId); void connectNotify(QObject* sender, int slotId); void disconnectNotify(QObject* sender, int slotId); bool hasConnectionWith(const QObject* object); protected: using QObject::connectNotify; using QObject::disconnectNotify; private: DynamicQMetaObject m_metaObject; QSet m_shortCircuitSlots; QHash m_slotReceivers; }; } #endif ================================================ FILE: libpyside/globalreceiverv2.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "globalreceiverv2.h" #include "dynamicqmetaobject_p.h" #include "pysideweakref.h" #include #include #include #include #include #include #include "typeresolver.h" #include "signalmanager.h" #define RECEIVER_DESTROYED_SLOT_NAME "__receiverDestroyed__(QObject*)" namespace { static int DESTROY_SIGNAL_ID = 0; static int DESTROY_SLOT_ID = 0; } namespace PySide { class DynamicSlotDataV2 { public: DynamicSlotDataV2(PyObject* callback, GlobalReceiverV2* parent); ~DynamicSlotDataV2(); int addSlot(const char* signature); int id(const char* signature) const; PyObject* callback(); QByteArray hash() const; void notify(); static void onCallbackDestroyed(void* data); static QByteArray hash(PyObject *callback); private: bool m_isMethod; PyObject* m_callback; PyObject* m_pythonSelf; PyObject* m_pyClass; PyObject* m_weakRef; QMap m_signatures; GlobalReceiverV2* m_parent; QByteArray m_hash; }; } using namespace PySide; DynamicSlotDataV2::DynamicSlotDataV2(PyObject* callback, GlobalReceiverV2* parent) : m_pythonSelf(0), m_pyClass(0), m_weakRef(0), m_parent(parent) { Shiboken::GilState gil; m_isMethod = PyMethod_Check(callback); if (m_isMethod) { //Can not store calback pointe because this will be destroyed at the end of the scope //To avoid increment intance reference keep the callback information m_callback = PyMethod_GET_FUNCTION(callback); #ifndef IS_PY3K m_pyClass = PyMethod_GET_CLASS(callback); #endif m_pythonSelf = PyMethod_GET_SELF(callback); //monitor class from method lifetime m_weakRef = WeakRef::create(m_pythonSelf, DynamicSlotDataV2::onCallbackDestroyed, this); m_hash = QByteArray::number((qlonglong)PyObject_Hash(m_callback)) + QByteArray::number((qlonglong)PyObject_Hash(m_pythonSelf)); } else { m_callback = callback; Py_INCREF(m_callback); m_hash = QByteArray::number((qlonglong)PyObject_Hash(m_callback)); } } QByteArray DynamicSlotDataV2::hash() const { return m_hash; } QByteArray DynamicSlotDataV2::hash(PyObject* callback) { Shiboken::GilState gil; if (PyMethod_Check(callback)) return QByteArray::number((qlonglong)PyObject_Hash(PyMethod_GET_FUNCTION(callback))) + QByteArray::number((qlonglong)PyObject_Hash(PyMethod_GET_SELF(callback))); else return QByteArray::number((qlonglong)PyObject_Hash(callback)); } PyObject* DynamicSlotDataV2::callback() { PyObject* callback = m_callback; //create a callback based on method data if (m_isMethod) #ifdef IS_PY3K callback = PyMethod_New(m_callback, m_pythonSelf); #else callback = PyMethod_New(m_callback, m_pythonSelf, m_pyClass); #endif else Py_INCREF(callback); return callback; } int DynamicSlotDataV2::id(const char* signature) const { if (m_signatures.contains(signature)) return m_signatures[signature]; return -1; } int DynamicSlotDataV2::addSlot(const char* signature) { int index = id(signature); if (index == -1) { DynamicQMetaObject *dmo = const_cast(reinterpret_cast(m_parent->metaObject())); index = m_signatures[signature] = dmo->addSlot(signature); } return index; } void DynamicSlotDataV2::onCallbackDestroyed(void *data) { DynamicSlotDataV2* self = reinterpret_cast(data); self->m_weakRef = 0; delete self->m_parent; } DynamicSlotDataV2::~DynamicSlotDataV2() { Shiboken::GilState gil; Py_XDECREF(m_weakRef); m_weakRef = 0; if (!m_isMethod) Py_DECREF(m_callback); } GlobalReceiverV2::GlobalReceiverV2(PyObject *callback, SharedMap map) : QObject(0), m_metaObject(GLOBAL_RECEIVER_CLASS_NAME, &QObject::staticMetaObject), m_sharedMap(map) { m_data = new DynamicSlotDataV2(callback, this); m_metaObject.addSlot(RECEIVER_DESTROYED_SLOT_NAME); m_metaObject.update(); m_refs.append(NULL); if (DESTROY_SIGNAL_ID == 0) DESTROY_SIGNAL_ID = QObject::staticMetaObject.indexOfSignal("destroyed(QObject*)"); if (DESTROY_SLOT_ID == 0) DESTROY_SLOT_ID = m_metaObject.indexOfSlot(RECEIVER_DESTROYED_SLOT_NAME); } GlobalReceiverV2::~GlobalReceiverV2() { m_refs.clear(); //Remove itself from map m_sharedMap->remove(m_data->hash()); delete m_data; } int GlobalReceiverV2::addSlot(const char* signature) { return m_data->addSlot(signature); } void GlobalReceiverV2::incRef(const QObject* link) { if (link) { if (!m_refs.contains(link)) { if (QMetaObject::connect(link, DESTROY_SIGNAL_ID, this, DESTROY_SLOT_ID)) m_refs.append(link); else Q_ASSERT(false); } else { m_refs.append(link); } } else { m_refs.append(NULL); } } void GlobalReceiverV2::decRef(const QObject* link) { if (m_refs.size() <= 0) return; m_refs.removeOne(link); if (link) { if (!m_refs.contains(link)) { bool result = QMetaObject::disconnect(link, DESTROY_SIGNAL_ID, this, DESTROY_SLOT_ID); Q_ASSERT(result); if (!result) return; } } if (m_refs.size() == 0) delete this; } int GlobalReceiverV2::refCount(const QObject* link) const { if (link) return m_refs.count(link); return m_refs.size(); } void GlobalReceiverV2::notify() { QSet objs = QSet::fromList(m_refs); foreach(const QObject* o, objs) { QMetaObject::disconnect(o, DESTROY_SIGNAL_ID, this, DESTROY_SLOT_ID); QMetaObject::connect(o, DESTROY_SIGNAL_ID, this, DESTROY_SLOT_ID); } } QByteArray GlobalReceiverV2::hash() const { return m_data->hash(); } QByteArray GlobalReceiverV2::hash(PyObject* callback) { return DynamicSlotDataV2::hash(callback); } const QMetaObject* GlobalReceiverV2::metaObject() const { return m_metaObject.update(); } int GlobalReceiverV2::qt_metacall(QMetaObject::Call call, int id, void** args) { Shiboken::GilState gil; Q_ASSERT(call == QMetaObject::InvokeMetaMethod); Q_ASSERT(id >= QObject::staticMetaObject.methodCount()); QMetaMethod slot = metaObject()->method(id); Q_ASSERT(slot.methodType() == QMetaMethod::Slot); if (id == DESTROY_SLOT_ID) { if (m_refs.size() == 0) return -1; QObject *obj = *(QObject**)args[1]; incRef(); //keep the object live (safe ref) m_refs.removeAll(obj); // remove all refs to this object decRef(); //remove the safe ref } else { bool isShortCuit = (strstr(slot.signature(), "(") == 0); Shiboken::AutoDecRef callback(m_data->callback()); SignalManager::callPythonMetaMethod(slot, args, callback, isShortCuit); } return -1; } ================================================ FILE: libpyside/globalreceiverv2.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef GLOBALRECEIVER_V2_H #define GLOBALRECEIVER_V2_H #include #include #include #include #include #include #include #include "dynamicqmetaobject.h" namespace PySide { class DynamicSlotDataV2; class GlobalReceiverV2; typedef QSharedPointer< QMap > SharedMap; /** * A class used to make the link between the C++ Signal/Slot and Python callback * This class is used internally by SignalManager **/ class GlobalReceiverV2 : public QObject { public: /** * Create a GlobalReceiver object that will call 'callback' argumentent * * @param callback A Python callable object (can be a method or not) * @param ma A SharedPointer used on Signal manager that contains all instaces of GlobalReceiver **/ GlobalReceiverV2(PyObject *callback, SharedMap map); /** * Destructor **/ ~GlobalReceiverV2(); /** * Reimplemented function from QObject **/ int qt_metacall(QMetaObject::Call call, int id, void** args); const QMetaObject* metaObject() const; /** * Add a extra slot to this object * * @param signature The signature of the slot to be added * @return The index of this slot on metaobject **/ int addSlot(const char* signature); /** * Notify to GlobalReceiver about when a new connection was made **/ void notify(); /** * Used to increment the reference of the GlobalReceiver object * * @param link This is a optional paramenter used to link the ref to some QObject life **/ void incRef(const QObject* link = 0); /** * Used to decrement the reference of the GlobalReceiver object * * @param link This is a optional paramenter used to dismiss the link ref to some QObject **/ void decRef(const QObject* link = 0); /* * Return the count of refs which the GlobalReceiver has * * @param link If any QObject was passed, the function return the number of references relative to this 'link' object * @return The number of references **/ int refCount(const QObject* link) const; /** * Use to retrive the unique hash of this GlobalReceiver object * * @return a string with a unique id based on GlobalReceiver contents **/ QByteArray hash() const; /** * Use to retrive the unique hash of the PyObject based on GlobalReceiver rules * * @param callback The Python callable object used to calculate the id * @return a string with a unique id based on GlobalReceiver contents **/ static QByteArray hash(PyObject* callback); private: DynamicQMetaObject m_metaObject; DynamicSlotDataV2 *m_data; QList m_refs; int m_ref; SharedMap m_sharedMap; }; } #endif ================================================ FILE: libpyside/pyside.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "pyside.h" #include "signalmanager.h" #include "pysideclassinfo_p.h" #include "pysideproperty_p.h" #include "pysideproperty.h" #include "pysidesignal.h" #include "pysidesignal_p.h" #include "pysideslot_p.h" #include "pysidemetafunction_p.h" #include "pysidemetafunction.h" #include "dynamicqmetaobject.h" #include "destroylistener.h" #include #include #include #include #include #include #include #include #include #include #include #include #include static QStack cleanupFunctionList; static void* qobjectNextAddr; namespace PySide { void init(PyObject *module) { qobjectNextAddr = 0; ClassInfo::init(module); Signal::init(module); Slot::init(module); Property::init(module); MetaFunction::init(module); // Init signal manager, so it will register some meta types used by QVariant. SignalManager::instance(); } bool fillQtProperties(PyObject* qObj, const QMetaObject* metaObj, PyObject* kwds, const char** blackList, unsigned int blackListSize) { PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(kwds, &pos, &key, &value)) { if (!blackListSize || !std::binary_search(blackList, blackList + blackListSize, std::string(Shiboken::String::toCString(key)))) { QByteArray propName(Shiboken::String::toCString(key)); if (metaObj->indexOfProperty(propName) != -1) { propName[0] = std::toupper(propName[0]); propName.prepend("set"); Shiboken::AutoDecRef propSetter(PyObject_GetAttrString(qObj, propName.constData())); if (!propSetter.isNull()) { Shiboken::AutoDecRef args(PyTuple_Pack(1, value)); Shiboken::AutoDecRef retval(PyObject_CallObject(propSetter, args)); } else { PyObject* attr = PyObject_GenericGetAttr(qObj, key); if (PySide::Property::checkType(attr)) PySide::Property::setValue(reinterpret_cast(attr), qObj, value); } } else { propName.append("()"); if (metaObj->indexOfSignal(propName) != -1) { propName.prepend('2'); PySide::Signal::connect(qObj, propName, value); } else { PyErr_Format(PyExc_AttributeError, "'%s' is not a Qt property or a signal", propName.constData()); return false; }; } } } return true; } void registerCleanupFunction(CleanupFunction func) { cleanupFunctionList.push(func); } void runCleanupFunctions() { //PySide::DestroyListener::instance()->destroy(); while (!cleanupFunctionList.isEmpty()) { CleanupFunction f = cleanupFunctionList.pop(); f(); } PySide::DestroyListener::destroy(); } static void destructionVisitor(SbkObject* pyObj, void* data) { void** realData = reinterpret_cast(data); SbkObject* pyQApp = reinterpret_cast(realData[0]); PyTypeObject* pyQObjectType = reinterpret_cast(realData[1]); if (pyObj != pyQApp && PyObject_TypeCheck(pyObj, pyQObjectType)) { if (Shiboken::Object::hasOwnership(pyObj) && Shiboken::Object::isValid(pyObj, false)) { Shiboken::Object::setValidCpp(pyObj, false); Py_BEGIN_ALLOW_THREADS Shiboken::callCppDestructor(Shiboken::Object::cppPointer(pyObj, pyQObjectType)); Py_END_ALLOW_THREADS } } }; void destroyQCoreApplication() { SignalManager::instance().clear(); QCoreApplication* app = QCoreApplication::instance(); if (!app) return; Shiboken::BindingManager& bm = Shiboken::BindingManager::instance(); SbkObject* pyQApp = bm.retrieveWrapper(app); PyTypeObject* pyQObjectType = Shiboken::Conversions::getPythonTypeObject("QObject*"); assert(pyQObjectType); void* data[2] = {pyQApp, pyQObjectType}; bm.visitAllPyObjects(&destructionVisitor, &data); // in the end destroy app // Allow threads because the destructor calls // QThreadPool::globalInstance().waitForDone() which may deadlock on the GIL // if there is a worker working with python objects. Py_BEGIN_ALLOW_THREADS delete app; Py_END_ALLOW_THREADS } struct TypeUserData { TypeUserData(PyTypeObject* type, const QMetaObject* metaobject) : mo(type, metaobject) {} DynamicQMetaObject mo; std::size_t cppObjSize; }; std::size_t getSizeOfQObject(SbkObjectType* type) { using namespace Shiboken::ObjectType; TypeUserData* userData = reinterpret_cast(getTypeUserData(reinterpret_cast(type))); return userData->cppObjSize; } void initDynamicMetaObject(SbkObjectType* type, const QMetaObject* base, const std::size_t& cppObjSize) { //create DynamicMetaObject based on python type TypeUserData* userData = new TypeUserData(reinterpret_cast(type), base); userData->cppObjSize = cppObjSize; userData->mo.update(); Shiboken::ObjectType::setTypeUserData(type, userData, Shiboken::callCppDestructor); //initialize staticQMetaObject property void* metaObjectPtr = &userData->mo; static SbkConverter* converter = Shiboken::Conversions::getConverter("QMetaObject"); if (!converter) return; Shiboken::AutoDecRef pyMetaObject(Shiboken::Conversions::pointerToPython(converter, metaObjectPtr)); PyObject_SetAttrString(reinterpret_cast(type), "staticMetaObject", pyMetaObject); } void initDynamicMetaObject(SbkObjectType* type, const QMetaObject* base) { initDynamicMetaObject(type, base, 0); } void initQObjectSubType(SbkObjectType* type, PyObject* args, PyObject* kwds) { PyTypeObject* qObjType = Shiboken::Conversions::getPythonTypeObject("QObject*"); QByteArray className(Shiboken::String::toCString(PyTuple_GET_ITEM(args, 0))); PyObject* bases = PyTuple_GET_ITEM(args, 1); int numBases = PyTuple_GET_SIZE(bases); QMetaObject* baseMo = 0; SbkObjectType* qobjBase = 0; for (int i = 0; i < numBases; ++i) { PyTypeObject* base = reinterpret_cast(PyTuple_GET_ITEM(bases, i)); if (PyType_IsSubtype(base, qObjType)) { baseMo = reinterpret_cast(Shiboken::ObjectType::getTypeUserData(reinterpret_cast(base))); qobjBase = reinterpret_cast(base); reinterpret_cast(baseMo)->update(); break; } } if (!baseMo) { qWarning("Sub class of QObject not inheriting QObject!? Crash will happen when using %s.", className.constData()); return; } TypeUserData* userData = reinterpret_cast(Shiboken::ObjectType::getTypeUserData(qobjBase)); initDynamicMetaObject(type, baseMo, userData->cppObjSize); } PyObject* getMetaDataFromQObject(QObject* cppSelf, PyObject* self, PyObject* name) { PyObject* attr = PyObject_GenericGetAttr(self, name); if (!Shiboken::Object::isValid(reinterpret_cast(self), false)) return attr; if (attr && Property::checkType(attr)) { PyObject *value = Property::getValue(reinterpret_cast(attr), self); Py_DECREF(attr); if (!value) return 0; Py_INCREF(value); attr = value; } //mutate native signals to signal instance type if (attr && PyObject_TypeCheck(attr, &PySideSignalType)) { PyObject* signal = reinterpret_cast(Signal::initialize(reinterpret_cast(attr), name, self)); PyObject_SetAttr(self, name, reinterpret_cast(signal)); return signal; } //search on metaobject (avoid internal attributes started with '__') if (!attr) { const char* cname = Shiboken::String::toCString(name); uint cnameLen = qstrlen(cname); if (std::strncmp("__", cname, 2)) { const QMetaObject* metaObject = cppSelf->metaObject(); //signal QList signalList; for(int i=0, i_max = metaObject->methodCount(); i < i_max; i++) { QMetaMethod method = metaObject->method(i); const char* methSig = method.signature(); bool methMacth = !std::strncmp(cname, methSig, cnameLen) && methSig[cnameLen] == '('; if (methMacth) { if (method.methodType() == QMetaMethod::Signal) { signalList.append(method); } else { PySideMetaFunction* func = MetaFunction::newObject(cppSelf, i); if (func) { PyObject_SetAttr(self, name, (PyObject*)func); return (PyObject*)func; } } } } if (signalList.size() > 0) { PyObject* pySignal = reinterpret_cast(Signal::newObjectFromMethod(self, signalList)); PyObject_SetAttr(self, name, pySignal); return pySignal; } } } return attr; } bool inherits(PyTypeObject* objType, const char* class_name) { if (strcmp(objType->tp_name, class_name) == 0) return true; PyTypeObject* base = (objType)->tp_base; if (base == 0) return false; return inherits(base, class_name); } void* nextQObjectMemoryAddr() { return qobjectNextAddr; } void setNextQObjectMemoryAddr(void* addr) { qobjectNextAddr = addr; } } // namespace PySide // A QSharedPointer is used with a deletion function to invalidate a pointer // when the property value is cleared. This should be a QSharedPointer with // a void* pointer, but that isn't allowed typedef char any_t; Q_DECLARE_METATYPE(QSharedPointer); namespace PySide { static void invalidatePtr(any_t* object) { Shiboken::GilState state; SbkObject* wrapper = Shiboken::BindingManager::instance().retrieveWrapper(object); if (wrapper != NULL) Shiboken::BindingManager::instance().releaseWrapper(wrapper); } static const char invalidatePropertyName[] = "_PySideInvalidatePtr"; PyObject* getWrapperForQObject(QObject* cppSelf, SbkObjectType* sbk_type) { PyObject* pyOut = (PyObject*)Shiboken::BindingManager::instance().retrieveWrapper(cppSelf); if (pyOut) { Py_INCREF(pyOut); return pyOut; } // Setting the property will trigger an QEvent notification, which may call into // code that creates the wrapper so only set the property if it isn't already // set and check if it's created after the set call QVariant existing = cppSelf->property(invalidatePropertyName); if (!existing.isValid()) { QSharedPointer shared_with_del((any_t*)cppSelf, invalidatePtr); cppSelf->setProperty(invalidatePropertyName, QVariant::fromValue(shared_with_del)); pyOut = (PyObject*)Shiboken::BindingManager::instance().retrieveWrapper(cppSelf); if (pyOut) { Py_INCREF(pyOut); return pyOut; } } const char* typeName = typeid(*cppSelf).name(); pyOut = Shiboken::Object::newObject(sbk_type, cppSelf, false, false, typeName); return pyOut; } } //namespace PySide ================================================ FILE: libpyside/pyside.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_H #define PYSIDE_H #include #include #include #include #include class SbkObjectType; namespace PySide { PYSIDE_API void init(PyObject *module); /** * Hash function used to enable hash on objects not supported on native Qt library which has toString function. */ template inline uint hash(const T& value) { return qHash(value.toString()); } /** * Fill QObject properties and do signal connections using the values found in \p kwds dictonary. * \param qObj PyObject fot the QObject. * \param metaObj QMetaObject of \p qObj. * \param blackList keys to be ignored in kwds dictionary, this string list MUST be sorted. * \param blackListSize numbe rof elements in blackList. * \param kwds key->value dictonary. * \return True if everything goes well, false with a Python error setted otherwise. */ PYSIDE_API bool fillQtProperties(PyObject* qObj, const QMetaObject* metaObj, PyObject* kwds, const char** blackList, unsigned int blackListSize); /** * If the type \p T was registered on Qt meta type system with Q_DECLARE_METATYPE macro, this class will initialize * the meta type. * * Initialize a meta type means register it on Qt meta type system, Qt itself only do this on the first call of * qMetaTypeId, and this is exactly what we do to init it. If we don't do that, calls to QMetaType::type("QMatrix2x2") * could return zero, causing QVariant to not recognize some C++ types, like QMatrix2x2. */ template::Defined > struct initQtMetaType { initQtMetaType() { qMetaTypeId(); } }; // Template specialization to do nothing when the type wasn't registered on Qt meta type system. template struct initQtMetaType { }; PYSIDE_DEPRECATED(PYSIDE_API void initDynamicMetaObject(SbkObjectType* type, const QMetaObject* base)); PYSIDE_API void initDynamicMetaObject(SbkObjectType* type, const QMetaObject* base, const std::size_t& cppObjSize); PYSIDE_API void initQObjectSubType(SbkObjectType* type, PyObject* args, PyObject* kwds); /// Return the size in bytes of a type that inherits QObject. PYSIDE_API std::size_t getSizeOfQObject(SbkObjectType* type); typedef void (*CleanupFunction)(void); /** * Register a function to be called before python die */ PYSIDE_API void registerCleanupFunction(CleanupFunction func); PYSIDE_API void runCleanupFunctions(); /** * Destroy a QCoreApplication taking care of destroy all instances of QObject first. */ PYSIDE_API void destroyQCoreApplication(); /** * Check for properties and signals registered on MetaObject and return these * \param cppSelf Is the QObject which contains the metaobject * \param self Python object of cppSelf * \param name Name of the argument which the function will try retrieve from MetaData * \return The Python object which contains the Data obtained in metaObject or the Python attribute related with name */ PYSIDE_API PyObject* getMetaDataFromQObject(QObject* cppSelf, PyObject* self, PyObject* name); /** * Check if self inherits from class_name * \param self Python object * \param class_name strict with the class name * \return Returns true if self object inherits from class_name, otherwise returns false */ PYSIDE_API bool inherits(PyTypeObject* self, const char* class_name); PYSIDE_API void* nextQObjectMemoryAddr(); PYSIDE_API void setNextQObjectMemoryAddr(void* addr); PYSIDE_API PyObject* getWrapperForQObject(QObject* cppSelf, SbkObjectType* sbk_type); } //namespace PySide #endif // PYSIDE_H ================================================ FILE: libpyside/pyside.pc.in ================================================ prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=@CMAKE_INSTALL_PREFIX@ libdir=@LIB_INSTALL_DIR@ includedir=@CMAKE_INSTALL_PREFIX@/include/PySide@pyside_SUFFIX@ typesystemdir=@CMAKE_INSTALL_PREFIX@/share/PySide@pyside_SUFFIX@/typesystems pythonpath=@SITE_PACKAGE@ Name: PySide@pyside_SUFFIX@ Description: Support library for Python bindings of Qt-based libraries. Version: @BINDING_API_VERSION_FULL@ Libs: -L${libdir} -lpyside@pyside_SUFFIX@@SHIBOKEN_PYTHON_SUFFIX@@LIBRARY_OUTPUT_SUFFIX@ Cflags: -I${includedir} Requires: shiboken ================================================ FILE: libpyside/pysideclassinfo.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "pysideclassinfo.h" #include "pysideclassinfo_p.h" #include "dynamicqmetaobject.h" #include #include #define CLASSINFO_CLASS_NAME "ClassInfo" extern "C" { static PyObject* classInfoTpNew(PyTypeObject* subtype, PyObject* args, PyObject* kwds); static int classInfoTpInit(PyObject*, PyObject*, PyObject*); static void classInfoFree(void*); static PyObject* classCall(PyObject*, PyObject*, PyObject*); PyTypeObject PySideClassInfoType = { PyVarObject_HEAD_INIT(0, 0) CLASSINFO_CLASS_NAME, /*tp_name*/ sizeof(PySideClassInfo), /*tp_basicsize*/ 0, /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ classCall, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /*tp_doc */ 0, /*tp_traverse */ 0, /*tp_clear */ 0, /*tp_richcompare */ 0, /*tp_weaklistoffset */ 0, /*tp_iter */ 0, /*tp_iternext */ 0, /*tp_methods */ 0, /*tp_members */ 0, /*tp_getset */ 0, /*tp_base */ 0, /*tp_dict */ 0, /*tp_descr_get */ 0, /*tp_descr_set */ 0, /*tp_dictoffset */ classInfoTpInit, /*tp_init */ 0, /*tp_alloc */ classInfoTpNew, /*tp_new */ classInfoFree, /*tp_free */ 0, /*tp_is_gc */ 0, /*tp_bases */ 0, /*tp_mro */ 0, /*tp_cache */ 0, /*tp_subclasses */ 0, /*tp_weaklist */ 0, /*tp_del */ }; PyObject* classCall(PyObject* self, PyObject* args, PyObject* kw) { PyObject* klass; klass = PyTuple_GetItem(args, 0); if (Shiboken::ObjectType::checkType(reinterpret_cast(klass))) { PySide::DynamicQMetaObject* mo = reinterpret_cast(Shiboken::ObjectType::getTypeUserData(reinterpret_cast(klass))); if (mo) mo->addInfo(PySide::ClassInfo::getMap(reinterpret_cast(self))); } Py_INCREF(klass); return klass; } static PyObject* classInfoTpNew(PyTypeObject* subtype, PyObject* args, PyObject* kwds) { PySideClassInfo* me = reinterpret_cast(subtype->tp_alloc(subtype, 0)); me->d = new PySideClassInfoPrivate; return (PyObject*) me; } int classInfoTpInit(PyObject* self, PyObject* args, PyObject* kwds) { PySideClassInfo* data = reinterpret_cast(self); PySideClassInfoPrivate* pData = data->d; PyObject* key; PyObject* value; Py_ssize_t pos = 0; while (PyDict_Next(kwds, &pos, &key, &value)) { if (Shiboken::String::check(key) && Shiboken::String::check(value)) pData->m_data[Shiboken::String::toCString(key)] = Shiboken::String::toCString(value); } return PyErr_Occurred() ? -1 : 1; } void classInfoFree(void *self) { PyObject* pySelf = reinterpret_cast(self); PySideClassInfo* data = reinterpret_cast(self); delete data->d; pySelf->ob_type->tp_base->tp_free(self); } } // extern "C" namespace PySide { namespace ClassInfo { void init(PyObject* module) { if (PyType_Ready(&PySideClassInfoType) < 0) return; Py_INCREF(&PySideClassInfoType); PyModule_AddObject(module, CLASSINFO_CLASS_NAME, ((PyObject*)&PySideClassInfoType)); } bool checkType(PyObject* pyObj) { if (pyObj) return PyType_IsSubtype(pyObj->ob_type, &PySideClassInfoType); return false; } QMap getMap(PySideClassInfo* obj) { return obj->d->m_data; } } //namespace Property } //namespace PySide ================================================ FILE: libpyside/pysideclassinfo.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_CLASSINFO_H #define PYSIDE_CLASSINFO_H #include #include #include #include extern "C" { extern PYSIDE_API PyTypeObject PySideClassInfoType; struct PySideClassInfoPrivate; struct PYSIDE_API PySideClassInfo { PyObject_HEAD PySideClassInfoPrivate* d; }; }; namespace PySide { namespace ClassInfo { PYSIDE_API bool checkType(PyObject* pyObj); PYSIDE_API QMap getMap(PySideClassInfo* obj); } //namespace ClassInfo } //namespace PySide #endif ================================================ FILE: libpyside/pysideclassinfo_p.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_CLASSINFO_P_H #define PYSIDE_CLASSINFO_P_H #include #include #include "pysideclassinfo.h" #define __INFO_ATTR_NAME__ "__classInfo__" struct PySideClassInfo; extern "C" { struct PySideClassInfoPrivate { QMap m_data; }; } // extern "C" namespace PySide { namespace ClassInfo { /** * Init PySide QProperty support system */ void init(PyObject* module); } // namespace ClassInfo } // namespace PySide #endif ================================================ FILE: libpyside/pysideconversions.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDECONVERSIONS_H #define PYSIDECONVERSIONS_H #include #include #include #include template struct QtDictConverter { static inline bool checkType(PyObject* pyObj) { return isConvertible(pyObj); } static inline bool isConvertible(PyObject* pyObj) { if (PyObject_TypeCheck(pyObj, Shiboken::SbkType())) return true; if ((Shiboken::SbkType() && Shiboken::Object::checkType(pyObj)) || !PyDict_Check(pyObj)) return false; PyObject* key; PyObject* value; Py_ssize_t pos = 0; while (PyDict_Next(pyObj, &pos, &key, &value)) { if (!Shiboken::Converter::isConvertible(key) && !Shiboken::Converter::isConvertible(value)) { return false; } } return true; } static inline PyObject* toPython(void* cppObj) { return toPython(*reinterpret_cast(cppObj)); } static inline PyObject* toPython(const QtDict& cppobj) { PyObject* result = PyDict_New(); typename QtDict::const_iterator it = cppobj.begin(); for (; it != cppobj.end(); ++it) { Shiboken::AutoDecRef keyObj(Shiboken::Converter::toPython(it.key())); Shiboken::AutoDecRef valueObj(Shiboken::Converter::toPython(it.value())); PyDict_SetItem(result, keyObj, valueObj); } return result; } static inline QtDict toCpp(PyObject* pyobj) { if (PyObject_TypeCheck(pyobj, Shiboken::SbkType())) return *reinterpret_cast(Shiboken::Object::cppPointer((SbkObject*)pyobj, Shiboken::SbkType())); QtDict result; PyObject* key; PyObject* value; Py_ssize_t pos = 0; while (PyDict_Next(pyobj, &pos, &key, &value)) result[Shiboken::Converter::toCpp(key)] = Shiboken::Converter::toCpp(value); return result; } }; template struct QtMultiMapConverter { static inline bool checkType(PyObject* pyObj) { return isConvertible(pyObj); } static inline bool isConvertible(PyObject* pyObj) { if (PyObject_TypeCheck(pyObj, Shiboken::SbkType())) return true; if ((Shiboken::SbkType() && Shiboken::Object::checkType(pyObj)) || !PyDict_Check(pyObj)) return false; PyObject* key; PyObject* value; Py_ssize_t pos = 0; while (PyDict_Next(pyObj, &pos, &key, &value)) { if (!Shiboken::Converter::isConvertible(key)) { if (PySequence_Check(value)) { for (int i = 0, max = PySequence_Length(value); i < max; ++i) { Shiboken::AutoDecRef item(PySequence_GetItem(value, i)); if (!Shiboken::Converter::isConvertible(value)) return false; } } else if (!Shiboken::Converter::isConvertible(value)) { return false; } } } return true; } static inline PyObject* toPython(void* cppObj) { return toPython(*reinterpret_cast(cppObj)); } static inline PyObject* toPython(const MultiMap& cppObj) { PyObject* result = PyDict_New(); typename MultiMap::const_iterator it = cppObj.begin(); for (; it != cppObj.end(); ++it) { Shiboken::AutoDecRef key(Shiboken::Converter::toPython(it.key())); Shiboken::AutoDecRef value(Shiboken::Converter::toPython(it.value())); PyObject* values = PyDict_GetItem(result, key); bool decRefValues = !values; if (!values) values = PyList_New(0); PyList_Append(values, value); PyDict_SetItem(result, key, values); if (decRefValues) { Py_DECREF(values); } } return result; } static inline MultiMap toCpp(PyObject* pyObj) { if (PyObject_TypeCheck(pyObj, Shiboken::SbkType())) return *reinterpret_cast(Shiboken::Object::cppPointer((SbkObject*)pyObj, Shiboken::SbkType())); MultiMap result; PyObject* key; PyObject* value; Py_ssize_t pos = 0; while (PyDict_Next(pyObj, &pos, &key, &value)) result[Shiboken::Converter::toCpp(key)] = Shiboken::Converter::toCpp(value); return result; } }; template struct QSequenceConverter { static inline bool checkType(PyObject* pyObj) { return isConvertible(pyObj); } static inline bool isConvertible(PyObject* pyObj) { if (PyObject_TypeCheck(pyObj, Shiboken::SbkType())) return true; if ((Shiboken::SbkType() && Shiboken::Object::checkType(pyObj)) || !PySequence_Check(pyObj)) return false; for (int i = 0, max = PySequence_Length(pyObj); i < max; ++i) { Shiboken::AutoDecRef item(PySequence_GetItem(pyObj, i)); if (!Shiboken::Converter::isConvertible(item)) return false; } return true; } static inline PyObject* toPython(void* cppObj) { return toPython(*reinterpret_cast(cppObj)); } static PyObject* toPython(const T& cppobj) { PyObject* result = PyList_New((int) cppobj.size()); typename T::const_iterator it = cppobj.begin(); for (int idx = 0; it != cppobj.end(); ++it, ++idx) { typename T::value_type vh(*it); PyList_SET_ITEM(result, idx, Shiboken::Converter::toPython(vh)); } return result; } static T toCpp(PyObject* pyobj) { if (PyObject_TypeCheck(pyobj, Shiboken::SbkType())) return *reinterpret_cast(Shiboken::Object::cppPointer((SbkObject*)pyobj, Shiboken::SbkType())); Shiboken::AutoDecRef fastSequence(PySequence_Fast(pyobj, "Invalid sequence object")); T result; for (int i = 0; i < PySequence_Size(pyobj); i++) { PyObject* pyItem = PySequence_Fast_GET_ITEM(fastSequence.object(), i); result << Shiboken::Converter::toCpp(pyItem); } return result; } }; template struct QFlagsConverter { static inline bool checkType(PyObject* pyObj) { return PyObject_TypeCheck(pyObj, Shiboken::SbkType()); } static inline bool isConvertible(PyObject* pyObj) { return PyObject_TypeCheck(pyObj, Shiboken::SbkType()) || PyObject_TypeCheck(pyObj, Shiboken::SbkType()); } static inline PyObject* toPython(void* cppObj) { return toPython(*reinterpret_cast(cppObj)); } static inline PyObject* toPython(const T& cppObj) { return reinterpret_cast(PySide::QFlags::newObject(cppObj, Shiboken::SbkType())); } static inline T toCpp(PyObject* pyObj) { long val = 0; if (Shiboken::Enum::check(pyObj)) { val = Shiboken::Enum::getValue(pyObj); } else if (PyObject_TypeCheck(pyObj, Shiboken::SbkType())) { val = PySide::QFlags::getValue(reinterpret_cast(pyObj)); } else if (PyNumber_Check(pyObj)) { Shiboken::AutoDecRef pyLong(PyNumber_Long(pyObj)); val = PyLong_AsLong(pyLong.object()); } else { PyErr_BadArgument(); } return T(QFlag(val)); } }; #endif ================================================ FILE: libpyside/pysidemacros.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDEMACROS_H #define PYSIDEMACROS_H #if defined _WIN32 #if PYSIDE_EXPORTS #define PYSIDE_API __declspec(dllexport) #else #if defined __MINGW32__ #define PYSIDE_API #else #define PYSIDE_API __declspec(dllimport) #endif #endif #define PYSIDE_DEPRECATED(func) __declspec(deprecated) func #else #if __GNUC__ >= 4 #define PYSIDE_API __attribute__ ((visibility("default"))) #define PYSIDE_DEPRECATED(func) func __attribute__ ((deprecated)) #else #define PYSIDE_API #define PYSIDE_DEPRECATED(func) func #endif #endif #endif ================================================ FILE: libpyside/pysidemetafunction.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "pysidemetafunction.h" #include "pysidemetafunction_p.h" #include #include #include #include extern "C" { struct PySideMetaFunctionPrivate { QObject* qobject; int methodIndex; }; //methods static void functionFree(void*); static PyObject* functionCall(PyObject*, PyObject*, PyObject*); PyTypeObject PySideMetaFunctionType = { PyVarObject_HEAD_INIT(0, 0) /*tp_name*/ "PySide.MetaFunction", /*tp_basicsize*/ sizeof(PySideMetaFunction), /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ functionCall, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ 0, /*tp_flags*/ Py_TPFLAGS_DEFAULT, /*tp_doc*/ "MetaFunction", /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ 0, /*tp_new*/ PyType_GenericNew, /*tp_free*/ functionFree, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, }; void functionFree(void *self) { PySideMetaFunction* function = reinterpret_cast(self); delete function->d; } PyObject* functionCall(PyObject* self, PyObject* args, PyObject* kw) { PySideMetaFunction* function = reinterpret_cast(self); PyObject* retVal; if (!PySide::MetaFunction::call(function->d->qobject, function->d->methodIndex, args, &retVal)) return 0; return retVal; } } // extern "C" namespace PySide { namespace MetaFunction { void init(PyObject* module) { if (PyType_Ready(&PySideMetaFunctionType) < 0) return; PyModule_AddObject(module, "MetaFunction", ((PyObject*)&PySideMetaFunctionType)); } PySideMetaFunction* newObject(QObject* source, int methodIndex) { if (methodIndex >= source->metaObject()->methodCount()) return 0; QMetaMethod method = source->metaObject()->method(methodIndex); if ((method.methodType() == QMetaMethod::Slot) || (method.methodType() == QMetaMethod::Method)) { PySideMetaFunction* function = PyObject_New(PySideMetaFunction, &PySideMetaFunctionType); function->d = new PySideMetaFunctionPrivate(); function->d->qobject = source; function->d->methodIndex = methodIndex; return function; } return 0; } bool call(QObject* self, int methodIndex, PyObject* args, PyObject** retVal) { QMetaMethod method = self->metaObject()->method(methodIndex); QList argTypes = method.parameterTypes(); // args given plus return type Shiboken::AutoDecRef sequence(PySequence_Fast(args, 0)); int numArgs = PySequence_Fast_GET_SIZE(sequence.object()) + 1; if (numArgs - 1 != argTypes.count()) { PyErr_Format(PyExc_TypeError, "%s only accepts %d arguments, %d given!", method.signature(), argTypes.count(), numArgs); return false; } QVariant* methValues = new QVariant[numArgs]; void** methArgs = new void*[numArgs]; // Prepare room for return type const char* returnType = method.typeName(); if (returnType) argTypes.prepend(returnType); else argTypes.prepend(QByteArray()); int i; for (i = 0; i < numArgs; ++i) { const QByteArray& typeName = argTypes[i]; // This must happen only when the method hasn't return type. if (typeName.isEmpty()) { methArgs[i] = 0; continue; } Shiboken::Conversions::SpecificConverter converter(typeName); if (converter) { int typeId = QMetaType::type(typeName); if (!Shiboken::Conversions::pythonTypeIsObjectType(converter)) { if (!typeId) { PyErr_Format(PyExc_TypeError, "Value types used on meta functions (including signals) need to be " "registered on meta type: %s", typeName.data()); break; } methValues[i] = QVariant(typeId, (void*) 0); } methArgs[i] = methValues[i].data(); if (i == 0) // Don't do this for return type continue; if (typeId == QVariant::String) { QString tmp; converter.toCpp(PySequence_Fast_GET_ITEM(sequence.object(), i - 1), &tmp); methValues[i] = tmp; } else { converter.toCpp(PySequence_Fast_GET_ITEM(sequence.object(), i - 1), methArgs[i]); } } else { PyErr_Format(PyExc_TypeError, "Unknown type used to call meta function (that may be a signal): %s", argTypes[i].constData()); break; } } bool ok = i == numArgs; if (ok) { Py_BEGIN_ALLOW_THREADS QMetaObject::metacall(self, QMetaObject::InvokeMetaMethod, method.methodIndex(), methArgs); Py_END_ALLOW_THREADS if (retVal) { if (methArgs[0]) { static SbkConverter* qVariantTypeConverter = Shiboken::Conversions::getConverter("QVariant"); Q_ASSERT(qVariantTypeConverter); *retVal = Shiboken::Conversions::copyToPython(qVariantTypeConverter, &methValues[0]); SbkDbg() << (*retVal); } else { *retVal = Py_None; Py_INCREF(*retVal); } } } delete[] methArgs; delete[] methValues; return ok; } } //namespace MetaFunction } //namespace PySide ================================================ FILE: libpyside/pysidemetafunction.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_FUNCTION_H #define PYSIDE_METAFUNCTION_H #include #include #include #include #include extern "C" { extern PYSIDE_API PyTypeObject PySideMetaFunctionType; struct PySideMetaFunctionPrivate; struct PYSIDE_API PySideMetaFunction { PyObject_HEAD PySideMetaFunctionPrivate* d; }; }; //extern "C" namespace PySide { namespace MetaFunction { /** * This function creates a MetaFunction object * * @param obj the QObject witch this fuction is part of * @param methodIndex The index of this function on MetaObject * @return Return a new reference of PySideMetaFunction **/ PYSIDE_API PySideMetaFunction* newObject(QObject* obj, int methodIndex); } //namespace MetaFunction } //namespace PySide #endif ================================================ FILE: libpyside/pysidemetafunction_p.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_METAFUNCTION_P_H #define PYSIDE_METAFUNCTION_P_H #include #include #include class QObject; namespace PySide { namespace MetaFunction { void init(PyObject* module); /** * Does a Qt metacall on a QObject */ bool call(QObject* self, int methodIndex, PyObject* args, PyObject** retVal = 0); } //namespace MetaFunction } //namespace PySide #endif ================================================ FILE: libpyside/pysideproperty.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "pysideproperty.h" #include "pysideproperty_p.h" #include "dynamicqmetaobject_p.h" #include "pysidesignal.h" #include "pysidesignal_p.h" #include #include #define QPROPERTY_CLASS_NAME "Property" extern "C" { static PyObject* qpropertyTpNew(PyTypeObject* subtype, PyObject* args, PyObject* kwds); static int qpropertyTpInit(PyObject*, PyObject*, PyObject*); static void qpropertyDeAlloc(PyObject* self); //methods static PyObject* qPropertyCall(PyObject*, PyObject*, PyObject*); static PyObject* qPropertySetter(PyObject*, PyObject*); static PyObject* qPropertyGetter(PyObject*, PyObject*); static int qpropertyTraverse(PyObject* self, visitproc visit, void* arg); static int qpropertyClear(PyObject* self); static PyMethodDef PySidePropertyMethods[] = { {"setter", (PyCFunction)qPropertySetter, METH_O}, {"write", (PyCFunction)qPropertySetter, METH_O}, {"getter", (PyCFunction)qPropertyGetter, METH_O}, {"read", (PyCFunction)qPropertyGetter, METH_O}, {0} }; PyTypeObject PySidePropertyType = { PyVarObject_HEAD_INIT(0, 0) QPROPERTY_CLASS_NAME, /*tp_name*/ sizeof(PySideProperty), /*tp_basicsize*/ 0, /*tp_itemsize*/ qpropertyDeAlloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ qPropertyCall, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc */ qpropertyTraverse, /*tp_traverse */ qpropertyClear, /*tp_clear */ 0, /*tp_richcompare */ 0, /*tp_weaklistoffset */ 0, /*tp_iter */ 0, /*tp_iternext */ PySidePropertyMethods, /*tp_methods */ 0, /*tp_members */ 0, /*tp_getset */ 0, /*tp_base */ 0, /*tp_dict */ 0, /*tp_descr_get */ 0, /*tp_descr_set */ 0, /*tp_dictoffset */ qpropertyTpInit, /*tp_init */ 0, /*tp_alloc */ qpropertyTpNew, /*tp_new */ 0, /*tp_free */ 0, /*tp_is_gc */ 0, /*tp_bases */ 0, /*tp_mro */ 0, /*tp_cache */ 0, /*tp_subclasses */ 0, /*tp_weaklist */ 0, /*tp_del */ }; static void qpropertyMetaCall(PySideProperty* pp, PyObject* self, QMetaObject::Call call, void** args) { Shiboken::Conversions::SpecificConverter converter(pp->d->typeName); Q_ASSERT(converter); QByteArray type(pp->d->typeName); switch(call) { case QMetaObject::ReadProperty: { Shiboken::GilState gil; PyObject* value = PySide::Property::getValue(pp, self); if (value) { converter.toCpp(value, args[0]); Py_DECREF(value); } else if (PyErr_Occurred()) { PyErr_Print(); // Clear any errors but print them to stderr } break; } case QMetaObject::WriteProperty: { Shiboken::GilState gil; Shiboken::AutoDecRef value(converter.toPython(args[0])); PySide::Property::setValue(pp, self, value); break; } case QMetaObject::ResetProperty: { Shiboken::GilState gil; PySide::Property::reset(pp, self); break; } case QMetaObject::QueryPropertyDesignable: case QMetaObject::QueryPropertyScriptable: case QMetaObject::QueryPropertyStored: case QMetaObject::QueryPropertyEditable: case QMetaObject::QueryPropertyUser: // just to avoid gcc warnings case QMetaObject::InvokeMetaMethod: case QMetaObject::CreateInstance: break; } } static PyObject* qpropertyTpNew(PyTypeObject* subtype, PyObject* args, PyObject* kwds) { PySideProperty* me = reinterpret_cast(subtype->tp_alloc(subtype, 0)); me->d = new PySidePropertyPrivate; memset(me->d, 0, sizeof(PySidePropertyPrivate)); PySidePropertyPrivate* pData = me->d; pData->designable = true; pData->scriptable = true; pData->stored = true; return (PyObject*) me; } int qpropertyTpInit(PyObject* self, PyObject* args, PyObject* kwds) { PyObject* type = 0; PySideProperty* data = reinterpret_cast(self); PySidePropertyPrivate* pData = data->d; pData->metaCallHandler = &qpropertyMetaCall; static const char *kwlist[] = {"type", "fget", "fset", "freset", "fdel", "doc", "notify", "designable", "scriptable", "stored", "user", "constant", "final", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OOOOsObbbbbb:QtCore.QProperty", (char**) kwlist, /*OO*/ &type, &(pData->fget), /*OOO*/ &(pData->fset), &(pData->freset), &(pData->fdel), /*s*/ &(pData->doc), /*O*/ &(pData->notify), /*bbbbbb*/ &(pData->designable), &(pData->scriptable), &(pData->stored), &(pData->user), &(pData->constant), &(pData->final))) { return 0; } pData->typeName = PySide::Signal::getTypeName(type); if (!pData->typeName) PyErr_SetString(PyExc_TypeError, "Invalid property type or type name."); else if (pData->constant && (pData->fset || pData->notify)) PyErr_SetString(PyExc_TypeError, "A constant property cannot have a WRITE method or a NOTIFY signal."); if (!PyErr_Occurred()) { Py_XINCREF(pData->fget); Py_XINCREF(pData->fset); Py_XINCREF(pData->freset); Py_XINCREF(pData->fdel); Py_XINCREF(pData->notify); return 1; } else { pData->fget = 0; pData->fset = 0; pData->freset = 0; pData->fdel = 0; pData->notify = 0; return -1; } } void qpropertyDeAlloc(PyObject* self) { qpropertyClear(self); Py_TYPE(self)->tp_free(self); } PyObject* qPropertyCall(PyObject* self, PyObject* args, PyObject* kw) { PyObject *callback = PyTuple_GetItem(args, 0); if (PyFunction_Check(callback)) { PySideProperty *prop = reinterpret_cast(self); PySidePropertyPrivate* pData = prop->d; Py_INCREF(callback); pData->fget = callback; Py_INCREF(self); return self; } else { PyErr_SetString(PyExc_TypeError, "Invalid property usage."); return 0; } } PyObject* qPropertySetter(PyObject* self, PyObject* callback) { if (PyFunction_Check(callback)) { PySideProperty *prop = reinterpret_cast(self); PySidePropertyPrivate* pData = prop->d; Py_INCREF(callback); pData->fset = callback; Py_INCREF(callback); return callback; } else { PyErr_SetString(PyExc_TypeError, "Invalid property setter agument."); return 0; } } PyObject* qPropertyGetter(PyObject* self, PyObject* callback) { if (PyFunction_Check(callback)) { PySideProperty *prop = reinterpret_cast(self); PySidePropertyPrivate* pData = prop->d; Py_INCREF(callback); pData->fget = callback; Py_INCREF(callback); return callback; } else { PyErr_SetString(PyExc_TypeError, "Invalid property getter agument."); return 0; } } static int qpropertyTraverse(PyObject* self, visitproc visit, void* arg) { PySidePropertyPrivate* data = reinterpret_cast(self)->d; if (!data) return 0; Py_VISIT(data->fget); Py_VISIT(data->fset); Py_VISIT(data->freset); Py_VISIT(data->fdel); Py_VISIT(data->notify); return 0; } static int qpropertyClear(PyObject* self) { PySidePropertyPrivate* data = reinterpret_cast(self)->d; if (!data) return 0; Py_CLEAR(data->fget); Py_CLEAR(data->fset); Py_CLEAR(data->freset); Py_CLEAR(data->fdel); Py_CLEAR(data->notify); free(data->typeName); free(data->doc); free(data->notifySignature); delete data; reinterpret_cast(self)->d = 0; return 0; } } // extern "C" namespace { static PyObject* getFromType(PyTypeObject* type, PyObject* name) { PyObject* attr = 0; attr = PyDict_GetItem(type->tp_dict, name); if (!attr) { PyObject* bases = type->tp_bases; int size = PyTuple_GET_SIZE(bases); for(int i=0; i < size; i++) { PyObject* base = PyTuple_GET_ITEM(bases, i); attr = getFromType(reinterpret_cast(base), name); if (attr) return attr; } } return attr; } } //namespace namespace PySide { namespace Property { void init(PyObject* module) { if (PyType_Ready(&PySidePropertyType) < 0) return; Py_INCREF(&PySidePropertyType); PyModule_AddObject(module, QPROPERTY_CLASS_NAME, ((PyObject*)&PySidePropertyType)); } bool checkType(PyObject* pyObj) { if (pyObj) { return PyType_IsSubtype(pyObj->ob_type, &PySidePropertyType); } return false; } bool isPropertyType(PyObject* pyObj) { return checkType(pyObj); } int setValue(PySideProperty* self, PyObject* source, PyObject* value) { PyObject* fset = self->d->fset; if (fset) { Shiboken::AutoDecRef args(PyTuple_New(2)); PyTuple_SET_ITEM(args, 0, source); PyTuple_SET_ITEM(args, 1, value); Py_INCREF(source); Py_INCREF(value); Shiboken::AutoDecRef result(PyObject_CallObject(fset, args)); return (result.isNull() ? -1 : 0); } else { PyErr_SetString(PyExc_AttributeError, "Attibute read only"); } return -1; } PyObject* getValue(PySideProperty* self, PyObject* source) { PyObject* fget = self->d->fget; if (fget) { Shiboken::AutoDecRef args(PyTuple_New(1)); Py_INCREF(source); PyTuple_SET_ITEM(args, 0, source); return PyObject_CallObject(fget, args); } return 0; } int reset(PySideProperty* self, PyObject* source) { PyObject* freset = self->d->freset; if (freset) { Shiboken::AutoDecRef args(PyTuple_New(1)); Py_INCREF(source); PyTuple_SET_ITEM(args, 0, source); Shiboken::AutoDecRef result(PyObject_CallObject(freset, args)); return (result.isNull() ? -1 : 0); } return -1; } const char* getTypeName(const PySideProperty* self) { return self->d->typeName; } PySideProperty* getObject(PyObject* source, PyObject* name) { PyObject* attr = 0; if (Shiboken::Object::isUserType(source)) { PyObject* dict = reinterpret_cast(source)->ob_dict; if (dict) attr = PyDict_GetItem(dict, name); } attr = getFromType(source->ob_type, name); if (attr && checkType(attr)) { Py_INCREF(attr); return reinterpret_cast(attr); } if (!attr) PyErr_Clear(); //Clear possible error caused by PyObject_GenericGetAttr return 0; } bool isReadable(const PySideProperty* self) { return true; } bool isWritable(const PySideProperty* self) { return (self->d->fset != 0); } bool hasReset(const PySideProperty* self) { return (self->d->freset != 0); } bool isDesignable(const PySideProperty* self) { return self->d->designable; } bool isScriptable(const PySideProperty* self) { return self->d->scriptable; } bool isStored(const PySideProperty* self) { return self->d->stored; } bool isUser(const PySideProperty* self) { return self->d->user; } bool isConstant(const PySideProperty* self) { return self->d->constant; } bool isFinal(const PySideProperty* self) { return self->d->final; } const char* getNotifyName(PySideProperty* self) { if (!self->d->notifySignature) { PyObject* str = PyObject_Str(self->d->notify); self->d->notifySignature = strdup(Shiboken::String::toCString(str)); Py_DECREF(str); } return self->d->notifySignature; } void setMetaCallHandler(PySideProperty* self, MetaCallHandler handler) { self->d->metaCallHandler = handler; } void setTypeName(PySideProperty* self, const char* typeName) { self->d->typeName = strdup(typeName); } void setUserData(PySideProperty* self, void* data) { self->d->userData = data; } void* userData(PySideProperty* self) { return self->d->userData; } } //namespace Property } //namespace PySide ================================================ FILE: libpyside/pysideproperty.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_PROPERTY_H #define PYSIDE_PROPERTY_H #include #include #include extern "C" { extern PYSIDE_API PyTypeObject PySidePropertyType; struct PySidePropertyPrivate; struct PYSIDE_API PySideProperty { PyObject_HEAD PySidePropertyPrivate* d; }; }; namespace PySide { namespace Property { typedef void (*MetaCallHandler)(PySideProperty*,PyObject*,QMetaObject::Call, void**); PYSIDE_API bool checkType(PyObject* pyObj); /// @deprecated Use checkType PYSIDE_DEPRECATED(PYSIDE_API bool isPropertyType(PyObject* pyObj)); /** * This function call set property function and pass value as arg * This function does not check the property object type * * @param self The property object * @param source The QObject witch has the property * @param value The value to set in property * @return Return 0 if ok or -1 if this function fail **/ PYSIDE_API int setValue(PySideProperty* self, PyObject* source, PyObject* value); /** * This function call get property function * This function does not check the property object type * * @param self The property object * @param source The QObject witch has the property * @return Return the result of property get function or 0 if this fail **/ PYSIDE_API PyObject* getValue(PySideProperty* self, PyObject* source); /** * This function return the notify name used on this property * * @param self The property object * @return Return a const char with the notify name used **/ PYSIDE_API const char* getNotifyName(PySideProperty* self); /** * This function search in the source object for desired property * * @param source The QObject object * @param name The property name * @return Return a new reference to property object **/ PYSIDE_API PySideProperty* getObject(PyObject* source, PyObject* name); PYSIDE_API void setMetaCallHandler(PySideProperty* self, MetaCallHandler handler); PYSIDE_API void setTypeName(PySideProperty* self, const char* typeName); PYSIDE_API void setUserData(PySideProperty* self, void* data); PYSIDE_API void* userData(PySideProperty* self); } //namespace Property } //namespace PySide #endif ================================================ FILE: libpyside/pysideproperty_p.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_QPROPERTY_P_H #define PYSIDE_QPROPERTY_P_H #include #include #include "pysideproperty.h" struct PySideProperty; extern "C" { struct PySidePropertyPrivate { char* typeName; PySide::Property::MetaCallHandler metaCallHandler; PyObject* fget; PyObject* fset; PyObject* freset; PyObject* fdel; PyObject* notify; char* notifySignature; char* doc; bool designable; bool scriptable; bool stored; bool user; bool constant; bool final; void* userData; }; } // extern "C" namespace PySide { namespace Property { /** * Init PySide QProperty support system */ void init(PyObject* module); /** * This function call reset property function * This function does not check the property object type * * @param self The property object * @param source The QObject witch has the property * @return Return 0 if ok or -1 if this function fail **/ int reset(PySideProperty* self, PyObject* source); /** * This function return the property type * This function does not check the property object type * * @param self The property object * @return Return the property type name **/ const char* getTypeName(const PySideProperty* self); /** * This function check if property has read function * This function does not check the property object type * * @param self The property object * @return Return a boolean value **/ bool isReadable(const PySideProperty* self); /** * This function check if property has write function * This function does not check the property object type * * @param self The property object * @return Return a boolean value **/ bool isWritable(const PySideProperty* self); /** * This function check if property has reset function * This function does not check the property object type * * @param self The property object * @return Return a boolean value **/ bool hasReset(const PySideProperty* self); /** * This function check if property has the flag DESIGNABLE setted * This function does not check the property object type * * @param self The property object * @return Return a boolean value **/ bool isDesignable(const PySideProperty* self); /** * This function check if property has the flag SCRIPTABLE setted * This function does not check the property object type * * @param self The property object * @return Return a boolean value **/ bool isScriptable(const PySideProperty* self); /** * This function check if property has the flag STORED setted * This function does not check the property object type * * @param self The property object * @return Return a boolean value **/ bool isStored(const PySideProperty* self); /** * This function check if property has the flag USER setted * This function does not check the property object type * * @param self The property object * @return Return a boolean value **/ bool isUser(const PySideProperty* self); /** * This function check if property has the flag CONSTANT setted * This function does not check the property object type * * @param self The property object * @return Return a boolean value **/ bool isConstant(const PySideProperty* self); /** * This function check if property has the flag FINAL setted * This function does not check the property object type * * @param self The property object * @return Return a boolean value **/ bool isFinal(const PySideProperty* self); } // namespace Property } // namespace PySide #endif ================================================ FILE: libpyside/pysideqflags.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "pysideqflags.h" #include #include extern "C" { struct SbkConverter; /** * Type of all QFlags */ struct PySideQFlagsType { PyHeapTypeObject super; SbkConverter** converterPtr; SbkConverter* converter; }; #define PYSIDE_QFLAGS(X) reinterpret_cast(X) PyObject* PySideQFlagsNew(PyTypeObject* type, PyObject* args, PyObject* kwds) { long val = 0; if (PyTuple_GET_SIZE(args)) { PyObject* arg = PyTuple_GET_ITEM(args, 0); if (Shiboken::isShibokenEnum(arg)) {// faster call val = Shiboken::Enum::getValue(arg); } else if (PyNumber_Check(arg)) { Shiboken::AutoDecRef number(PyNumber_Long(arg)); val = PyLong_AsLong(number); } else { PyErr_SetString(PyExc_TypeError,"QFlags must be created using enums or numbers."); return 0; } } PySideQFlagsObject* self = PyObject_New(PySideQFlagsObject, type); self->ob_value = val; return reinterpret_cast(self); } static long getNumberValue(PyObject* v) { Shiboken::AutoDecRef number(PyNumber_Long(v)); return PyLong_AsLong(number); } PyObject* PySideQFlagsRichCompare(PyObject* self, PyObject* other, int op) { int result = 0; if (!PyNumber_Check(other)) { PyErr_BadArgument(); return NULL; } long valA = PYSIDE_QFLAGS(self)->ob_value; long valB = getNumberValue(other); if (self == other) { result = 1; } else { switch (op) { case Py_EQ: result = (valA == valB); break; case Py_NE: result = (valA != valB); break; case Py_LE: result = (valA <= valB); break; case Py_GE: result = (valA >= valB); break; case Py_LT: result = (valA < valB); break; case Py_GT: result = (valA > valB); break; default: PyErr_BadArgument(); return NULL; } } if (result) Py_RETURN_TRUE; else Py_RETURN_FALSE; } } namespace PySide { namespace QFlags { PyTypeObject* create(const char* name, PyNumberMethods* numberMethods) { PyTypeObject* type = reinterpret_cast(new PySideQFlagsType); ::memset(type, 0, sizeof(PySideQFlagsType)); Py_TYPE(type) = &PyType_Type; type->tp_basicsize = sizeof(PySideQFlagsObject); type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES; type->tp_name = name; type->tp_new = &PySideQFlagsNew; type->tp_as_number = numberMethods; type->tp_richcompare = &PySideQFlagsRichCompare; PySideQFlagsType* flagsType = reinterpret_cast(type); flagsType->converterPtr = &flagsType->converter; if (PyType_Ready(type) < 0) return 0; return type; } PySideQFlagsObject* newObject(long value, PyTypeObject* type) { PySideQFlagsObject* qflags = PyObject_New(PySideQFlagsObject, type); qflags->ob_value = value; return qflags; } long getValue(PySideQFlagsObject* self) { return self->ob_value; } } } ================================================ FILE: libpyside/pysideqflags.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_QFLAGS_H #define PYSIDE_QFLAGS_H #include #include "pysidemacros.h" extern "C" { struct PYSIDE_API PySideQFlagsObject { PyObject_HEAD long ob_value; }; PYSIDE_API PyObject* PySideQFlagsNew(PyTypeObject *type, PyObject *args, PyObject *kwds); PYSIDE_API PyObject* PySideQFlagsRichCompare(PyObject *self, PyObject *other, int op); } namespace PySide { namespace QFlags { /** * Creates a new QFlags type. */ PYSIDE_API PyTypeObject* create(const char* name, PyNumberMethods* numberMethods); /** * Creates a new QFlags instance of type \p type and value \p value. */ PYSIDE_API PySideQFlagsObject* newObject(long value, PyTypeObject* type); /** * Returns the value held by a QFlag. */ PYSIDE_API long getValue(PySideQFlagsObject* self); } } #endif ================================================ FILE: libpyside/pysidesignal.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "pysidesignal.h" #include "pysidesignal_p.h" #include "signalmanager.h" #include #include #define SIGNAL_CLASS_NAME "Signal" #define SIGNAL_INSTANCE_NAME "SignalInstance" #define QT_SIGNAL_SENTINEL '2' namespace PySide { namespace Signal { //aux static char* buildSignature(const char*, const char*); static void appendSignature(PySideSignal*, char*); static void instanceInitialize(PySideSignalInstance*, PyObject*, PySideSignal*, PyObject*, int); static char* parseSignature(PyObject*); static PyObject* buildQtCompatible(const char*); } } extern "C" { // Signal methods static int signalTpInit(PyObject*, PyObject*, PyObject*); static void signalFree(void*); static void signalInstanceFree(void*); static PyObject* signalGetItem(PyObject* self, PyObject* key); static PyObject* signalToString(PyObject* self); // Signal Instance methods static PyObject* signalInstanceConnect(PyObject*, PyObject*, PyObject*); static PyObject* signalInstanceDisconnect(PyObject*, PyObject*); static PyObject* signalInstanceEmit(PyObject*, PyObject*); static PyObject* signalInstanceGetItem(PyObject*, PyObject*); static PyObject* signalInstanceCall(PyObject* self, PyObject* args, PyObject* kw); static PyObject* signalCall(PyObject*, PyObject*, PyObject*); static PyObject* metaSignalCheck(PyObject*, PyObject*); static PyMappingMethods Signal_as_mapping = { 0, signalGetItem, 0 }; static PyMethodDef Signal_methods[] = { {"__instancecheck__", (PyCFunction)metaSignalCheck, METH_O, NULL}, {0} }; PyTypeObject PySideSignalMetaType = { PyVarObject_HEAD_INIT(0, 0) /*tp_name*/ "PySide.QtCore.MetaSignal", /*tp_basicsize*/ sizeof(PyTypeObject), /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ 0, /*tp_flags*/ Py_TPFLAGS_DEFAULT, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ Signal_methods, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ &PyType_Type, }; PyTypeObject PySideSignalType = { PyVarObject_HEAD_INIT(&PySideSignalMetaType, 0) /*tp_name*/ "PySide.QtCore." SIGNAL_CLASS_NAME, /*tp_basicsize*/ sizeof(PySideSignal), /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ &Signal_as_mapping, /*tp_hash*/ 0, /*tp_call*/ signalCall, /*tp_str*/ signalToString, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ 0, /*tp_flags*/ Py_TPFLAGS_DEFAULT, /*tp_doc*/ SIGNAL_CLASS_NAME, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ signalTpInit, /*tp_alloc*/ 0, /*tp_new*/ PyType_GenericNew, /*tp_free*/ signalFree, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, }; static PyMethodDef SignalInstance_methods[] = { {"connect", (PyCFunction)signalInstanceConnect, METH_VARARGS|METH_KEYWORDS, 0}, {"disconnect", signalInstanceDisconnect, METH_VARARGS, 0}, {"emit", signalInstanceEmit, METH_VARARGS, 0}, {0} /* Sentinel */ }; static PyMappingMethods SignalInstance_as_mapping = { 0, signalInstanceGetItem, 0 }; PyTypeObject PySideSignalInstanceType = { PyVarObject_HEAD_INIT(0, 0) /*tp_name*/ "PySide.QtCore." SIGNAL_INSTANCE_NAME, /*tp_basicsize*/ sizeof(PySideSignalInstance), /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ &SignalInstance_as_mapping, /*tp_hash*/ 0, /*tp_call*/ signalInstanceCall, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ 0, /*tp_flags*/ Py_TPFLAGS_DEFAULT, /*tp_doc*/ SIGNAL_INSTANCE_NAME, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ SignalInstance_methods, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ 0, /*tp_new*/ PyType_GenericNew, /*tp_free*/ signalInstanceFree, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, }; int signalTpInit(PyObject* self, PyObject* args, PyObject* kwds) { static PyObject* emptyTuple = 0; static const char* kwlist[] = {"name", 0}; char* argName = 0; if (emptyTuple == 0) emptyTuple = PyTuple_New(0); if (!PyArg_ParseTupleAndKeywords(emptyTuple, kwds, "|s:QtCore." SIGNAL_CLASS_NAME, const_cast(kwlist), &argName)) return 0; bool tupledArgs = false; PySideSignal* data = reinterpret_cast(self); if (argName) { data->signalName = strdup(argName); } for (Py_ssize_t i = 0, i_max = PyTuple_Size(args); i < i_max; i++) { PyObject* arg = PyTuple_GET_ITEM(args, i); if (PySequence_Check(arg) && !Shiboken::String::check(arg)) { tupledArgs = true; PySide::Signal::appendSignature(data, PySide::Signal::parseSignature(arg)); } } if (!tupledArgs) PySide::Signal::appendSignature(data, PySide::Signal::parseSignature(args)); return 1; } void signalFree(void* self) { PyObject* pySelf = reinterpret_cast(self); PySideSignal* data = reinterpret_cast(self); for (int i = 0, i_max = data->signaturesSize; i < i_max; i++) { if (data->signatures[i]) free(data->signatures[i]); } free(data->signatures); free(data->signalName); data->initialized = 0; data->signaturesSize = 0; Py_XDECREF(data->homonymousMethod); data->homonymousMethod = 0; pySelf->ob_type->tp_base->tp_free(self); } PyObject* signalGetItem(PyObject* self, PyObject* key) { PySideSignal* data = reinterpret_cast(self); char* sigKey; if (key) { sigKey = PySide::Signal::parseSignature(key); } else { if (data->signatures[0]) sigKey = strdup(data->signatures[0]); else sigKey = strdup("void"); } char* sig = PySide::Signal::buildSignature(data->signalName, sigKey); free(sigKey); PyObject* pySignature = Shiboken::String::fromCString(sig); free(sig); return pySignature; } PyObject* signalToString(PyObject* self) { return signalGetItem(self, 0); } void signalInstanceFree(void* self) { PyObject* pySelf = reinterpret_cast(self); PySideSignalInstance* data = reinterpret_cast(self); PySideSignalInstancePrivate* dataPvt = data->d; free(dataPvt->signalName); free(dataPvt->signature); Py_XDECREF(dataPvt->homonymousMethod); if (dataPvt->next) { Py_DECREF(dataPvt->next); dataPvt->next = 0; } delete dataPvt; data->d = 0; pySelf->ob_type->tp_base->tp_free(self); } PyObject* signalInstanceConnect(PyObject* self, PyObject* args, PyObject* kwds) { PyObject* slot = 0; PyObject* type = 0; static const char* kwlist[] = {"slot", "type", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:" SIGNAL_INSTANCE_NAME, const_cast(kwlist), &slot, &type)) return 0; PySideSignalInstance* source = reinterpret_cast(self); Shiboken::AutoDecRef pyArgs(PyList_New(0)); bool match = false; if (slot->ob_type == &PySideSignalInstanceType) { PySideSignalInstance* sourceWalk = source; PySideSignalInstance* targetWalk; //find best match while (sourceWalk && !match) { targetWalk = reinterpret_cast(slot); while (targetWalk && !match) { if (QMetaObject::checkConnectArgs(sourceWalk->d->signature, targetWalk->d->signature)) { PyList_Append(pyArgs, sourceWalk->d->source); Shiboken::AutoDecRef sourceSignature(PySide::Signal::buildQtCompatible(sourceWalk->d->signature)); PyList_Append(pyArgs, sourceSignature); PyList_Append(pyArgs, targetWalk->d->source); Shiboken::AutoDecRef targetSignature(PySide::Signal::buildQtCompatible(targetWalk->d->signature)); PyList_Append(pyArgs, targetSignature); match = true; } targetWalk = reinterpret_cast(targetWalk->d->next); } sourceWalk = reinterpret_cast(sourceWalk->d->next); } } else { //try the first signature PyList_Append(pyArgs, source->d->source); Shiboken::AutoDecRef signature(PySide::Signal::buildQtCompatible(source->d->signature)); PyList_Append(pyArgs, signature); PyList_Append(pyArgs, slot); match = true; } if (type) PyList_Append(pyArgs, type); if (match) { Shiboken::AutoDecRef tupleArgs(PyList_AsTuple(pyArgs)); Shiboken::AutoDecRef pyMethod(PyObject_GetAttrString(source->d->source, "connect")); PyObject* result = PyObject_CallObject(pyMethod, tupleArgs); if (result == Py_True) return result; else Py_XDECREF(result); } if (!PyErr_Occurred()) PyErr_Format(PyExc_RuntimeError, "Failed to connect signal %s.", source->d->signature); return 0; } PyObject* signalInstanceEmit(PyObject* self, PyObject* args) { PySideSignalInstance* source = reinterpret_cast(self); Shiboken::AutoDecRef pyArgs(PyList_New(0)); Shiboken::AutoDecRef sourceSignature(PySide::Signal::buildQtCompatible(source->d->signature)); PyList_Append(pyArgs, sourceSignature); for (Py_ssize_t i = 0, max = PyTuple_Size(args); i < max; i++) PyList_Append(pyArgs, PyTuple_GetItem(args, i)); Shiboken::AutoDecRef pyMethod(PyObject_GetAttrString(source->d->source, "emit")); Shiboken::AutoDecRef tupleArgs(PyList_AsTuple(pyArgs)); return PyObject_CallObject(pyMethod, tupleArgs); } PyObject* signalInstanceGetItem(PyObject* self, PyObject* key) { PySideSignalInstance* data = reinterpret_cast(self); char* sigKey = PySide::Signal::parseSignature(key); char* sig = PySide::Signal::buildSignature(data->d->signalName, sigKey); free(sigKey); const char* sigName = data->d->signalName; while (data) { if (strcmp(data->d->signature, sig) == 0) { free(sig); PyObject* result = reinterpret_cast(data); Py_INCREF(result); return result; } data = reinterpret_cast(data->d->next); } PyErr_Format(PyExc_IndexError, "Signature %s not found for signal: %s", sig, sigName); free(sig); return 0; } PyObject* signalInstanceDisconnect(PyObject* self, PyObject* args) { PySideSignalInstance* source = reinterpret_cast(self); Shiboken::AutoDecRef pyArgs(PyList_New(0)); PyObject* slot; if (PyTuple_Check(args) && PyTuple_GET_SIZE(args)) slot = PyTuple_GET_ITEM(args, 0); else slot = Py_None; bool match = false; if (slot->ob_type == &PySideSignalInstanceType) { PySideSignalInstance* target = reinterpret_cast(slot); if (QMetaObject::checkConnectArgs(source->d->signature, target->d->signature)) { PyList_Append(pyArgs, source->d->source); Shiboken::AutoDecRef source_signature(PySide::Signal::buildQtCompatible(source->d->signature)); PyList_Append(pyArgs, source_signature); PyList_Append(pyArgs, target->d->source); Shiboken::AutoDecRef target_signature(PySide::Signal::buildQtCompatible(target->d->signature)); PyList_Append(pyArgs, target_signature); match = true; } } else { //try the first signature PyList_Append(pyArgs, source->d->source); Shiboken::AutoDecRef signature(PySide::Signal::buildQtCompatible(source->d->signature)); PyList_Append(pyArgs, signature); // disconnect all, so we need to use the c++ signature disconnect(qobj, signal, 0, 0) if (slot == Py_None) PyList_Append(pyArgs, slot); PyList_Append(pyArgs, slot); match = true; } if (match) { Shiboken::AutoDecRef tupleArgs(PyList_AsTuple(pyArgs)); Shiboken::AutoDecRef pyMethod(PyObject_GetAttrString(source->d->source, "disconnect")); PyObject* result = PyObject_CallObject(pyMethod, tupleArgs); if (result == Py_True) return result; else Py_DECREF(result); } PyErr_Format(PyExc_RuntimeError, "Failed to disconnect signal %s.", source->d->signature); return 0; } PyObject* signalCall(PyObject* self, PyObject* args, PyObject* kw) { PySideSignal* signal = reinterpret_cast(self); if (!signal->homonymousMethod) { PyErr_SetString(PyExc_TypeError, "native Qt signal is not callable"); return 0; } descrgetfunc getDescriptor = signal->homonymousMethod->ob_type->tp_descr_get; Shiboken::AutoDecRef homonymousMethod(getDescriptor(signal->homonymousMethod, 0, 0)); if (PyCFunction_GET_FLAGS(homonymousMethod.object()) & METH_STATIC) return PyCFunction_Call(homonymousMethod, args, kw); ternaryfunc callFunc = signal->homonymousMethod->ob_type->tp_call; return callFunc(homonymousMethod, args, kw); } PyObject* signalInstanceCall(PyObject* self, PyObject* args, PyObject* kw) { PySideSignalInstance* PySideSignal = reinterpret_cast(self); if (!PySideSignal->d->homonymousMethod) { PyErr_SetString(PyExc_TypeError, "native Qt signal is not callable"); return 0; } descrgetfunc getDescriptor = PySideSignal->d->homonymousMethod->ob_type->tp_descr_get; Shiboken::AutoDecRef homonymousMethod(getDescriptor(PySideSignal->d->homonymousMethod, PySideSignal->d->source, 0)); return PyCFunction_Call(homonymousMethod, args, kw); } static PyObject* metaSignalCheck(PyObject* klass, PyObject* args) { if (PyType_IsSubtype(args->ob_type, &PySideSignalInstanceType)) Py_RETURN_TRUE; else Py_RETURN_FALSE; } } // extern "C" namespace PySide { namespace Signal { void init(PyObject* module) { if (PyType_Ready(&PySideSignalMetaType) < 0) return; if (PyType_Ready(&PySideSignalType) < 0) return; Py_INCREF(&PySideSignalType); PyModule_AddObject(module, SIGNAL_CLASS_NAME, ((PyObject*)&PySideSignalType)); if (PyType_Ready(&PySideSignalInstanceType) < 0) return; Py_INCREF(&PySideSignalInstanceType); } bool checkType(PyObject* pyObj) { if (pyObj) return PyType_IsSubtype(pyObj->ob_type, &PySideSignalType); return false; } void updateSourceObject(PyObject* source) { PyTypeObject* objType = reinterpret_cast(PyObject_Type(source)); Py_ssize_t pos = 0; PyObject* value; PyObject* key; while (PyDict_Next(objType->tp_dict, &pos, &key, &value)) { if (PyObject_TypeCheck(value, &PySideSignalType)) { Shiboken::AutoDecRef signalInstance((PyObject*)PyObject_New(PySideSignalInstance, &PySideSignalInstanceType)); instanceInitialize(signalInstance.cast(), key, reinterpret_cast(value), source, 0); PyObject_SetAttr(source, key, signalInstance); } } Py_XDECREF(objType); } char* getTypeName(PyObject* type) { if (PyType_Check(type)) { char* typeName = NULL; if (PyType_IsSubtype(reinterpret_cast(type), reinterpret_cast(&SbkObject_Type))) { SbkObjectType* objType = reinterpret_cast(type); typeName = strdup(Shiboken::ObjectType::getOriginalName(objType)); } else { // Translate python types to Qt names PyTypeObject* objType = reinterpret_cast(type); if (Shiboken::String::checkType(objType)) typeName = strdup("QString"); else if (objType == &PyInt_Type) typeName = strdup("int"); else if (objType == &PyLong_Type) typeName = strdup("long"); else if (objType == &PyFloat_Type) typeName = strdup("double"); else if (objType == &PyBool_Type) typeName = strdup("bool"); else if (Py_TYPE(objType) == &SbkEnumType_Type) typeName = strdup(Shiboken::Enum::getCppName(objType)); else typeName = strdup("PyObject"); } return typeName; } else if (type == Py_None) { // Must be checked before as Shiboken::String::check accepts Py_None return strdup("void"); } else if (Shiboken::String::check(type)) { return strdup(Shiboken::String::toCString(type)); } return 0; } char* buildSignature(const char* name, const char* signature) { QByteArray signal(name); signal += '('; signal += signature; signal += ')'; return strdup(QMetaObject::normalizedSignature(signal)); } char* parseSignature(PyObject* args) { char* signature = 0; if (args && (Shiboken::String::check(args) || !PySequence_Check(args))) return getTypeName(args); for (Py_ssize_t i = 0, i_max = PySequence_Size(args); i < i_max; i++) { Shiboken::AutoDecRef arg(PySequence_ITEM(args, i)); char* typeName = getTypeName(arg); if (typeName) { if (signature) { signature = reinterpret_cast(realloc(signature, (strlen(signature) + 1 + strlen(typeName)) * sizeof(char*))); signature = strcat(signature, ","); signature = strcat(signature, typeName); free(typeName); } else { signature = typeName; } } } return signature; } void appendSignature(PySideSignal* self, char* signature) { self->signaturesSize++; if (self->signaturesSize > 1) { self->signatures = reinterpret_cast(realloc(self->signatures, sizeof(char**) * self->signaturesSize)); } else { self->signatures = reinterpret_cast(malloc(sizeof(char**))); } self->signatures[self->signaturesSize - 1] = signature; } PySideSignalInstance* initialize(PySideSignal* self, PyObject* name, PyObject* object) { PySideSignalInstance* instance = PyObject_New(PySideSignalInstance, &PySideSignalInstanceType); instanceInitialize(instance, name, self, object, 0); return instance; } void instanceInitialize(PySideSignalInstance* self, PyObject* name, PySideSignal* data, PyObject* source, int index) { self->d = new PySideSignalInstancePrivate; PySideSignalInstancePrivate* selfPvt = self->d; selfPvt->next = 0; if (data->signalName) selfPvt->signalName = strdup(data->signalName); else { selfPvt->signalName = strdup(Shiboken::String::toCString(name)); data->signalName = strdup(selfPvt->signalName); } selfPvt->source = source; selfPvt->signature = buildSignature(self->d->signalName, data->signatures[index]); selfPvt->homonymousMethod = 0; if (data->homonymousMethod) { selfPvt->homonymousMethod = data->homonymousMethod; Py_INCREF(selfPvt->homonymousMethod); } index++; if (index < data->signaturesSize) { selfPvt->next = PyObject_New(PySideSignalInstance, &PySideSignalInstanceType); instanceInitialize(selfPvt->next, name, data, source, index); } } bool connect(PyObject* source, const char* signal, PyObject* callback) { Shiboken::AutoDecRef pyMethod(PyObject_GetAttrString(source, "connect")); if (pyMethod.isNull()) return false; Shiboken::AutoDecRef pySignature(Shiboken::String::fromCString(signal)); Shiboken::AutoDecRef pyArgs(PyTuple_Pack(3, source, pySignature.object(), callback)); PyObject* result = PyObject_CallObject(pyMethod, pyArgs); if (result == Py_False) { PyErr_Format(PyExc_RuntimeError, "Failed to connect signal %s, to python callable object.", signal); Py_DECREF(result); result = 0; } return result; } PySideSignalInstance* newObjectFromMethod(PyObject* source, const QList& methodList) { PySideSignalInstance* root = 0; PySideSignalInstance* previous = 0; foreach(QMetaMethod m, methodList) { PySideSignalInstance* item = PyObject_New(PySideSignalInstance, &PySideSignalInstanceType); if (!root) root = item; if (previous) previous->d->next = item; item->d = new PySideSignalInstancePrivate; PySideSignalInstancePrivate* selfPvt = item->d; selfPvt->source = source; QByteArray cppName(m.signature()); cppName = cppName.mid(0, cppName.indexOf('(')); // separe SignalName selfPvt->signalName = strdup(cppName.data()); selfPvt->signature = strdup(m.signature()); selfPvt->homonymousMethod = 0; selfPvt->next = 0; } return root; } PySideSignal* newObject(const char* name, ...) { va_list listSignatures; char* sig = 0; PySideSignal* self = PyObject_New(PySideSignal, &PySideSignalType); self->signalName = strdup(name); self->signaturesSize = 0; self->signatures = 0; self->initialized = 0; self->homonymousMethod = 0; va_start(listSignatures, name); sig = va_arg(listSignatures, char*); while (sig != NULL) { if (strcmp(sig, "void") == 0) appendSignature(self, strdup("")); else appendSignature(self, strdup(sig)); sig = va_arg(listSignatures, char*); } va_end(listSignatures); return self; } template static typename T::value_type join(T t, const char* sep) { typename T::value_type res; if (!t.size()) return res; typename T::const_iterator it = t.begin(); typename T::const_iterator end = t.end(); res += *it; ++it; while (it != end) { res += sep; res += *it; ++it; } return res; } static void _addSignalToWrapper(SbkObjectType* wrapperType, const char* signalName, PySideSignal* signal) { PyObject* typeDict = wrapperType->super.ht_type.tp_dict; PyObject* homonymousMethod; if ((homonymousMethod = PyDict_GetItemString(typeDict, signalName))) { Py_INCREF(homonymousMethod); signal->homonymousMethod = homonymousMethod; } PyDict_SetItemString(typeDict, signalName, reinterpret_cast(signal)); } // This function is used by qStableSort to promote empty signatures static bool compareSignals(const QByteArray& sig1, const QByteArray& sig2) { return sig1.isEmpty(); } void registerSignals(SbkObjectType* pyObj, const QMetaObject* metaObject) { typedef QHash > SignalSigMap; SignalSigMap signalsFound; for (int i = metaObject->methodOffset(), max = metaObject->methodCount(); i < max; ++i) { QMetaMethod method = metaObject->method(i); if (method.methodType() == QMetaMethod::Signal) { QByteArray methodName(method.signature()); methodName.chop(methodName.size() - methodName.indexOf('(')); signalsFound[methodName] << join(method.parameterTypes(), ","); } } SignalSigMap::Iterator it = signalsFound.begin(); SignalSigMap::Iterator end = signalsFound.end(); for (; it != end; ++it) { PySideSignal* self = PyObject_New(PySideSignal, &PySideSignalType); self->signalName = strdup(it.key().constData()); self->signaturesSize = 0; self->signatures = 0; self->initialized = 0; self->homonymousMethod = 0; // Empty signatures comes first! So they will be the default signal signature qStableSort(it.value().begin(), it.value().end(), &compareSignals); SignalSigMap::mapped_type::const_iterator j = it.value().begin(); SignalSigMap::mapped_type::const_iterator endJ = it.value().end(); for (; j != endJ; ++j) appendSignature(self, strdup(j->constData())); _addSignalToWrapper(pyObj, it.key(), self); Py_DECREF((PyObject*) self); } } PyObject* buildQtCompatible(const char* signature) { QByteArray ba; ba.append(QT_SIGNAL_SENTINEL); ba.append(signature); return Shiboken::String::fromStringAndSize(ba, ba.size()); } void addSignalToWrapper(SbkObjectType* wrapperType, const char* signalName, PySideSignal* signal) { _addSignalToWrapper(wrapperType, signalName, signal); } PyObject* getObject(PySideSignalInstance* signal) { return signal->d->source; } const char* getSignature(PySideSignalInstance* signal) { return signal->d->signature; } const char** getSignatures(PyObject* signal, int* size) { PySideSignal* self = reinterpret_cast(signal); *size = self->signaturesSize; return const_cast(self->signatures); } QStringList getArgsFromSignature(const char* signature, bool* isShortCircuit) { QString qsignature(signature); QStringList result; QRegExp splitRegex("\\s*,\\s*"); if (isShortCircuit) *isShortCircuit = !qsignature.contains('('); if (qsignature.contains("()") || qsignature.contains("(void)")) { return result; } else if (qsignature.contains('(')) { static QRegExp regex(".+\\((.*)\\)"); //get args types QString types = qsignature.replace(regex, "\\1"); result = types.split(splitRegex); } return result; } QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* callback, bool encodeName) { QByteArray functionName; QByteArray signature; QStringList args; int numArgs = -1; bool useSelf = false; bool isMethod = PyMethod_Check(callback); bool isFunction = PyFunction_Check(callback); if (isMethod || isFunction) { PyObject* function = isMethod ? PyMethod_GET_FUNCTION(callback) : callback; PyCodeObject* objCode = reinterpret_cast(PyFunction_GET_CODE(function)); functionName = Shiboken::String::toCString(reinterpret_cast(function)->func_name); useSelf = isMethod; numArgs = objCode->co_flags & CO_VARARGS ? -1 : objCode->co_argcount; } else if (PyCFunction_Check(callback)) { functionName = ((PyCFunctionObject*)callback)->m_ml->ml_name; useSelf = ((PyCFunctionObject*)callback)->m_self; int flags = ((PyCFunctionObject*)callback)->m_ml->ml_flags; if (receiver) { //Search for signature on metaobject const QMetaObject* mo = receiver->metaObject(); QByteArray prefix(functionName); prefix += '('; for (int i = 0; i < mo->methodCount(); i++) { QMetaMethod me = mo->method(i); if ((strncmp(me.signature(), prefix, prefix.size()) == 0) && QMetaObject::checkConnectArgs(signal, me.signature())) { numArgs = me.parameterTypes().size() + useSelf; break; } } } if (numArgs == -1) { if (flags & METH_VARARGS) numArgs = -1; else if (flags & METH_NOARGS) numArgs = 0; } } else if (PyCallable_Check(callback)) { functionName = "__callback" + QByteArray::number((qlonglong)callback); } Q_ASSERT(!functionName.isEmpty()); bool isShortCircuit = false; if (encodeName) signature = qPrintable(codeCallbackName(callback, functionName)); else signature = functionName; args = getArgsFromSignature(signal, &isShortCircuit); if (!isShortCircuit) { signature.append('('); if (numArgs == -1) numArgs = std::numeric_limits::max(); while (args.count() && (args.count() > (numArgs - useSelf))) { args.removeLast(); } signature.append(args.join(",")); signature.append(')'); } return signature; } bool isQtSignal(const char* signal) { return (signal && signal[0] == QT_SIGNAL_SENTINEL); } bool checkQtSignal(const char* signal) { if (!isQtSignal(signal)) { PyErr_SetString(PyExc_TypeError, "Use the function PySide.QtCore.SIGNAL on signals"); return false; } return true; } QString codeCallbackName(PyObject* callback, const QString& funcName) { if (PyMethod_Check(callback)) { PyObject* self = PyMethod_GET_SELF(callback); PyObject* func = PyMethod_GET_FUNCTION(callback); return funcName + QString::number(quint64(self), 16) + QString::number(quint64(func), 16); } else { return funcName + QString::number(quint64(callback), 16); } } } //namespace Signal } //namespace PySide ================================================ FILE: libpyside/pysidesignal.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_SIGNAL_H #define PYSIDE_SIGNAL_H #include #include #include #include #include #include extern "C" { extern PYSIDE_API PyTypeObject PySideSignalType; extern PYSIDE_API PyTypeObject PySideSignalInstanceType; // Internal object struct PYSIDE_API PySideSignal; struct PySideSignalInstancePrivate; struct PYSIDE_API PySideSignalInstance { PyObject_HEAD PySideSignalInstancePrivate* d; }; }; // extern "C" namespace PySide { namespace Signal { PYSIDE_API bool checkType(PyObject* type); /** * This function creates a Signal object which stays attached to QObject class * * @param name of the Signal to be registered on meta object * @param signatures a list of signatures supported by this signal, ended with a NULL pointer * @return Return a new reference to PyObject* of type PySideSignal * @deprecated Use registerSignals **/ PYSIDE_DEPRECATED(PYSIDE_API PySideSignal* newObject(const char* name, ...)); /** * Register all C++ signals of a QObject on Python type. */ PYSIDE_API void registerSignals(SbkObjectType* pyObj, const QMetaObject* metaObject); /** * This function creates a Signal object which stays attached to QObject class based on a list of QMetaMethods * * @param source of the Signal to be registered on meta object * @param methods a list of QMetaMethod wich contains the supported signature * @return Return a new reference to PyObject* of type PySideSignal **/ PYSIDE_API PySideSignalInstance* newObjectFromMethod(PyObject* source, const QList& methods); /** * This function initializes the Signal object by creating a PySideSignalInstance * * @param self a Signal object used as base to PySideSignalInstance * @param name the name to be used on PySideSignalInstance * @param object the PyObject where the signal will be attached * @return Return a new reference to PySideSignalInstance **/ PYSIDE_API PySideSignalInstance* initialize(PySideSignal* signal, PyObject* name, PyObject* object); /** * This function is used to retrieve the object in which the signal is attached * * @param self The Signal object * @return Return the internal reference to the parent object of the signal **/ PYSIDE_API PyObject* getObject(PySideSignalInstance* signal); /** * This function is used to retrieve the signal signature * * @param self The Signal object * @return Return the signal signature **/ PYSIDE_API const char* getSignature(PySideSignalInstance* signal); /** * This function is used to retrieve the signal signature * * @param self The Signal object * @return Return the signal signature **/ PYSIDE_API void updateSourceObject(PyObject* source); /** * @deprecated Use registerSignals **/ PYSIDE_DEPRECATED(PYSIDE_API void addSignalToWrapper(SbkObjectType* wrapperType, const char* signalName, PySideSignal* signal)); /** * This function verifies if the signature is a QtSignal base on SIGNAL flag * @param signature The signal signature * @return Return true if this is a Qt Signal, otherwise return false **/ PYSIDE_API bool isQtSignal(const char* signature); /** * This function is similar to isQtSignal, however if it fails, it'll raise a Python error instead. * * @param signature The signal signature * @return Return true if this is a Qt Signal, otherwise return false **/ PYSIDE_API bool checkQtSignal(const char* signature); /** * This function is used to retrieve the signature base on Signal and receiver callback * @param signature The signal signature * @param receiver The QObject which will receive the signal * @param callback Callback function which will connect to the signal * @param encodeName Used to specify if the returned signature will be encoded with Qt signal/slot style * @return Return the callback signature **/ PYSIDE_API QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* callback, bool encodeName); /** * This function parses the signature and then returns a list of argument types. * * @param signature The signal signature * @param isShortCircuit If this is a shortCircuit(python<->python) signal * @return Return true if this is a Qt Signal, otherwise return false * @todo replace return type by QList **/ QStringList getArgsFromSignature(const char* signature, bool* isShortCircuit = 0); } // namespace Signal } // namespace PySide #endif ================================================ FILE: libpyside/pysidesignal_p.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_QSIGNAL_P_H #define PYSIDE_QSIGNAL_P_H #include extern "C" { extern PyTypeObject PySideSignalType; struct PySideSignal { PyObject_HEAD bool initialized; char* signalName; char** signatures; int signaturesSize; PyObject* homonymousMethod; }; struct PySideSignalInstance; struct PySideSignalInstancePrivate { char* signalName; char* signature; PyObject* source; PyObject* homonymousMethod; PySideSignalInstance* next; }; }; //extern "C" namespace PySide { namespace Signal { void init(PyObject* module); bool connect(PyObject* source, const char* signal, PyObject* callback); char* getTypeName(PyObject*); const char** getSignatures(PyObject* self, int *size); QString codeCallbackName(PyObject* callback, const QString& funcName); }} //namespace PySide #endif ================================================ FILE: libpyside/pysideslot.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "dynamicqmetaobject_p.h" #include "pysidesignal_p.h" #include "pysideslot_p.h" #include #include #include #define SLOT_DEC_NAME "Slot" typedef struct { PyObject_HEAD char* slotName; char* args; char* resultType; } PySideSlot; extern "C" { static int slotTpInit(PyObject*, PyObject*, PyObject*); static PyObject* slotCall(PyObject*, PyObject*, PyObject*); // Class Definition ----------------------------------------------- static PyTypeObject PySideSlotType = { PyVarObject_HEAD_INIT(0, 0) "PySide.QtCore." SLOT_DEC_NAME, /*tp_name*/ sizeof(PySideSlot), /*tp_basicsize*/ 0, /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ slotCall, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ SLOT_DEC_NAME, /*tp_doc */ 0, /*tp_traverse */ 0, /*tp_clear */ 0, /*tp_richcompare */ 0, /*tp_weaklistoffset */ 0, /*tp_iter */ 0, /*tp_iternext */ 0, /*tp_methods */ 0, /*tp_members */ 0, /*tp_getset */ 0, /*tp_base */ 0, /*tp_dict */ 0, /*tp_descr_get */ 0, /*tp_descr_set */ 0, /*tp_dictoffset */ slotTpInit, /*tp_init */ 0, /*tp_alloc */ PyType_GenericNew, /*tp_new */ 0, /*tp_free */ 0, /*tp_is_gc */ 0, /*tp_bases */ 0, /*tp_mro */ 0, /*tp_cache */ 0, /*tp_subclasses */ 0, /*tp_weaklist */ 0, /*tp_del */ }; int slotTpInit(PyObject *self, PyObject *args, PyObject *kw) { static PyObject *emptyTuple = 0; static const char *kwlist[] = {"name", "result", 0}; char* argName = 0; PyObject* argResult = 0; if (emptyTuple == 0) emptyTuple = PyTuple_New(0); if (!PyArg_ParseTupleAndKeywords(emptyTuple, kw, "|sO:QtCore." SLOT_DEC_NAME, (char**) kwlist, &argName, &argResult)) return 0; PySideSlot *data = reinterpret_cast(self); for(Py_ssize_t i = 0, i_max = PyTuple_Size(args); i < i_max; i++) { PyObject *argType = PyTuple_GET_ITEM(args, i); char *typeName = PySide::Signal::getTypeName(argType); if (typeName) { if (data->args) { data->args = reinterpret_cast(realloc(data->args, (strlen(data->args) + 1 + strlen(typeName)) * sizeof(char*))); data->args = strcat(data->args, ","); data->args = strcat(data->args, typeName); free(typeName); } else { data->args = typeName; } } else { PyErr_Format(PyExc_TypeError, "Unknown signal argument type: %s", argType->ob_type->tp_name); return -1; } } if (argName) data->slotName = strdup(argName); if (argResult) data->resultType = PySide::Signal::getTypeName(argResult); else data->resultType = strdup("void"); return 1; } PyObject* slotCall(PyObject* self, PyObject* args, PyObject* kw) { static PyObject* pySlotName = 0; PyObject* callback; callback = PyTuple_GetItem(args, 0); Py_INCREF(callback); if (PyFunction_Check(callback)) { PySideSlot *data = reinterpret_cast(self); if (!data->slotName) { PyObject *funcName = reinterpret_cast(callback)->func_name; data->slotName = strdup(Shiboken::String::toCString(funcName)); } QByteArray returnType = QMetaObject::normalizedType(data->resultType); QByteArray signature = QString().sprintf("%s(%s)", data->slotName, data->args).toAscii(); signature = returnType + " " + signature; if (!pySlotName) pySlotName = Shiboken::String::fromCString(PYSIDE_SLOT_LIST_ATTR); PyObject *pySignature = Shiboken::String::fromCString(signature); PyObject *signatureList = 0; if (PyObject_HasAttr(callback, pySlotName)) { signatureList = PyObject_GetAttr(callback, pySlotName); } else { signatureList = PyList_New(0); PyObject_SetAttr(callback, pySlotName, signatureList); Py_DECREF(signatureList); } PyList_Append(signatureList, pySignature); Py_DECREF(pySignature); //clear data free(data->slotName); data->slotName = 0; free(data->resultType); data->resultType = 0; free(data->args); data->args = 0; return callback; } return callback; } } // extern "C" namespace PySide { namespace Slot { void init(PyObject* module) { if (PyType_Ready(&PySideSlotType) < 0) return; Py_INCREF(&PySideSlotType); PyModule_AddObject(module, SLOT_DEC_NAME, ((PyObject*)&PySideSlotType)); } } // namespace Slot } // namespace PySide ================================================ FILE: libpyside/pysideslot_p.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PYSIDE_SLOT_P_H #define PYSIDE_SLOT_P_H #include #define PYSIDE_SLOT_LIST_ATTR "_slots" namespace PySide { namespace Slot { void init(PyObject* module); }} #endif ================================================ FILE: libpyside/pysideweakref.cpp ================================================ #include "pysideweakref.h" #include typedef struct { PyObject_HEAD /* Type-specific fields go here. */ PySideWeakRefFunction weakref_func; void* user_data; } PySideCallableObject; static PyObject* CallableObject_call(PyObject* callable_object, PyObject* args, PyObject* kw); static PyTypeObject PySideCallableObjectType = { PyVarObject_HEAD_INIT(0, 0) const_cast("PySide.Callable"), sizeof(PySideCallableObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ CallableObject_call, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ 0, /* tp_doc */ }; static PyObject* CallableObject_call(PyObject* callable_object, PyObject* args, PyObject* kw) { PySideCallableObject* obj = (PySideCallableObject*)(callable_object); obj->weakref_func(obj->user_data); Py_XDECREF(PyTuple_GET_ITEM(args, 0)); //kill weak ref object Py_RETURN_NONE; } namespace PySide { namespace WeakRef { PyObject* create(PyObject* obj, PySideWeakRefFunction func, void* userData) { if (obj == Py_None) return 0; if (Py_TYPE(&PySideCallableObjectType) == 0) { Py_TYPE(&PySideCallableObjectType) = &PyType_Type; PyType_Ready(&PySideCallableObjectType); } PySideCallableObject* callable = PyObject_New(PySideCallableObject, &PySideCallableObjectType); if (!callable || PyErr_Occurred()) return 0; PyObject* weak = PyWeakref_NewRef(obj, (PyObject*)callable); if (!weak || PyErr_Occurred()) return 0; Py_DECREF(callable); callable->weakref_func = func; callable->user_data = userData; return (PyObject*)weak; } } } //namespace ================================================ FILE: libpyside/pysideweakref.h ================================================ #ifndef __PYSIDEWEAKREF__ #define __PYSIDEWEAKREF__ #include #include typedef void (*PySideWeakRefFunction)(void* userData); namespace PySide { namespace WeakRef { PYSIDE_API PyObject* create(PyObject* ob, PySideWeakRefFunction func, void* userData); } //PySide } //WeakRef #endif ================================================ FILE: libpyside/signalmanager.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "signalmanager.h" #include "pysidesignal.h" #include "pysideproperty.h" #include "pysideproperty_p.h" #include "pyside.h" #include "dynamicqmetaobject.h" #include "pysidemetafunction_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #if QSLOT_CODE != 1 || QSIGNAL_CODE != 2 #error QSLOT_CODE and/or QSIGNAL_CODE changed! change the hardcoded stuff to the correct value! #endif #define PYSIDE_SLOT '1' #define PYSIDE_SIGNAL '2' #include "globalreceiverv2.h" #include "globalreceiver.h" #define PYTHON_TYPE "PyObject" namespace { static PyObject *metaObjectAttr = 0; static int callMethod(QObject* object, int id, void** args); static PyObject* parseArguments(const QList< QByteArray >& paramTypes, void** args); static bool emitShortCircuitSignal(QObject* source, int signalIndex, PyObject* args); #ifdef IS_PY3K static void destroyMetaObject(PyObject* obj) { void* ptr = PyCapsule_GetPointer(obj, 0); PySide::DynamicQMetaObject* meta = reinterpret_cast(ptr); SbkObject* wrapper = Shiboken::BindingManager::instance().retrieveWrapper(meta); if (wrapper) Shiboken::BindingManager::instance().releaseWrapper(wrapper); delete meta; } #else static void destroyMetaObject(void* obj) { PySide::DynamicQMetaObject* meta = reinterpret_cast(obj); SbkObject* wrapper = Shiboken::BindingManager::instance().retrieveWrapper(meta); if (wrapper) Shiboken::BindingManager::instance().releaseWrapper(wrapper); delete meta; } #endif } namespace PySide { PyObjectWrapper::PyObjectWrapper() :m_me(Py_None) { Py_INCREF(m_me); } PyObjectWrapper::PyObjectWrapper(PyObject* me) : m_me(me) { Py_INCREF(m_me); } PyObjectWrapper::PyObjectWrapper(const PyObjectWrapper &other) : m_me(other.m_me) { Py_INCREF(m_me); } PyObjectWrapper::~PyObjectWrapper() { // Check that Python is still initialized as sometimes this is called by a static destructor // after Python interpeter is shutdown. if (!Py_IsInitialized()) return; Shiboken::GilState gil; Py_DECREF(m_me); } PyObjectWrapper& PyObjectWrapper::operator=(const PySide::PyObjectWrapper& other) { Py_INCREF(other.m_me); Py_DECREF(m_me); m_me = other.m_me; return *this; } PyObjectWrapper::operator PyObject*() const { return m_me; } QDataStream &operator<<(QDataStream& out, const PyObjectWrapper& myObj) { if (Py_IsInitialized() == 0) { qWarning() << "Stream operator for PyObject called without python interpreter."; return out; } static PyObject *reduce_func = 0; Shiboken::GilState gil; if (!reduce_func) { Shiboken::AutoDecRef pickleModule(PyImport_ImportModule("pickle")); reduce_func = PyObject_GetAttrString(pickleModule, "dumps"); } Shiboken::AutoDecRef repr(PyObject_CallFunctionObjArgs(reduce_func, (PyObject*)myObj, NULL)); if (repr.object()) { const char* buff = 0; Py_ssize_t size = 0; if (PyBytes_Check(repr.object())) { buff = PyBytes_AS_STRING(repr.object()); size = PyBytes_GET_SIZE(repr.object()); } else if (Shiboken::String::check(repr.object())) { buff = Shiboken::String::toCString(repr.object()); size = Shiboken::String::len(repr.object()); } QByteArray data(buff, size); out << data; } return out; } QDataStream &operator>>(QDataStream& in, PyObjectWrapper& myObj) { if (Py_IsInitialized() == 0) { qWarning() << "Stream operator for PyObject called without python interpreter."; return in; } static PyObject *eval_func = 0; Shiboken::GilState gil; if (!eval_func) { Shiboken::AutoDecRef pickleModule(PyImport_ImportModule("pickle")); eval_func = PyObject_GetAttrString(pickleModule, "loads"); } QByteArray repr; in >> repr; Shiboken::AutoDecRef pyCode(PyBytes_FromStringAndSize(repr.data(), repr.size())); Shiboken::AutoDecRef value(PyObject_CallFunctionObjArgs(eval_func, pyCode.object(), 0)); if (!value.object()) { value = Py_None; } myObj = PyObjectWrapper(value); return in; } }; namespace Shiboken { template<> struct Converter { static PySide::PyObjectWrapper toCpp(PyObject* obj) { return PySide::PyObjectWrapper(obj); } static PyObject* toPython(void* obj) { return toPython(*reinterpret_cast(obj)); } static PyObject* toPython(const PySide::PyObjectWrapper& obj) { Py_INCREF((PyObject*)obj); return obj; } }; }; using namespace PySide; struct SignalManager::SignalManagerPrivate { SharedMap m_globalReceivers; //Deprecated GlobalReceiver m_globalReceiver; SignalManagerPrivate() { m_globalReceivers = SharedMap( new QMap() ); } ~SignalManagerPrivate() { if (!m_globalReceivers.isNull()) { QList values = m_globalReceivers->values(); m_globalReceivers->clear(); if (values.size()) { qDeleteAll(values); } } } }; static void clearSignalManager() { PySide::SignalManager::instance().clear(); } static void PyObject_PythonToCpp_PyObject_PTR(PyObject* pyIn, void* cppOut) { *((PyObject**)cppOut) = pyIn; } static PythonToCppFunc is_PyObject_PythonToCpp_PyObject_PTR_Convertible(PyObject* pyIn) { return PyObject_PythonToCpp_PyObject_PTR; } static PyObject* PyObject_PTR_CppToPython_PyObject(const void* cppIn) { PyObject* pyOut = (PyObject*)cppIn; if (pyOut) Py_INCREF(pyOut); return pyOut; } SignalManager::SignalManager() : m_d(new SignalManagerPrivate) { // Register Qt primitive typedefs used on signals. using namespace Shiboken; // Register PyObject type to use in queued signal and slot connections qRegisterMetaType(PYTHON_TYPE); qRegisterMetaTypeStreamOperators(PYTHON_TYPE); qRegisterMetaTypeStreamOperators("PyObjectWrapper"); qRegisterMetaTypeStreamOperators("PySide::PyObjectWrapper"); SbkConverter* converter = Shiboken::Conversions::createConverter(&PyBaseObject_Type, 0); Shiboken::Conversions::setCppPointerToPythonFunction(converter, PyObject_PTR_CppToPython_PyObject); Shiboken::Conversions::setPythonToCppPointerFunctions(converter, PyObject_PythonToCpp_PyObject_PTR, is_PyObject_PythonToCpp_PyObject_PTR_Convertible); Shiboken::Conversions::registerConverterName(converter, PYTHON_TYPE); Shiboken::Conversions::registerConverterName(converter, "object"); Shiboken::Conversions::registerConverterName(converter, "PyObjectWrapper"); Shiboken::Conversions::registerConverterName(converter, "PySide::PyObjectWrapper"); PySide::registerCleanupFunction(clearSignalManager); if (!metaObjectAttr) metaObjectAttr = Shiboken::String::fromCString("__METAOBJECT__"); } void SignalManager::clear() { delete m_d; m_d = new SignalManagerPrivate(); } SignalManager::~SignalManager() { delete m_d; } SignalManager& SignalManager::instance() { static SignalManager me; return me; } QObject* SignalManager::globalReceiver() { return &m_d->m_globalReceiver; } void SignalManager::globalReceiverConnectNotify(QObject* source, int slotIndex) { m_d->m_globalReceiver.connectNotify(source, slotIndex); } void SignalManager::globalReceiverDisconnectNotify(QObject* source, int slotIndex) { m_d->m_globalReceiver.disconnectNotify(source, slotIndex); } void SignalManager::addGlobalSlot(const char* slot, PyObject* callback) { addGlobalSlotGetIndex(slot, callback); } int SignalManager::addGlobalSlotGetIndex(const char* slot, PyObject* callback) { return m_d->m_globalReceiver.addSlot(slot, callback); } QObject* SignalManager::globalReceiver(QObject *sender, PyObject *callback) { SharedMap globalReceivers = m_d->m_globalReceivers; QByteArray hash = GlobalReceiverV2::hash(callback); GlobalReceiverV2* gr = 0; if (!globalReceivers->contains(hash)) { gr = (*globalReceivers)[hash] = new GlobalReceiverV2(callback, globalReceivers); if (sender) { gr->incRef(sender); // create a link reference gr->decRef(); // remove extra reference } } else { gr = (*globalReceivers)[hash]; if (sender) gr->incRef(sender); } return reinterpret_cast(gr); } int SignalManager::countConnectionsWith(const QObject *object) { int count = 0; foreach(GlobalReceiverV2* g, m_d->m_globalReceivers->values()) { if (g->refCount(object)) count++; } return count; } void SignalManager::notifyGlobalReceiver(QObject* receiver) { reinterpret_cast(receiver)->notify(); } void SignalManager::releaseGlobalReceiver(const QObject* source, QObject* receiver) { GlobalReceiverV2* gr = reinterpret_cast(receiver); gr->decRef(source); } int SignalManager::globalReceiverSlotIndex(QObject* receiver, const char* signature) const { return reinterpret_cast(receiver)->addSlot(signature); } bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* args) { if (!Signal::checkQtSignal(signal)) return false; signal++; int signalIndex = source->metaObject()->indexOfSignal(signal); if (signalIndex != -1) { // cryptic but works! // if the signature doesn't have a '(' it's a shor circuited signal, i.e. std::find // returned the string null terminator. bool isShortCircuit = !*std::find(signal, signal + std::strlen(signal), '('); if (isShortCircuit) return emitShortCircuitSignal(source, signalIndex, args); else return MetaFunction::call(source, signalIndex, args); } return false; } int SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, int id, void** args) { const QMetaObject* metaObject = object->metaObject(); PySideProperty* pp = 0; PyObject* pp_name = 0; QMetaProperty mp; PyObject* pySelf = 0; int methodCount = metaObject->methodCount(); int propertyCount = metaObject->propertyCount(); if (call != QMetaObject::InvokeMetaMethod) { mp = metaObject->property(id); if (!mp.isValid()) return id - methodCount; Shiboken::GilState gil; pySelf = (PyObject*)Shiboken::BindingManager::instance().retrieveWrapper(object); Q_ASSERT(pySelf); pp_name = Shiboken::String::fromCString(mp.name()); pp = Property::getObject(pySelf, pp_name); if (!pp) { qWarning("Invalid property: %s.", mp.name()); Py_XDECREF(pp_name); return id - methodCount; } } switch(call) { #ifndef QT_NO_PROPERTIES case QMetaObject::ReadProperty: case QMetaObject::WriteProperty: case QMetaObject::ResetProperty: case QMetaObject::QueryPropertyDesignable: case QMetaObject::QueryPropertyScriptable: case QMetaObject::QueryPropertyStored: case QMetaObject::QueryPropertyEditable: case QMetaObject::QueryPropertyUser: pp->d->metaCallHandler(pp, pySelf, call, args); break; #endif case QMetaObject::InvokeMetaMethod: id = callMethod(object, id, args); break; default: qWarning("Unsupported meta invocation type."); } // WARNING Isn't safe to call any metaObject and/or object methods beyond this point // because the object can be deleted inside the called slot. if (call == QMetaObject::InvokeMetaMethod) id = id - methodCount; else id = id - propertyCount; if (pp || pp_name) { Shiboken::GilState gil; Py_XDECREF(pp); Py_XDECREF(pp_name); } return id; } int SignalManager::callPythonMetaMethod(const QMetaMethod& method, void** args, PyObject* pyMethod, bool isShortCuit) { Q_ASSERT(pyMethod); Shiboken::GilState gil; PyObject* pyArguments = 0; if (isShortCuit) pyArguments = reinterpret_cast(args[1]); else pyArguments = parseArguments(method.parameterTypes(), args); if (pyArguments) { Shiboken::Conversions::SpecificConverter* retConverter = NULL; const char* returnType = method.typeName(); if (returnType && std::strcmp("", returnType)) { retConverter = new Shiboken::Conversions::SpecificConverter(returnType); if (!retConverter || !*retConverter) { PyErr_Format(PyExc_RuntimeError, "Can't find converter for '%s' to call Python meta method.", returnType); PyErr_Print(); return -1; } } Shiboken::AutoDecRef retval(PyObject_CallObject(pyMethod, pyArguments)); if (!isShortCuit && pyArguments) Py_DECREF(pyArguments); if (!retval.isNull() && retval != Py_None && !PyErr_Occurred() && retConverter) retConverter->toCpp(retval, args[0]); delete retConverter; } if (PyErr_Occurred()) PyErr_Print(); return -1; } bool SignalManager::registerMetaMethod(QObject* source, const char* signature, QMetaMethod::MethodType type) { int ret = registerMetaMethodGetIndex(source, signature, type); return (ret != -1); } int SignalManager::registerMetaMethodGetIndex(QObject* source, const char* signature, QMetaMethod::MethodType type) { Q_ASSERT(source); const QMetaObject* metaObject = source->metaObject(); int methodIndex = metaObject->indexOfMethod(signature); // Create the dynamic signal is needed if (methodIndex == -1) { SbkObject* self = Shiboken::BindingManager::instance().retrieveWrapper(source); if (!Shiboken::Object::hasCppWrapper(self)) { qWarning() << "Invalid Signal signature:" << signature; return -1; } else { DynamicQMetaObject *dmo = 0; PyObject *pySelf = reinterpret_cast(self); PyObject* dict = self->ob_dict; // Create a instance meta object if (!dict || !PyDict_Contains(dict, metaObjectAttr)) { dmo = new DynamicQMetaObject(pySelf->ob_type, metaObject); #ifdef IS_PY3K PyObject* pyDmo = PyCapsule_New(dmo, 0, destroyMetaObject); #else PyObject* pyDmo = PyCObject_FromVoidPtr(dmo, destroyMetaObject); #endif PyObject_SetAttr(pySelf, metaObjectAttr, pyDmo); Py_DECREF(pyDmo); } else { dmo = reinterpret_cast(const_cast(metaObject)); } if (type == QMetaMethod::Signal) return dmo->addSignal(signature); else return dmo->addSlot(signature); } } return methodIndex; } bool SignalManager::hasConnectionWith(const QObject *object) { return m_d->m_globalReceiver.hasConnectionWith(object); } const QMetaObject* SignalManager::retriveMetaObject(PyObject *self) { Shiboken::GilState gil; DynamicQMetaObject *mo = 0; Q_ASSERT(self); PyObject* dict = reinterpret_cast(self)->ob_dict; if (dict && PyDict_Contains(dict, metaObjectAttr)) { PyObject *pyMo = PyDict_GetItem(dict, metaObjectAttr); #ifdef IS_PY3K mo = reinterpret_cast(PyCapsule_GetPointer(pyMo, 0)); #else mo = reinterpret_cast(PyCObject_AsVoidPtr(pyMo)); #endif } else { mo = reinterpret_cast(Shiboken::Object::getTypeUserData(reinterpret_cast(self))); } mo->update(); return mo; } namespace { static int callMethod(QObject* object, int id, void** args) { const QMetaObject* metaObject = object->metaObject(); QMetaMethod method = metaObject->method(id); if (method.methodType() == QMetaMethod::Signal) { // emit python signal QMetaObject::activate(object, id, args); } else { Shiboken::GilState gil; PyObject* self = (PyObject*)Shiboken::BindingManager::instance().retrieveWrapper(object); QByteArray methodName = method.signature(); methodName = methodName.left(methodName.indexOf('(')); Shiboken::AutoDecRef pyMethod(PyObject_GetAttrString(self, methodName)); SignalManager::callPythonMetaMethod(method, args, pyMethod, false); } return -1; } static PyObject* parseArguments(const QList& paramTypes, void** args) { int argsSize = paramTypes.count(); PyObject* preparedArgs = PyTuple_New(argsSize); for (int i = 0, max = argsSize; i < max; ++i) { void* data = args[i+1]; const char* dataType = paramTypes[i].constData(); Shiboken::Conversions::SpecificConverter converter(dataType); if (converter) { PyTuple_SET_ITEM(preparedArgs, i, converter.toPython(data)); } else { PyErr_Format(PyExc_TypeError, "Can't call meta function because I have no idea how to handle %s", dataType); Py_DECREF(preparedArgs); return 0; } } return preparedArgs; } static bool emitShortCircuitSignal(QObject* source, int signalIndex, PyObject* args) { void* signalArgs[2] = {0, args}; source->qt_metacall(QMetaObject::InvokeMetaMethod, signalIndex, signalArgs); return true; } } //namespace ================================================ FILE: libpyside/signalmanager.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SIGNALMANAGER_H #define SIGNALMANAGER_H #include "pysidemacros.h" #include #include #include #include #include class QObject; namespace PySide { /// Thin wrapper for PyObject which increases the reference count at the constructor but *NOT* at destructor. class PYSIDE_API PyObjectWrapper { public: PyObjectWrapper(); PyObjectWrapper(PyObject* me); PyObjectWrapper(const PyObjectWrapper &other); ~PyObjectWrapper(); operator PyObject*() const; PyObjectWrapper& operator=(const PyObjectWrapper &other); private: PyObject* m_me; void* m_data; //future }; PYSIDE_API QDataStream &operator<<(QDataStream& out, const PyObjectWrapper& myObj); PYSIDE_API QDataStream &operator>>(QDataStream& in, PyObjectWrapper& myObj); class PYSIDE_API SignalManager { public: static SignalManager& instance(); QObject* globalReceiver(QObject* sender, PyObject* callback); void releaseGlobalReceiver(const QObject* sender, QObject* receiver); int globalReceiverSlotIndex(QObject* sender, const char* slotSignature) const; void notifyGlobalReceiver(QObject* receiver); bool emitSignal(QObject* source, const char* signal, PyObject* args); static int qt_metacall(QObject* object, QMetaObject::Call call, int id, void** args); // Used to register a new signal/slot on QMetaobject of source. static bool registerMetaMethod(QObject* source, const char* signature, QMetaMethod::MethodType type); static int registerMetaMethodGetIndex(QObject* source, const char* signature, QMetaMethod::MethodType type); // used to discovery metaobject static const QMetaObject* retriveMetaObject(PyObject* self); // Used to discovery if SignalManager was connected with object "destroyed()" signal. int countConnectionsWith(const QObject *object); // Disconnect all signals managed by Globalreceiver void clear(); // Utility function to call a python method usign args received in qt_metacall static int callPythonMetaMethod(const QMetaMethod& method, void** args, PyObject* obj, bool isShortCuit); PYSIDE_DEPRECATED(QObject* globalReceiver()); PYSIDE_DEPRECATED(void addGlobalSlot(const char* slot, PyObject* callback)); PYSIDE_DEPRECATED(int addGlobalSlotGetIndex(const char* slot, PyObject* callback)); PYSIDE_DEPRECATED(void globalReceiverConnectNotify(QObject *sender, int slotIndex)); PYSIDE_DEPRECATED(void globalReceiverDisconnectNotify(QObject *sender, int slotIndex)); PYSIDE_DEPRECATED(bool hasConnectionWith(const QObject *object)); private: struct SignalManagerPrivate; SignalManagerPrivate* m_d; SignalManager(); ~SignalManager(); // disable copy SignalManager(const SignalManager&); SignalManager operator=(const SignalManager&); }; } Q_DECLARE_METATYPE(PySide::PyObjectWrapper) #endif ================================================ FILE: plugins/CMakeLists.txt ================================================ project(plugins) set(ui_plugin_src customwidgets.cpp customwidget.cpp ) set(ui_plugin_moc customwidget.h customwidgets.h ) include_directories(${QT_QTDESIGNER_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR}) QT4_WRAP_CPP(MOC_FILES ${ui_plugin_moc}) add_library(uiplugin STATIC ${ui_plugin_src} ${MOC_FILES}) add_definitions(-fPIC) add_definitions(-DQT_STATICPLUGIN) target_link_libraries(uiplugin ${QT_QTUITOOLS_LIBRARY} ${SHIBOKEN_LIBRARY} ${SHIBOKEN_PYTHON_LIBRARY}) if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(LIBRARY_OUTPUT_SUFFIX ${CMAKE_DEBUG_POSTFIX}) else() set(LIBRARY_OUTPUT_SUFFIX ${CMAKE_RELEASE_POSTFIX}) endif() ================================================ FILE: plugins/customwidget.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "customwidget.h" #include struct PyCustomWidgetPrivate { PyObject* pyObject; bool initialized; }; PyCustomWidget::PyCustomWidget(PyObject* objectType) : m_data(new PyCustomWidgetPrivate()) { m_data->pyObject = objectType; m_name = QString(reinterpret_cast(objectType)->tp_name); } PyCustomWidget::~PyCustomWidget() { delete m_data; } bool PyCustomWidget::isContainer() const { return false; } bool PyCustomWidget::isInitialized() const { return m_data->initialized; } QIcon PyCustomWidget::icon() const { return QIcon(); } QString PyCustomWidget::domXml() const { return QString(); } QString PyCustomWidget::group() const { return QString(); } QString PyCustomWidget::includeFile() const { return QString(); } QString PyCustomWidget::name() const { return m_name; } QString PyCustomWidget::toolTip() const { return QString(); } QString PyCustomWidget::whatsThis() const { return QString(); } QWidget* PyCustomWidget::createWidget(QWidget* parent) { //Create a python instance and return cpp object PyObject* pyParent; bool unkowParent = false; if (parent) { pyParent = reinterpret_cast(Shiboken::BindingManager::instance().retrieveWrapper(parent)); if (pyParent) { Py_INCREF(pyParent); } else { static Shiboken::Conversions::SpecificConverter converter("QWidget*"); pyParent = converter.toPython(&parent); unkowParent = true; } } else { Py_INCREF(Py_None); pyParent = Py_None; } Shiboken::AutoDecRef pyArgs(PyTuple_New(1)); PyTuple_SET_ITEM(pyArgs, 0, pyParent); //tuple will keep pyParent reference //Call python constructor SbkObject* result = reinterpret_cast(PyObject_CallObject(m_data->pyObject, pyArgs)); QWidget* widget = 0; if (result) { if (unkowParent) //if parent does not exists in python, transfer the ownership to cpp Shiboken::Object::releaseOwnership(result); else Shiboken::Object::setParent(pyParent, reinterpret_cast(result)); widget = reinterpret_cast(Shiboken::Object::cppPointer(result, Py_TYPE(result))); } return widget; } void PyCustomWidget::initialize(QDesignerFormEditorInterface* core) { m_data->initialized = true; } ================================================ FILE: plugins/customwidget.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _PY_CUSTOM_WIDGET_H_ #define _PY_CUSTOM_WIDGET_H_ #include #include #include struct PyCustomWidgetPrivate; class PyCustomWidget: public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: PyCustomWidget(PyObject* objectType); ~PyCustomWidget(); bool isContainer() const; bool isInitialized() const; QIcon icon() const; QString domXml() const; QString group() const; QString includeFile() const; QString name() const; QString toolTip() const; QString whatsThis() const; QWidget *createWidget(QWidget *parent); void initialize(QDesignerFormEditorInterface *core); private: PyCustomWidgetPrivate* m_data; QString m_name; }; #endif ================================================ FILE: plugins/customwidgets.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "customwidget.h" #include "customwidgets.h" #include struct PyCustomWidgetPrivate { PyObject* pyObject; bool initialized; }; struct PyCustomWidgetsPrivate { QList widgets; ~PyCustomWidgetsPrivate(); }; PyCustomWidgetsPrivate::~PyCustomWidgetsPrivate() { foreach(QDesignerCustomWidgetInterface* iface, widgets) delete iface; widgets.clear(); } PyCustomWidgets::PyCustomWidgets(QObject *parent) : QObject(parent), m_data(new PyCustomWidgetsPrivate) { } PyCustomWidgets::~PyCustomWidgets() { delete m_data; } void PyCustomWidgets::registerWidgetType(PyObject* widget) { m_data->widgets.append(new PyCustomWidget(widget)); } QList PyCustomWidgets::customWidgets() const { return m_data->widgets; } Q_EXPORT_STATIC_PLUGIN2(uiplugin, PyCustomWidgets) ================================================ FILE: plugins/customwidgets.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _PY_CUSTOM_WIDGETS_H_ #define _PY_CUSTOM_WIDGETS_H_ #include #include #include #include #include struct PyCustomWidgetsPrivate; class PyCustomWidgets: public QObject, public QDesignerCustomWidgetCollectionInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetCollectionInterface) public: PyCustomWidgets(QObject *parent = 0); ~PyCustomWidgets(); virtual QList customWidgets() const; void registerWidgetType(PyObject* widget); private: PyCustomWidgetsPrivate* m_data; }; #endif ================================================ FILE: tests/CMakeLists.txt ================================================ if(CMAKE_VERSION VERSION_LESS 2.8) message("CMake version greater than 2.8 necessary to run tests") else() if(NOT CTEST_TESTING_TIMEOUT) set(CTEST_TESTING_TIMEOUT 60) endif() if(WIN32) set(TEST_PYTHONPATH "${CMAKE_BINARY_DIR};${CMAKE_SOURCE_DIR}/tests/util;${pysidetest_BINARY_DIR};$ENV{PYTHONPATH}") set(TEST_LIBRARY_PATH "${libpyside_BINARY_DIR};${pysidetest_BINARY_DIR};${SHIBOKEN_INCLUDE_DIR}/../../bin;$ENV{PATH}") set(LIBRARY_PATH_VAR "PATH") string(REPLACE "\\" "/" TEST_PYTHONPATH "${TEST_PYTHONPATH}") string(REPLACE "\\" "/" TEST_LIBRARY_PATH "${TEST_LIBRARY_PATH}") string(REPLACE ";" "\\;" TEST_PYTHONPATH "${TEST_PYTHONPATH}") string(REPLACE ";" "\\;" TEST_LIBRARY_PATH "${TEST_LIBRARY_PATH}") else() set(TEST_PYTHONPATH "${CMAKE_BINARY_DIR}:${CMAKE_SOURCE_DIR}/tests/util:${pysidetest_BINARY_DIR}:$ENV{PYTHONPATH}") set(TEST_LIBRARY_PATH "${libpyside_BINARY_DIR}:${pysidetest_BINARY_DIR}:$ENV{LD_LIBRARY_PATH}") set(LIBRARY_PATH_VAR "LD_LIBRARY_PATH") endif() macro(TEST_QT_MODULE var name) if(NOT DISABLE_${name} AND ${var}) add_subdirectory(${name}) endif() endmacro() macro(PYSIDE_TEST) string(REGEX MATCH "/([^/]+)//?([^/]+)\\.py" foo "${CMAKE_CURRENT_SOURCE_DIR}/${ARGV0}" ) set(TEST_NAME "${CMAKE_MATCH_1}_${CMAKE_MATCH_2}") if (${ARGC} EQUAL 1) set(EXPECT_TO_FAIL 0) elseif(${ARGC} EQUAL 2) set(EXPECT_TO_FAIL ${ARGV1}) else() message(WARNING "Invalid call of macro PYSIDE_TEST") endif() set(TEST_CMD ${XVFB_EXEC} ${SHIBOKEN_PYTHON_INTERPRETER} "${CMAKE_CURRENT_SOURCE_DIR}/${ARGV0}") add_test(${TEST_NAME} ${TEST_CMD}) set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT ${CTEST_TESTING_TIMEOUT} WILL_FAIL ${EXPECT_TO_FAIL} ENVIRONMENT "PYTHONPATH=${TEST_PYTHONPATH};${LIBRARY_PATH_VAR}=${TEST_LIBRARY_PATH}") endmacro() # Try to find QtMultimedia # TODO: Remove this hack when cmake support QtMultimedia module if (NOT QT_QTMULTIMEDIA_FOUND AND ${QTVERSION} VERSION_GREATER 4.5.9) find_path(QT_QTMULTIMEDIA_INCLUDE_DIR QtMultimedia PATHS ${QT_HEADERS_DIR}/QtMultimedia ${QT_LIBRARY_DIR}/QtMultimedia.framework/Headers NO_DEFAULT_PATH) find_library(QT_QTMULTIMEDIA_LIBRARY QtMultimedia PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) if (QT_QTMULTIMEDIA_INCLUDE_DIR AND QT_QTMULTIMEDIA_LIBRARY) set(QT_QTMULTIMEDIA_FOUND ON) endif() endif () add_subdirectory(pysidetest) add_subdirectory(signals) TEST_QT_MODULE(QT_QTCORE_FOUND QtCore) TEST_QT_MODULE(QT_QTGUI_FOUND QtGui) TEST_QT_MODULE(QT_QTNETWORK_FOUND QtNetwork) TEST_QT_MODULE(QT_QTWEBKIT_FOUND QtWebKit) TEST_QT_MODULE(QT_QTSVG_FOUND QtSvg) TEST_QT_MODULE(QT_QTXML_FOUND QtXml) TEST_QT_MODULE(QT_QTTEST_FOUND QtTest) TEST_QT_MODULE(QT_QTOPENGL_FOUND QtOpenGL) TEST_QT_MODULE(QT_QTSQL_FOUND QtSql) TEST_QT_MODULE(QT_QTUITOOLS_FOUND QtUiTools) TEST_QT_MODULE(QT_QTHELP_FOUND QtHelp) TEST_QT_MODULE(QT_QTXMLPATTERNS_FOUND QtXmlPatterns) TEST_QT_MODULE(QT_QTMAEMO5_FOUND QtMaemo5) TEST_QT_MODULE(QT_QTSCRIPT_FOUND QtScript) TEST_QT_MODULE(QT_QTSCRIPTTOOLS_FOUND QtScriptTools) TEST_QT_MODULE(QT_QTMULTIMEDIA_FOUND QtMultimedia) TEST_QT_MODULE(QT_PHONON_FOUND phonon) TEST_QT_MODULE(QT_QTDECLARATIVE_FOUND QtDeclarative) #platform specific if (ENABLE_MAC) add_subdirectory(mac) endif () endif() ================================================ FILE: tests/QtCore/CMakeLists.txt ================================================ PYSIDE_TEST(bug_278_test.py) PYSIDE_TEST(bug_332.py) PYSIDE_TEST(bug_408.py) PYSIDE_TEST(bug_428.py) PYSIDE_TEST(bug_462.py) PYSIDE_TEST(bug_505.py) PYSIDE_TEST(bug_515.py) PYSIDE_TEST(bug_606.py) PYSIDE_TEST(bug_656.py) PYSIDE_TEST(bug_686.py) PYSIDE_TEST(bug_699.py) PYSIDE_TEST(bug_706.py) PYSIDE_TEST(bug_723.py) PYSIDE_TEST(bug_724.py) PYSIDE_TEST(bug_820.py) PYSIDE_TEST(bug_826.py) PYSIDE_TEST(bug_829.py) PYSIDE_TEST(bug_835.py) PYSIDE_TEST(bug_920.py) PYSIDE_TEST(bug_927.py) PYSIDE_TEST(bug_931.py) PYSIDE_TEST(bug_938.py) PYSIDE_TEST(bug_953.py) PYSIDE_TEST(bug_987.py) PYSIDE_TEST(bug_994.py) PYSIDE_TEST(bug_1019.py) PYSIDE_TEST(bug_1031.py) PYSIDE_TEST(bug_1063.py) PYSIDE_TEST(bug_1069.py) PYSIDE_TEST(bug_PYSIDE-42.py) PYSIDE_TEST(bug_PYSIDE-164.py) PYSIDE_TEST(blocking_signals_test.py) PYSIDE_TEST(classinfo_test.py) PYSIDE_TEST(child_event_test.py) PYSIDE_TEST(deepcopy_test.py) PYSIDE_TEST(deletelater_test.py) PYSIDE_TEST(destroysignal_test.py) PYSIDE_TEST(duck_punching_test.py) PYSIDE_TEST(hash_test.py) PYSIDE_TEST(inherits_test.py) PYSIDE_TEST(max_signals.py) PYSIDE_TEST(missing_symbols_test.py) PYSIDE_TEST(mockclass_test.py) PYSIDE_TEST(python_conversion.py) PYSIDE_TEST(qabs_test.py) PYSIDE_TEST(qabstractfileengine_test.py) PYSIDE_TEST(qabstractitemmodel_test.py) PYSIDE_TEST(qabstracttransition_test.py) PYSIDE_TEST(qanimationgroup_test.py) PYSIDE_TEST(qbitarray_test.py) PYSIDE_TEST(qbytearray_buffer_protocol_test.py) PYSIDE_TEST(qbytearray_concatenation_operator_test.py) PYSIDE_TEST(qbytearray_operator_iadd_test.py) PYSIDE_TEST(qbytearray_operator_test.py) PYSIDE_TEST(qbytearray_test.py) PYSIDE_TEST(qcoreapplication_instance_test.py) PYSIDE_TEST(qdatastream_test.py) PYSIDE_TEST(qdatetime_test.py) PYSIDE_TEST(qdate_test.py) PYSIDE_TEST(qeasingcurve_test.py) PYSIDE_TEST(qenum_test.py) PYSIDE_TEST(qevent_test.py) PYSIDE_TEST(qfileinfo_test.py) PYSIDE_TEST(qfile_test.py) PYSIDE_TEST(qflags_test.py) PYSIDE_TEST(qinstallmsghandler_test.py) PYSIDE_TEST(qlinef_test.py) PYSIDE_TEST(qlocale_test.py) PYSIDE_TEST(qmetaobject_test.py) PYSIDE_TEST(qmodelindex_internalpointer_test.py) PYSIDE_TEST(qobject_children_segfault_test.py) PYSIDE_TEST(qobject_connect_notify_test.py) PYSIDE_TEST(qobject_destructor.py) PYSIDE_TEST(qobject_event_filter_test.py) PYSIDE_TEST(qobject_inherits_test.py) PYSIDE_TEST(qobject_objectproperty_test.py) PYSIDE_TEST(qobject_parent_test.py) PYSIDE_TEST(qobject_property_test.py) PYSIDE_TEST(qobject_protected_methods_test.py) PYSIDE_TEST(qobject_test.py) PYSIDE_TEST(qobject_timer_event_test.py) PYSIDE_TEST(qobject_tr_as_instance_test.py) PYSIDE_TEST(qpoint_test.py) PYSIDE_TEST(qprocess_test.py) PYSIDE_TEST(qproperty_decorator.py) PYSIDE_TEST(qrect_test.py) PYSIDE_TEST(qregexp_test.py) PYSIDE_TEST(qresource_test.py) PYSIDE_TEST(qsize_test.py) PYSIDE_TEST(qslot_object_test.py) PYSIDE_TEST(qsrand_test.py) PYSIDE_TEST(qstatemachine_test.py) PYSIDE_TEST(qstate_test.py) PYSIDE_TEST(qstring_test.py) PYSIDE_TEST(qsysinfo_test.py) PYSIDE_TEST(qtext_codec_test.py) PYSIDE_TEST(qtextstream_test.py) PYSIDE_TEST(qthread_prod_cons_test.py) PYSIDE_TEST(qthread_signal_test.py) PYSIDE_TEST(qthread_test.py) PYSIDE_TEST(qtimer_singleshot_test.py) PYSIDE_TEST(qtimer_timeout_test.py) PYSIDE_TEST(qtnamespace_test.py) PYSIDE_TEST(qurl_test.py) PYSIDE_TEST(repr_test.py) PYSIDE_TEST(setprop_on_ctor_test.py) PYSIDE_TEST(staticMetaObject_test.py) PYSIDE_TEST(static_method_test.py) PYSIDE_TEST(static_protected_methods_test.py) PYSIDE_TEST(thread_signals_test.py) PYSIDE_TEST(tr_noop_test.py) PYSIDE_TEST(translation_test.py) PYSIDE_TEST(unaryoperator_test.py) PYSIDE_TEST(unicode_test.py) PYSIDE_TEST(versioninfo_test.py) if(X11) PYSIDE_TEST(qhandle_test.py) endif() ================================================ FILE: tests/QtCore/blocking_signals_test.py ================================================ ''' Test case for QObject.signalsBlocked() and blockSignal()''' import unittest import os from tempfile import mkstemp from PySide.QtCore import QObject, SIGNAL, QFile class TestSignalsBlockedBasic(unittest.TestCase): '''Basic test case for signalsBlocked''' def testBasic(self): '''QObject.signalsBlocked() and blockSignals() The signals aren't blocked by default. blockSignals returns the previous value''' obj = QObject() self.assert_(not obj.signalsBlocked()) self.assert_(not obj.blockSignals(True)) self.assert_(obj.signalsBlocked()) self.assert_(obj.blockSignals(False)) class TestSignalsBlocked(unittest.TestCase): '''Test case to check if the signals are really blocked''' def setUp(self): #Set up the basic resources needed self.obj = QObject() self.args = tuple() self.called = False def tearDown(self): #Delete used resources del self.obj del self.args def callback(self, *args): #Default callback if args == self.args: self.called = True else: raise TypeError("Invalid arguments") def testShortCircuitSignals(self): #Blocking of Python short-circuit signals QObject.connect(self.obj, SIGNAL('mysignal'), self.callback) self.obj.emit(SIGNAL('mysignal')) self.assert_(self.called) self.called = False self.obj.blockSignals(True) self.obj.emit(SIGNAL('mysignal')) self.assert_(not self.called) def testPythonSignals(self): #Blocking of Python typed signals QObject.connect(self.obj, SIGNAL('mysignal(int,int)'), self.callback) self.args = (1, 3) self.obj.emit(SIGNAL('mysignal(int,int)'), *self.args) self.assert_(self.called) self.called = False self.obj.blockSignals(True) self.obj.emit(SIGNAL('mysignal(int,int)'), *self.args) self.assert_(not self.called) class TestQFileSignalBlocking(unittest.TestCase): '''Test case for blocking the signal QIODevice.aboutToClose()''' def setUp(self): #Set up the needed resources - A temp file and a QFile self.called = False handle, self.filename = mkstemp() os.close(handle) self.qfile = QFile(self.filename) def tearDown(self): #Release acquired resources os.remove(self.filename) del self.qfile def callback(self): #Default callback self.called = True def testAboutToCloseBlocking(self): #QIODevice.aboutToClose() blocking QObject.connect(self.qfile, SIGNAL('aboutToClose()'), self.callback) self.assert_(self.qfile.open(QFile.ReadOnly)) self.qfile.close() self.assert_(self.called) self.called = False self.qfile.blockSignals(True) self.assert_(self.qfile.open(QFile.ReadOnly)) self.qfile.close() self.assert_(not self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_1019.py ================================================ import unittest from PySide.QtCore import * class MyTimer (QTimer): def __init__(self): QTimer.__init__(self) self.startCalled = False @Slot() def slotUsedToIncreaseMethodOffset(self): pass class MyTimer2 (MyTimer): @Slot() def slotUsedToIncreaseMethodOffset2(self): pass def start(self): self.startCalled = True QCoreApplication.instance().quit() class TestBug1019 (unittest.TestCase): def testIt(self): app = QCoreApplication([]) t = MyTimer2() QTimer.singleShot(0, t.start) app.exec_() self.assertTrue(t.startCalled) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtCore/bug_1031.py ================================================ from PySide.QtCore import QStateMachine, QState mach = QStateMachine() state = QState(mach) print(state.machine()) ================================================ FILE: tests/QtCore/bug_1063.py ================================================ ''' unit test for BUG #1063 ''' import unittest import tempfile from PySide import QtCore import os import py3kcompat as py3k class QTextStreamTestCase(unittest.TestCase): def setUp(self): self.temp_file = tempfile.NamedTemporaryFile(delete=False) self.temp_file.close() self.f = QtCore.QFile(self.temp_file.name) self.f.open(QtCore.QIODevice.WriteOnly) self.strings = (py3k.unicode_('foo'), py3k.unicode_('bar')) self.stream = QtCore.QTextStream(self.f) def testIt(self): for s in self.strings: self.stream << s self.f.close() # make sure we didn't get an empty file self.assertNotEqual(QtCore.QFile(self.temp_file.name).size(), 0) os.unlink(self.temp_file.name) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtCore/bug_1069.py ================================================ ''' unit test for BUG #1069 ''' from PySide import QtCore import unittest class QDataStreamOpOverloadTestCase(unittest.TestCase): def setUp(self): self.ba = QtCore.QByteArray() self.stream = QtCore.QDataStream(self.ba, QtCore.QIODevice.WriteOnly) def testIt(self): self.stream << "hello" ok = False for c in self.ba: if c != b'\x00': ok = True break self.assertEqual(ok, True) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtCore/bug_278_test.py ================================================ #!/usr/bin/python import unittest from PySide import QtCore def setValue(o): values = ['Name'] o.setProperty('test1', values) class QQtVersionTest(unittest.TestCase): '''Tests for QVariant conversion of QStringList''' def testGet(self): o = QtCore.QObject() setValue(o) self.assertEqual(o.property('test1'), ['Name']) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_332.py ================================================ #!/usr/bin/python import unittest from PySide import QtCore class Lock(QtCore.QMutex): def tryLock(self,timeoutt=10): return QtCore.QMutex.tryLock(self,timeoutt) class TestBug(unittest.TestCase): def testCase(self): l = Lock() l.tryLock() # this cause a assertion if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_408.py ================================================ import unittest from PySide.QtCore import * class MyDevice(QIODevice): def __init__(self, txt): QIODevice.__init__(self) self.txt = txt self.ptr = 0 def readData(self, size): size = min(len(self.txt) - self.ptr, size) retval = self.txt[self.ptr:size] self.ptr += size return retval class QIODeviceTest(unittest.TestCase): def testIt(self): device = MyDevice("hello world\nhello again") device.open(QIODevice.ReadOnly) s = QTextStream(device) self.assertEqual(s.readLine(), "hello world") self.assertEqual(s.readLine(), "hello again") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_428.py ================================================ import unittest from PySide.QtCore import QObject class MyBaseObject(QObject): def __init__(self, number): self.myMember = 'myMember' + number QObject.__init__(self) class QObjectConstructorTest(unittest.TestCase): def testBug(self): for i in range(10): number = str(i) obj = MyBaseObject(number) self.assertEqual(obj.myMember, 'myMember' + number) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_462.py ================================================ import unittest import sys from PySide.QtCore import QObject, QCoreApplication, QEvent, QThread class MyEvent(QEvent): def __init__(self,i): print("TYPE:", type(QEvent.User)) super(MyEvent,self).__init__(QEvent.Type(QEvent.User + 100 )) self.i = i class MyThread (QThread): def __init__(self,owner): super(MyThread,self).__init__() self.owner=owner; def run(self): for i in range(3): e=MyEvent(i); QCoreApplication.postEvent(self.owner,e) class MyBaseObject(QObject): def __init__(self): QObject.__init__(self) self.events = [] self.t = MyThread(self) self.t.start() def customEvent(self, event): self.events.append(event) if len(self.events) == 3: self.t.wait() self.app.quit() class CheckForEventsTypes(unittest.TestCase): def testTypes(self): o = MyBaseObject() o.app = QCoreApplication(sys.argv) o.app.exec_() for e in o.events: self.assertTrue(isinstance(e, MyEvent)) o.app = None if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_505.py ================================================ import unittest from PySide.QtCore import QObject class MyBaseObject(QObject): def __init__(self, parent=None): QObject.__init__(self, parent) self.setObjectName("PySide") def __del__(self): if self.objectName() != "PySide": raise NameError('Fail') class CheckForEventsTypes(unittest.TestCase): def testDelObject(self): p = MyBaseObject() o = MyBaseObject(p) del o del p if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_515.py ================================================ """ Unittest for bug #515 """ """ http://bugs.openbossa.org/show_bug.cgi?id=515 """ from PySide import QtCore callCleanup = False def _cleanup(): global callCleanup callCleanup = True def _checkCleanup(): global callCleanup assert(callCleanup) app = QtCore.QCoreApplication([]) QtCore.qAddPostRoutine(_cleanup) QtCore.qAddPostRoutine(_checkCleanup) del app ================================================ FILE: tests/QtCore/bug_606.py ================================================ import unittest import PySide from PySide.QtCore import QPoint, QPointF from PySide.QtCore import QLine, QLineF from PySide.QtCore import QSize, QSizeF class testCases(unittest.TestCase): def testQPointToTuple(self): p = QPoint(1, 2) self.assertEqual((1, 2), p.toTuple()) def testQPointFToTuple(self): p = QPointF(1, 2) self.assertEqual((1, 2), p.toTuple()) def testQLineToTuple(self): l = QLine(1, 2, 3, 4) self.assertEqual((1, 2, 3, 4), l.toTuple()) def testQLineFToTuple(self): l = QLineF(1, 2, 3, 4) self.assertEqual((1, 2, 3, 4), l.toTuple()) def testQSizeToTuple(self): s = QSize(1, 2) self.assertEqual((1, 2), s.toTuple()) def testQSizeFToTuple(self): s = QSizeF(1, 2) self.assertEqual((1, 2), s.toTuple()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_656.py ================================================ from PySide.QtCore import * class CoreApp(QCoreApplication): def __init__(self,*args): super(CoreApp,self).__init__(*args) # It shouldn't crash after the __init__ call import sys app = CoreApp(sys.argv) ================================================ FILE: tests/QtCore/bug_686.py ================================================ from __future__ import with_statement import unittest from PySide.QtCore import * class MyWriteThread(QThread): def __init__(self, lock): QThread.__init__(self) self.lock = lock self.started = False self.canQuit = False def run(self): self.started = True while not self.lock.tryLockForWrite(): pass self.canQuit = True class MyReadThread(QThread): def __init__(self, lock): QThread.__init__(self) self.lock = lock self.started = False self.canQuit = False def run(self): self.started = True while not self.lock.tryLockForRead(): pass self.canQuit = True class MyMutexedThread(QThread): def __init__(self, mutex): QThread.__init__(self) self.mutex = mutex self.started = False self.canQuit = False def run(self): self.started = True while not self.mutex.tryLock(): pass self.canQuit = True class TestQMutex (unittest.TestCase): def testReadLocker(self): lock = QReadWriteLock() thread = MyWriteThread(lock) with QReadLocker(lock): thread.start() while not thread.started: pass self.assertFalse(thread.canQuit) thread.wait() self.assertTrue(thread.canQuit) def testWriteLocker(self): lock = QReadWriteLock() thread = MyReadThread(lock) with QWriteLocker(lock): thread.start() while not thread.started: pass self.assertFalse(thread.canQuit) thread.wait() self.assertTrue(thread.canQuit) def testMutexLocker(self): mutex = QMutex() thread = MyMutexedThread(mutex) with QMutexLocker(mutex): thread.start() while not thread.started: pass self.assertFalse(thread.canQuit) thread.wait() self.assertTrue(thread.canQuit) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_699.py ================================================ import unittest from PySide.QtCore import * class TestBug699 (unittest.TestCase): def defClass(self): class Foo (QObject): def foo(self): pass prop = Property(foo, foo) def testIt(self): self.assertRaises(TypeError, self.defClass) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_706.py ================================================ import unittest from PySide.QtCore import * class MyModel (QAbstractListModel): def rowCount(self, parent = None): return 3 class TestBug706(unittest.TestCase): def mySlot(self, idx, start, end): self.start = start self.end = end def testIt(self): self.start = None self.end = None app = QCoreApplication([]) model = MyModel() model.columnsAboutToBeInserted.connect(self.mySlot) model.columnsAboutToBeInserted.emit(QModelIndex(), 0, 1) self.assertEqual(self.start, 0) self.assertEqual(self.end, 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_723.py ================================================ import unittest from PySide.QtCore import * class MyFileEngine (QAbstractFileEngine): def __init__(self): QAbstractFileEngine.__init__(self) self.contents = "Foo \0bar for the win!" self.pos = 0 def open(self, mode): return True def read(self, maxlen): print("Reading... to return ", self.contents[self.pos:maxlen]) if self.pos > len(self.contents): return -1 res = self.contents[self.pos:maxlen] self.pos += len(res) return res def readLine(self, maxlen): return self.contents[self.pos:maxlen] class MyFileEngineHandler (QAbstractFileEngineHandler): def create(self, fileName): if fileName.startswith("foo:/"): return MyFileEngine() return None class TestBug723 (unittest.TestCase): def testIt(self): fh = MyFileEngineHandler() f = QFile("foo:/bar") print(type(QFile.ReadOnly)) v = (QFile.ReadOnly | QFile.Text) print(type(v)) """ assert(f.open(QFile.ReadOnly | QFile.Text)) contents = f.readAll() self.assertEqual(contents, "Foo \0bar for the win!") f.close() """ if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_724.py ================================================ from PySide.QtCore import QAbstractFileEngine, QIODevice, QFile import unittest import tempfile import os import py3kcompat as py3k class TestBug724 (unittest.TestCase): def testIt(self): # creates a temporary file handle, self.filename = tempfile.mkstemp() os.write(handle, py3k.b('a')) os.close(handle) engine = QAbstractFileEngine.create(self.filename) engine.open(QIODevice.ReadOnly) memory = engine.map(0, 1, QFile.NoOptions) self.assertEqual(len(memory), 1) self.assertEqual(memory[0], py3k.b('a')) engine.unmap(memory) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_820.py ================================================ import functools import unittest from PySide.QtCore import QObject, Slot, Signal, SIGNAL def log_exception(): def log_exception_decorator(func): @functools.wraps(func) def wrapper(*args, **kwds): try: return func(*args, **kwds) except Exception: raise return wrapper return log_exception_decorator def log_exception2(): def log_exception_decorator(func): def wrapper(*args, **kwds): try: return func(*args, **kwds) except Exception: raise return wrapper return log_exception_decorator class MyObject(QObject): def __init__(self, parent=None): QObject.__init__(self, parent) self._mySlotcalled = False self._mySlot2called = False @Slot() @log_exception() def mySlot(self): self._mySlotcalled = True @Slot(name="mySlot2") @log_exception2() def mySlot2(self): self._mySlot2called = True def poke(self): self.events.emit() events = Signal() class SlotWithDecoratorTest(unittest.TestCase): def testSlots(self): o = MyObject() self.assert_(o.metaObject().indexOfSlot("mySlot()") > 0) self.assert_(o.metaObject().indexOfSlot("mySlot2()") > 0) o.events.connect(o.mySlot) o.events.connect(o.mySlot2) o.poke() self.assertTrue(o._mySlotcalled) self.assertTrue(o._mySlot2called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_826.py ================================================ from PySide.QtCore import QEvent, Qt import PySide import unittest TEST_EVENT_TYPE = QEvent.Type(QEvent.registerEventType()) class TestEvent(QEvent): TestEventType = QEvent.Type(QEvent.registerEventType()) def __init__(self, rand=0): super(TestEvent, self).__init__(TestEvent.TestEventType) self._rand = rand def getRand(self): return self._rand class TestEnums(unittest.TestCase): def testUserTypesValues(self): self.assert_(QEvent.User <= int(TestEvent.TestEventType) <= QEvent.MaxUser) self.assert_(QEvent.User <= int(TEST_EVENT_TYPE) <= QEvent.MaxUser) def testUserTypesRepr(self): self.assertEqual(eval(repr(TestEvent.TestEventType)), TestEvent.TestEventType) self.assertEqual(eval(repr(TEST_EVENT_TYPE)), TEST_EVENT_TYPE) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_829.py ================================================ # Test case for PySide bug 829 # Thomas Perl ; 2011-04-16 import unittest from PySide.QtCore import QSettings import tempfile class QVariantConversions(unittest.TestCase): def testDictionary(self): confFile = tempfile.NamedTemporaryFile(delete=False) s = QSettings(confFile.name, QSettings.IniFormat) # Save value s.setValue('x', {1: 'a'}) s.sync() del s # Restore value s = QSettings(confFile.name, QSettings.IniFormat) self.assertEqual(s.value('x'), {1: 'a'}) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_835.py ================================================ from PySide.QtCore import * import unittest get_counter = 0 set_counter = 0 class Descriptor(object): def __get__(self, obj, owner): global get_counter if not obj: return self get_counter += 1 return obj.var def __set__(self, obj, value): global set_counter set_counter += 1 obj.var = value class FooBar(QObject): test = Descriptor() var = 0 class SetAndGetTestCases(unittest.TestCase): def setUp(self): global get_counter global set_counter get_counter = 0 set_counter = 0 def testSetMethod(self): global get_counter global set_counter f = FooBar() f.test = 1 self.assertEqual(get_counter, 0) self.assertEqual(set_counter, 1) get_counter = 0 set_counter = 0 def testGetMethod(self): global get_counter global set_counter f = FooBar() f.test = 1 set_counter = 0 ret = f.test self.assertEqual(get_counter, 1) self.assertEqual(set_counter, 0) get_counter = 0 set_counter = 0 if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtCore/bug_920.py ================================================ #!/usr/bin/env python import sys import unittest import PySide.QtCore as QtCore class Signaller(QtCore.QObject): s1 = QtCore.Signal() s2 = QtCore.Signal() class TestBug920(unittest.TestCase): def testIt(self): s = Signaller() s.s1.connect(self.onSignal) s.s2.connect(self.onSignal) self.assertTrue(s.s1.disconnect(self.onSignal)) self.assertTrue(s.s2.disconnect(self.onSignal)) def onSignal(self): pass if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtCore/bug_927.py ================================================ import time import unittest from PySide.QtCore import QTime, QRunnable, QThreadPool class Task(QRunnable): def run(self): t = QTime() t.start() time.sleep(2) # Sleep 2 seconds class QThreadPoolTest(unittest.TestCase): '''This used to cause a segfault due the ownership control on globalInstance function ''' def testSlowJobs(self): for i in range(3): task = Task() QThreadPool.globalInstance().start(task) time.sleep(1) # Sleep 1 second QThreadPool.globalInstance().waitForDone() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_931.py ================================================ import unittest from PySide.QtCore import QObject, Signal o = QObject() class MyObject(QObject): s = Signal(int) class CheckSignalType(unittest.TestCase): def testSignal(self): self.assertTrue(isinstance(QObject.destroyed, Signal)) self.assertEqual(type(QObject.destroyed), Signal) self.assertEqual(type(o.destroyed).__name__, "SignalInstance") self.assertNotEqual(type(o.destroyed), Signal) self.assertTrue(isinstance(o.destroyed, Signal)) self.assertTrue(isinstance(MyObject.s, Signal)) self.assertFalse(isinstance(int, Signal)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_938.py ================================================ import unittest from PySide.QtCore import * class TestBug938 (unittest.TestCase): def testIt(self): b = QBuffer() b.open(QBuffer.WriteOnly) b.write("\x0023\x005") b.close() self.assertEqual(b.buffer().size(), 5) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_953.py ================================================ from PySide.QtCore import * class Dispatcher(QObject): _me = None def __init__(self): super(Dispatcher, self).__init__() self._me = self QTimer.singleShot(0, self._finish) def _finish(self): del self._me # It can't crash here! QTimer.singleShot(10, QCoreApplication.instance().quit) if __name__ == '__main__': app = QCoreApplication([]) Dispatcher() app.exec_() ================================================ FILE: tests/QtCore/bug_987.py ================================================ from PySide.QtCore import QObject import unittest class TestBug987(unittest.TestCase): def callback(self): pass def testInvalidDisconnection(self): o = QObject() self.assertRaises(RuntimeError, o.destroyed.disconnect, self.callback) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_994.py ================================================ import unittest import py3kcompat as py3k from PySide.QtCore import QIODevice, QTextStream class MyIODevice (QIODevice): def readData(self, amount): return py3k.b("\0a" * int(amount/2)) def readLineData(self, maxSize): return py3k.b("\0b" * 4) def atEnd(self): return False class TestBug944 (unittest.TestCase): def testIt(self): device = MyIODevice() device.open(QIODevice.ReadOnly) s = QTextStream(device) self.assertEqual(s.read(4), "\0a\0a") self.assertEqual(device.readLine(), "\0b\0b\0b\0b") if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtCore/bug_PYSIDE-164.py ================================================ from PySide.QtCore import QCoreApplication, QEventLoop, QObject, Qt, QThread, QTimer, SIGNAL import unittest class Emitter(QThread): def __init__(self): QThread.__init__(self) def run(self): print "Before emit." self.emit(SIGNAL("signal(int)"), 0) print "After emit." class Receiver(QObject): def __init__(self, eventloop): QObject.__init__(self) self.eventloop = eventloop def receive(self, number): print "Received number: %d" % number self.eventloop.exit(0) class TestBugPYSIDE164(unittest.TestCase): def testBlockingSignal(self): app = QCoreApplication.instance() or QCoreApplication([]) eventloop = QEventLoop() emitter = Emitter() receiver = Receiver(eventloop) emitter.connect(emitter, SIGNAL("signal(int)"), receiver.receive, Qt.BlockingQueuedConnection) emitter.start() retval = eventloop.exec_() emitter.wait() self.assertEqual(retval, 0) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/bug_PYSIDE-42.py ================================================ from PySide.QtCore import * from PySide.QtGui import * import unittest class TestBugPYSIDE42 (unittest.TestCase): def testIt(self): obj1 = QFile() obj2 = QObject() hash1 = hash(obj1) hash2 = hash(obj2) self.assertNotEqual(hash1, hash2) self.assertEqual(hash1, hash(obj1)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/child_event_test.py ================================================ #!/usr/bin/python '''Test case for QObject.childEvent and QTimer.childEvent overloading''' import unittest from time import sleep from PySide.QtCore import QObject, QTimer, QCoreApplication from helper import UsesQCoreApplication class ExtQObject(QObject): def __init__(self): QObject.__init__(self) self.child_event_received = False def childEvent(self, event): QObject.childEvent(self, event) self.child_event_received = True class ExtQTimer(QTimer): def __init__(self): QTimer.__init__(self) self.child_event_received = False def childEvent(self, event): QTimer.childEvent(self, event) self.child_event_received = True class TestChildEvent(UsesQCoreApplication): '''Test case for QObject::childEvent and QTimer::childEvent''' def setUp(self): UsesQCoreApplication.setUp(self) def tearDown(self): UsesQCoreApplication.tearDown(self) def testQObject(self): parent = ExtQObject() child = QObject() child.setParent(parent) self.assertTrue(parent.child_event_received) def testQTimer(self): parent = ExtQTimer() child = QObject() child.setParent(parent) self.assert_(parent.child_event_received) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/classinfo_test.py ================================================ import unittest import sys from PySide.QtCore import QObject, ClassInfo @ClassInfo(author='pyside',url='http://www.pyside.org') class MyObject(QObject): pass class TestClassInfo(unittest.TestCase): def testMetaData(self): o = MyObject() mo = o.metaObject() self.assertEqual(mo.classInfoCount(), 2) ci = mo.classInfo(0) #author self.assertEqual(ci.name(), 'author') self.assertEqual(ci.value(), 'pyside') ci = mo.classInfo(1) #url self.assertEqual(ci.name(), 'url') self.assertEqual(ci.value(), 'http://www.pyside.org') if __name__ == '__main__': if sys.version_info[0] < 2: sys.exit(0) elif (sys.version_info[0] == 2) and (sys.version_info[1] <= 5): sys.exit(0) else: unittest.main() ================================================ FILE: tests/QtCore/deepcopy_test.py ================================================ import unittest from copy import deepcopy from PySide.QtCore import QByteArray, QDate, QDateTime, QTime, QLine, QLineF from PySide.QtCore import Qt, QSize, QSizeF, QRect, QRectF, QDir, QPoint, QPointF from PySide.QtCore import QUuid class DeepCopyHelper: def testCopy(self): copy = deepcopy([self.original])[0] self.assert_(copy is not self.original) self.assertEqual(copy, self.original) class QByteArrayDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QByteArray('the quick brown fox jumps over the lazy dog') class QDateDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QDate(2010, 11, 22) class QTimeDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QTime(11, 37, 55, 692) class QDateTimeDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QDateTime(2010, 5, 18, 10, 24, 45, 223, Qt.LocalTime) class QSizeDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QSize(42, 190) class QSizeFDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QSizeF(42.7, 190.2) class QRectDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QRect(100, 200, 300, 400) class QRectFDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QRectF(100.33, 200.254, 300.321, 400.123) class QLineDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QLine(1, 2, 3, 4) class QLineFDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QLineF(1.1, 2.2, 3.3, 4.4) class QPointDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QPoint(1, 2) class QPointFDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QPointF(1.1, 2.2) class QDirDeepCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QDir("./") class QUuiCopy(DeepCopyHelper, unittest.TestCase): def setUp(self): self.original = QUuid("67C8770B-44F1-410A-AB9A-F9B5446F13EE") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/deletelater_test.py ================================================ #!/usr/bin/python '''Test cases for QTimer.singleShot''' import unittest from PySide.QtCore import QObject, QTimer, QCoreApplication, SIGNAL from helper import UsesQCoreApplication class TestDeleteLater(UsesQCoreApplication): '''Test case for function DeleteLater''' def testCase(self): o = QObject() o.deleteLater() del o QTimer.singleShot(100, self.app.quit) self.app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/destroysignal_test.py ================================================ from PySide.QtCore import QTimer, QObject import sys import unittest class TestDestroySignal(unittest.TestCase): def onObjectDestroyed(self, timer): self.assert_(isinstance(timer, QObject)) self._destroyed = True def testSignal(self): self._destroyed = False t = QTimer() t.destroyed[QObject].connect(self.onObjectDestroyed) del t self.assert_(self._destroyed) def testWithParent(self): self._destroyed = False p = QTimer() t = QTimer(p) t.destroyed[QObject].connect(self.onObjectDestroyed) del p self.assert_(self._destroyed) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/duck_punching_test.py ================================================ #!/usr/bin/python '''Test case for duck punching new implementations of C++ virtual methods into object instances.''' import unittest import types import sys from PySide.QtCore import QObject from helper import UsesQCoreApplication def MethodType(func, instance, instanceType): if sys.version_info[0] == 3: return types.MethodType(func, instance) else: return types.MethodType(func, instance, instanceType) class Duck(QObject): def __init__(self): QObject.__init__(self) def childEvent(self, event): QObject.childEvent(self, event) class TestDuckPunchingOnQObjectInstance(UsesQCoreApplication): '''Test case for duck punching new implementations of C++ virtual methods into object instances.''' def setUp(self): #Acquire resources self.duck_childEvent_called = False UsesQCoreApplication.setUp(self) def tearDown(self): #Release resources del self.duck_childEvent_called UsesQCoreApplication.tearDown(self) def testChildEventMonkeyPatch(self): #Test if the new childEvent injected on QObject instance is called from C++ parent = QObject() def childEvent(obj, event): self.duck_childEvent_called = True parent.childEvent = MethodType(childEvent, parent, QObject) child = QObject() child.setParent(parent) self.assert_(self.duck_childEvent_called) # This is done to decrease the refcount of the vm object # allowing the object wrapper to be deleted before the # BindingManager. This is useful when compiling Shiboken # for debug, since the BindingManager destructor has an # assert that checks if the wrapper mapper is empty. parent.childEvent = None def testChildEventMonkeyPatchWithInheritance(self): #Test if the new childEvent injected on a QObject's extension class instance is called from C++ parent = Duck() def childEvent(obj, event): QObject.childEvent(obj, event) self.duck_childEvent_called = True child = QObject() child.setParent(parent) parent.childEvent = MethodType(childEvent, parent, QObject) child = QObject() child.setParent(parent) self.assert_(self.duck_childEvent_called) # This is done to decrease the refcount of the vm object # allowing the object wrapper to be deleted before the # BindingManager. This is useful when compiling Shiboken # for debug, since the BindingManager destructor has an # assert that checks if the wrapper mapper is empty. parent.childEvent = None if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/hash_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtCore import QDate, QDateTime, QTime, QUrl from PySide.QtCore import QLine, QPoint, QRect, QSize class HashTest(unittest.TestCase): def testInsert(self): myHash = {} qdate = QDate.currentDate() qdatetime = QDateTime.currentDateTime() qtime = QTime.currentTime() qurl = QUrl("http://www.pyside.org") qpoint = QPoint(12, 42) myHash[qdate] = "QDate" myHash[qdatetime] = "QDateTime" myHash[qtime] = "QTime" myHash[qurl] = "QUrl" myHash[qpoint] = "QPoint" self.assertEqual(myHash[qdate], "QDate") self.assertEqual(myHash[qdatetime], "QDateTime") self.assertEqual(myHash[qtime], "QTime") self.assertEqual(myHash[qurl], "QUrl") self.assertEqual(myHash[qpoint], "QPoint") def testQPointHash(self): p1 = QPoint(12, 34) p2 = QPoint(12, 34) self.assertFalse(p1 is p2) self.assertEqual(p1, p2) self.assertEqual(hash(p1), hash(p2)) def testQSizeHash(self): s1 = QSize(12, 34) s2 = QSize(12, 34) self.assertFalse(s1 is s2) self.assertEqual(s1, s2) self.assertEqual(hash(s1), hash(s2)) def testQRectHash(self): r1 = QRect(12, 34, 56, 78) r2 = QRect(12, 34, 56, 78) self.assertFalse(r1 is r2) self.assertEqual(r1, r2) self.assertEqual(hash(r1), hash(r2)) def testQLineHash(self): l1 = QLine(12, 34, 56, 78) l2 = QLine(12, 34, 56, 78) self.assertFalse(l1 is l2) self.assertEqual(l1, l2) self.assertEqual(hash(l1), hash(l2)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/inherits_test.py ================================================ import unittest from PySide.QtCore import QObject class MyObject(QObject): pass class MainTest(unittest.TestCase): def testInherits(self): o = MyObject() mo = o.metaObject() self.assertEqual(mo.className(), 'MyObject') self.assertTrue(o.inherits('MyObject')) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/max_signals.py ================================================ import unittest from PySide.QtCore import QObject, SIGNAL class MyObject(QObject): pass class TestSignalLimitless(unittest.TestCase): SIGNAL_MAX = 100 def test100DynamicSignals(self): self.count = 0 def onSignal(): self.count += 1 #create 100 dynamic signals o = MyObject() for i in range(self.SIGNAL_MAX): o.connect(SIGNAL('sig%d()'%i), onSignal) #chek if the signals are valid m = o.metaObject() for i in range(self.SIGNAL_MAX): self.assert_(m.indexOfSignal('sig%d()'%i) > 0) #emit all 100 signals for i in range(self.SIGNAL_MAX): o.emit(SIGNAL('sig%d()'%i)) self.assertEqual(self.count, self.SIGNAL_MAX) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/missing_symbols_test.py ================================================ '''(Very) Simple test case for missing names from QtCore''' import unittest from PySide import QtCore class MissingClasses(unittest.TestCase): def testQSettings(self): # Bug 232 getattr(QtCore, 'QSettings') def testQtTrNoop(self): # Bug 220 getattr(QtCore, 'QT_TR_NOOP') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/mockclass_test.py ================================================ # Test case for PySide bug 634 # http://bugs.pyside.org/show_bug.cgi?id=634 # Marcus Lindblom ; 2011-02-16 import unittest from PySide.QtCore import QCoreApplication class Mock(object): def __init__(self): self.called = False self.return_value = None def __call__(self, *args, **kwargs): self.called = True return self.return_value class MockClassTest(unittest.TestCase): def testMockQCoreApplication(self): mock = Mock() setattr(QCoreApplication, 'instance', mock) QCoreApplication.instance() self.assert_(mock.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/python_conversion.py ================================================ #!/usr/bin/python '''Test cases for QLineF''' import unittest import datetime from PySide.QtCore import QTime, QDateTime, QDate class TestDateTimeConversions (unittest.TestCase): def testQDate(self): date = datetime.date(2010, 4, 23) other = QDate(date) self.assertEqual(date.year, other.year()) self.assertEqual(date.month, other.month()) self.assertEqual(date.day, other.day()) self.assertEqual(date, other.toPython()) def testQTime(self): time = datetime.time(11, 14, 0, 1000) other = QTime(time) self.assertEqual(time.hour, other.hour()) self.assertEqual(time.minute, other.minute()) self.assertEqual(time.second, other.second()) self.assertEqual(time.microsecond/1000, other.msec()) self.assertEqual(time, other.toPython()) def testQDateTime(self): dateTime = datetime.datetime(2010, 4, 23, 11, 14, 0, 1000) other = QDateTime(dateTime) otherDate = other.date() self.assertEqual(dateTime.year, otherDate.year()) self.assertEqual(dateTime.month, otherDate.month()) self.assertEqual(dateTime.day, otherDate.day()) otherTime = other.time() self.assertEqual(dateTime.hour, otherTime.hour()) self.assertEqual(dateTime.minute, otherTime.minute()) self.assertEqual(dateTime.second, otherTime.second()) self.assertEqual(dateTime.microsecond/1000, otherTime.msec()) self.assertEqual(dateTime, other.toPython()) def testQDateTime6arg(self): dateTime = datetime.datetime(2010, 4, 23, 11, 14, 7) other = QDateTime(dateTime) otherDate = other.date() self.assertEqual(dateTime.year, otherDate.year()) self.assertEqual(dateTime.month, otherDate.month()) self.assertEqual(dateTime.day, otherDate.day()) otherTime = other.time() self.assertEqual(dateTime.hour, otherTime.hour()) self.assertEqual(dateTime.minute, otherTime.minute()) self.assertEqual(dateTime.second, otherTime.second()) self.assertEqual(dateTime.microsecond/1000, otherTime.msec()) self.assertEqual(dateTime, other.toPython()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qabs_test.py ================================================ import unittest from PySide import QtCore class QAbsTest(unittest.TestCase): '''Tests for QtCore.qAbs''' def testBasic(self): def check(x): self.assertEqual(QtCore.qAbs(x), abs(x)) check(0) check(-10) check(10) check(10.5) check(-10.5) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qabstractfileengine_test.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest import os from PySide.QtCore import QAbstractFileEngineIterator, QAbstractFileEngine, QAbstractFileEngineHandler, QDir class TestFSIterator(QAbstractFileEngineIterator): def __init__(self, parent, filters, filterNames): QAbstractFileEngineIterator.__init__(self, filters, filterNames) self.index = -1 self._list = ['.', '..'] if parent == '/bup': self._list += ['A', 'B', 'C'] def next(self): self.index += 1 return self.currentFileName() def hasNext(self): return (self.index + 1) < len(self._list) def currentFileName(self): if self.index < len(self._list): return self._list[self.index] return None class TestFS(QAbstractFileEngine): def __init__(self, path): QAbstractFileEngine.__init__(self) self.path = path def beginEntryList(self, filters, filterNames): return TestFSIterator(self.path, filters, filterNames) def fileFlags(self, _ = QAbstractFileEngine.FileInfoAll): return QAbstractFileEngine.ExistsFlag\ |QAbstractFileEngine.ReadOwnerPerm\ |QAbstractFileEngine.ReadUserPerm\ |QAbstractFileEngine.ReadGroupPerm\ |QAbstractFileEngine.ReadOtherPerm\ |QAbstractFileEngine.DirectoryType def fileName(self, path=QAbstractFileEngine.DefaultName): if path == QAbstractFileEngine.DefaultName: return self.path return os.path.basename(self.path) def setFileName(self, path): self.path = path class TestFSHandler(QAbstractFileEngineHandler): def __init__(self): QAbstractFileEngineHandler.__init__(self) def create(self, path): if path.startswith('/bup'): return TestFS(path) return None class QAbstractFileEngineTest(unittest.TestCase): def testBeginEntryList(self): obj = TestFSHandler() qdir = QDir('/bup') for n1, n2 in zip(qdir.entryList(), ['.', '..', 'A', 'B', 'C']): self.assertEqual(n1, n2) self.assertEqual(len(qdir.entryList()), 5) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qabstractitemmodel_test.py ================================================ # -*- coding: utf-8 -*- import unittest from PySide.QtCore import * class MyModel (QAbstractListModel): pass class Foo: pass class TestQModelIndexInternalPointer(unittest.TestCase): def testInternalPointer(self): m = MyModel() foo = Foo() idx = m.createIndex(0,0, foo) def testPassQPersistentModelIndexAsQModelIndex(self): # Related to bug #716 m = MyModel() idx = QPersistentModelIndex() m.span(idx) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qabstracttransition_test.py ================================================ #!/usr/bin/python import unittest from sys import getrefcount from PySide.QtCore import * def addStates(transition): sx = QState() sy = QState() transition.setTargetStates([sx, sy]) def addAnimation(transition): animation = QParallelAnimationGroup() transition.addAnimation(animation) class QAbstractTransitionTest(unittest.TestCase): def testBasic(self): app = QCoreApplication([]) o = QObject() o.setProperty("text", "INdT") machine = QStateMachine() s1 = QState() s1.assignProperty(o, "text", "Rocks") s2 = QFinalState() t = s1.addTransition(o, SIGNAL("change()"), s2) self.assertEqual(t.targetStates(), [s2]) addStates(t) self.assertEqual(len(t.targetStates()), 2) animation = QParallelAnimationGroup() t.addAnimation(animation) self.assertEqual(t.animations(), [animation]) addAnimation(t) self.assertEqual(t.animations()[0].parent(), None) machine.addState(s1) machine.addState(s2) machine.setInitialState(s1) machine.start() QTimer.singleShot(100, app.quit) app.exec_() def testRefCountOfTargetState(self): transition = QEventTransition() state1 = QState() refcount1 = getrefcount(state1) transition.setTargetState(state1) self.assertEqual(transition.targetState(), state1) self.assertEqual(getrefcount(transition.targetState()), refcount1 + 1) state2 = QState() refcount2 = getrefcount(state2) transition.setTargetState(state2) self.assertEqual(transition.targetState(), state2) self.assertEqual(getrefcount(transition.targetState()), refcount2 + 1) self.assertEqual(getrefcount(state1), refcount1) del transition self.assertEqual(getrefcount(state2), refcount2) def testRefCountOfTargetStates(self): transition = QEventTransition() state1 = QState() state2 = QState() states = [state1, state2] refcount1 = getrefcount(state1) refcount2 = getrefcount(state2) transition.setTargetStates(states) self.assertEqual(transition.targetStates(), states) self.assertEqual(transition.targetState(), state1) self.assertEqual(getrefcount(transition.targetStates()[0]), refcount1 + 1) self.assertEqual(getrefcount(transition.targetStates()[1]), refcount2 + 1) del states del transition self.assertEqual(getrefcount(state1), refcount1 - 1) self.assertEqual(getrefcount(state2), refcount2 - 1) def testRefCountOfTargetStatesAfterSingleTargetState(self): transition = QEventTransition() state0 = QState() refcount0 = getrefcount(state0) transition.setTargetState(state0) self.assertEqual(transition.targetState(), state0) self.assertEqual(getrefcount(transition.targetState()), refcount0 + 1) state1 = QState() state2 = QState() states = [state1, state2] refcount1 = getrefcount(state1) refcount2 = getrefcount(state2) transition.setTargetStates(states) self.assertEqual(getrefcount(state0), refcount0) self.assertEqual(transition.targetStates(), states) self.assertEqual(transition.targetState(), state1) self.assertEqual(getrefcount(transition.targetStates()[0]), refcount1 + 1) self.assertEqual(getrefcount(transition.targetStates()[1]), refcount2 + 1) del states del transition self.assertEqual(getrefcount(state1), refcount1 - 1) self.assertEqual(getrefcount(state2), refcount2 - 1) def testRefCountOfTargetStatesBeforeSingleTargetState(self): transition = QEventTransition() state1 = QState() state2 = QState() states = [state1, state2] refcount1 = getrefcount(state1) refcount2 = getrefcount(state2) transition.setTargetStates(states) self.assertEqual(transition.targetStates(), states) self.assertEqual(transition.targetState(), state1) self.assertEqual(getrefcount(transition.targetStates()[0]), refcount1 + 1) self.assertEqual(getrefcount(transition.targetStates()[1]), refcount2 + 1) state3 = QState() refcount3 = getrefcount(state3) transition.setTargetState(state3) self.assertEqual(transition.targetState(), state3) self.assertEqual(getrefcount(transition.targetState()), refcount3 + 1) del states self.assertEqual(getrefcount(state1), refcount1 - 1) self.assertEqual(getrefcount(state2), refcount2 - 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qanimationgroup_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtCore import * class QAnimationGroupTest(unittest.TestCase): def testBasic(self): app = QCoreApplication([]) panim = QParallelAnimationGroup() sanim = QSequentialAnimationGroup() panim.addAnimation(sanim) self.assertEqual(sanim.parent(), panim) panim.clear() self.assertRaises(RuntimeError, lambda :sanim.parent()) QTimer.singleShot(100, app.quit) app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qbitarray_test.py ================================================ #!/usr/bin/python '''Tests if QBitArray class is iterable and also '~' (__invert__) and bitwise operators''' import unittest from PySide.QtCore import QBitArray def bool_list_from_qbitarray(qbitarray): '''This function is used instead of a list comprehension because the QBitArray is being tested also to check if it is providing the iterable protocol. ''' qbitarray_values = [] for i in range(qbitarray.size()): qbitarray_values.append(qbitarray.at(i)) return qbitarray_values class QBitArrayIsIterableTest(unittest.TestCase): '''Tests if QBitArray class is iterable and also '~' (__invert__) and bitwise operators''' def setUp(self): #Acquire resources self.qbitarray = QBitArray(3) self.qbitarray_values = [True, False, False] # WARNING: do not pythonify the following loop for i in range(len(self.qbitarray_values)): self.qbitarray.setBit(i, self.qbitarray_values[i]) self.inverted_qbitarray_values = [not bit for bit in self.qbitarray_values] self.other_qbitarray = QBitArray(3) self.other_qbitarray_values = [True, True, False] # WARNING: do not pythonify the following loop for i in range(len(self.other_qbitarray_values)): self.other_qbitarray.setBit(i, self.other_qbitarray_values[i]) def tearDown(self): #Release resources del self.qbitarray del self.other_qbitarray del self.qbitarray_values del self.other_qbitarray_values del self.inverted_qbitarray_values def testQBitArrayIsIterable(self): #Tests if QBitArray class is iterable qbitarray_is_iterable = True try: bitarray = [bit for bit in self.qbitarray] except: qbitarray_is_iterable = False self.assertTrue(qbitarray_is_iterable) def testQBitArrayInvertOperator(self): #Tests QBitArray '~' (__invert__) operator inverted_qbitarray = ~self.qbitarray # WARNING: do not pythonify the following loop, the # iterability of QBitArray class is tested in another place inverted_qbitarray_values = bool_list_from_qbitarray(inverted_qbitarray) self.assertEqual(self.inverted_qbitarray_values, inverted_qbitarray_values) def testQBitArrayOrBitwiseOperator(self): #Tests QBitArray '|' (or) operator has_or_bitwise_operator = True ored_qbitarray, ored_bool_list = None, None try: ored_qbitarray = self.qbitarray | self.other_qbitarray ored_bool_list = [b1 | b2 for b1, b2 in zip(self.qbitarray_values, self.other_qbitarray_values)] except: has_or_bitwise_operator = False self.assertTrue(has_or_bitwise_operator) self.assertEqual(bool_list_from_qbitarray(ored_qbitarray), ored_bool_list) def testQBitArrayAndBitwiseOperator(self): #Tests QBitArray '&' (and) operator has_and_bitwise_operator = True anded_qbitarray, anded_bool_list = None, None try: anded_qbitarray = self.qbitarray | self.other_qbitarray anded_bool_list = [b1 | b2 for b1, b2 in zip(self.qbitarray_values, self.other_qbitarray_values)] except: has_and_bitwise_operator = False self.assertTrue(has_and_bitwise_operator) self.assertEqual(bool_list_from_qbitarray(anded_qbitarray), anded_bool_list) def testQBitArrayXorBitwiseOperator(self): #Tests QBitArray '^' (xor) operator has_xor_bitwise_operator = True xored_qbitarray, xored_bool_list = None, None try: xored_qbitarray = self.qbitarray | self.other_qbitarray xored_bool_list = [b1 | b2 for b1, b2 in zip(self.qbitarray_values, self.other_qbitarray_values)] except: has_xor_bitwise_operator = False self.assertTrue(has_xor_bitwise_operator) self.assertEqual(bool_list_from_qbitarray(xored_qbitarray), xored_bool_list) class QBitArrayGetItemTest(unittest.TestCase): '''Test case for []/__getitem__ operator''' def create_bitarray(self, values): '''helper function to create a bit array''' obj = QBitArray(len(values)) for i, value in enumerate(values): obj.setBit(i, value) return obj def testSequenceProtocol(self): '''QBitArray sequence protocol''' data = [True, False, True] obj = self.create_bitarray(data) for reference, value in zip(data, obj): self.assertEqual(reference, value) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qbytearray_buffer_protocol_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Tests QByteArray implementation of Python buffer protocol''' import unittest import py3kcompat as py3k from os.path import isdir from PySide.QtCore import QByteArray class QByteArrayBufferProtocolTest(unittest.TestCase): '''Tests QByteArray implementation of Python buffer protocol''' def testQByteArrayBufferProtocol(self): if py3k.IS_PY3K: return #Tests QByteArray implementation of Python buffer protocol using the os.path.isdir #function which an unicode object or other object implementing the Python buffer protocol isdir(QByteArray('/tmp')) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qbytearray_concatenation_operator_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Test cases for QByteArray concatenation with '+' operator''' import unittest from PySide.QtCore import QByteArray class QByteArrayConcatenationOperatorTest(unittest.TestCase): '''Test cases for QByteArray concatenation with '+' operator''' def testConcatQByteArrayAndPythonString(self): #Test concatenation of a QByteArray with a Python string, in this order qba = QByteArray('foo') result = qba + '\x00bar' self.assertEqual(type(result), QByteArray) self.assertEqual(result, 'foo\x00bar') def testConcatPythonStringAndQByteArray(self): #Test concatenation of a Python string with a QByteArray, in this order concat_python_string_add_qbytearray_worked = True qba = QByteArray('foo') result = 'bar\x00' + qba self.assertEqual(type(result), QByteArray) self.assertEqual(result, 'bar\x00foo') # NOTICE: Does not makes sense concat a unicode string with a QByteArray, because the # user does not know nothing about the internal representation of the unicode string. #def testConcatPythonUnicodeAndQByteArray(self): ##Test concatenation of a Python unicode object with a QByteArray, in this order #concat_python_unicode_add_qbytearray_worked = True #qba = QByteArray('foo') #result = None #try: #result = u'ümlaut' + qba #except: #concat_python_unicode_add_qbytearray_worked = False #self.assertTrue(concat_python_unicode_add_qbytearray_worked) #self.assertEqual(result.__class__.__name__, 'unicode') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qbytearray_operator_iadd_test.py ================================================ import unittest from PySide.QtCore import QByteArray from helper.docmodifier import DocModifier class BaseQByteArrayOperatorIAdd(object): '''Base class for QByteArray += operator tests. Implementing classes should inherit from unittest.TestCase and implement setUp, setting self.obj and self.orig_obj to the target QByteArray and original one, respectively''' __metaclass__ = DocModifier def testSingleString(self): '''QByteArray += string of size 1''' s = '0' self.obj += s self.assertEqual(self.obj, self.orig_obj + s) self.assertEqual(self.obj.size(), self.orig_obj.size() + len(s)) def testString(self): '''QByteArray += string of size > 1''' s = 'dummy' self.obj += s self.assertEqual(self.obj, self.orig_obj + s) self.assertEqual(self.obj.size(), self.orig_obj.size() + len(s)) def testQByteArray(self): '''QByteArray += QByteArray''' s = QByteArray('array') self.obj += s self.assertEqual(self.obj, self.orig_obj + s) def testChar(self): '''QByteArray += char (number < 256)''' s = ord('a') self.obj += s self.assertEqual(self.obj, self.orig_obj + s) self.assertEqual(self.obj.size(), self.orig_obj.size() + 1) class NullQByteArrayOperatorIAdd(unittest.TestCase, BaseQByteArrayOperatorIAdd): '''Test case for operator QByteArray += on null QByteArrays''' doc_prefix = 'Null object' doc_filter = lambda x: x.startswith('test') def setUp(self): self.obj = QByteArray() self.orig_obj = QByteArray() class ValidQByteArrayOperatorIAdd(unittest.TestCase, BaseQByteArrayOperatorIAdd): '''Test case for operator QByteArray += on valid QByteArrays''' doc_prefix = 'Valid object' doc_filter = lambda x: x.startswith('test') def setUp(self): self.obj = QByteArray('some byte array') self.orig_obj = QByteArray('some byte array') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qbytearray_operator_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Test cases for QByteArray operators''' import unittest import py3kcompat as py3k from PySide.QtCore import QByteArray class QByteArrayOperatorEqual(unittest.TestCase): '''TestCase for operator QByteArray == QByteArray''' def testDefault(self): #QByteArray() == QByteArray() obj1 = QByteArray() obj2 = QByteArray() self.assertEqual(obj1, obj2) def testSimple(self): #QByteArray(some_string) == QByteArray(some_string) string = 'egg snakes' self.assertEqual(QByteArray(string), QByteArray(string)) def testPyString(self): #QByteArray(string) == string string = 'my test string' self.assertEqual(QByteArray(string), string) def testQString(self): #QByteArray(string) == string string = 'another test string' self.assertEqual(QByteArray(string), string) class QByteArrayOperatorAt(unittest.TestCase): '''TestCase for operator QByteArray[]''' def testInRange(self): #QByteArray[x] where x is a valid index string = 'abcdefgh' obj = QByteArray(string) for i in range(len(string)): self.assertEqual(obj[i], py3k.b(string[i])) def testInRangeReverse(self): #QByteArray[x] where x is a valid index (reverse order) string = 'abcdefgh' obj = QByteArray(string) for i in range(len(string)-1, 0, -1): self.assertEqual(obj[i], py3k.b(string[i])) def testOutOfRange(self): #QByteArray[x] where x is out of index string = '1234567' obj = QByteArray(string) self.assertRaises(IndexError, lambda :obj[len(string)]) def testNullStrings(self): ba = QByteArray('\x00') self.assertEqual(ba.at(0), '\x00') self.assertEqual(ba[0], py3k.b('\x00')) class QByteArrayOperatorLen(unittest.TestCase): '''Test case for __len__ operator of QByteArray''' def testBasic(self): '''QByteArray __len__''' self.assertEqual(len(QByteArray()), 0) self.assertEqual(len(QByteArray('')), 0) self.assertEqual(len(QByteArray(' ')), 1) self.assertEqual(len(QByteArray('yabadaba')), 8) class QByteArrayOperatorStr(unittest.TestCase): '''Test case for __str__ operator of QByteArray''' def testBasic(self): '''QByteArray __str__''' self.assertEqual(QByteArray().__str__(), '') self.assertEqual(QByteArray('').__str__(), '') self.assertEqual(QByteArray('aaa').__str__(), 'aaa') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qbytearray_test.py ================================================ #!/usr/bin/python '''Unit tests for QByteArray''' import unittest import ctypes import pickle import py3kcompat as py3k from PySide.QtCore import QByteArray, QSettings, QObject class QByteArrayTestToNumber(unittest.TestCase): def testToNumberInt(self): obj = QByteArray('37') self.assertEqual((37, True), obj.toInt()) def testToNumberUShort(self): obj = QByteArray('37') self.assertEqual((37, True), obj.toUShort()) def testToNumberFloat(self): obj = QByteArray('37.109') self.assertEqual((ctypes.c_float(37.109).value, True), obj.toFloat()) def testToNumberDouble(self): obj = QByteArray('37.109') self.assertEqual((ctypes.c_double(37.109).value, True), obj.toDouble()) def testSetNum(self): b = QByteArray() b.setNum(py3k.long(-124124)) self.assertEqual(b, "-124124") b = QByteArray() b.setNum(-124124) self.assertEqual(b, "-124124") b = QByteArray() b.setNum(-0.5) self.assertEqual(b, "-0.5") def testAppend(self): b = QByteArray() b.append("A") self.assertEqual(b.size(), 1) b.append("AB") self.assertEqual(b.size(), 3) class QByteArraySplit(unittest.TestCase): '''Test case for QByteArray.split''' def testPathSeparator(self): #QByteArray.split('/') obj = QByteArray(unittest.__file__) self.assertEqual(obj.split('/'), unittest.__file__.split('/')) class QByteArrayData(unittest.TestCase): '''Test case for QByteArray.data''' def testData(self): url = QByteArray("http://web.openbossa.org/") self.assertEqual(url.data(), py3k.b("http://web.openbossa.org/")) def testDataWithZeros(self): s1 = "123\000321" ba = QByteArray(s1) s2 = ba.data() self.assertEqual(py3k.b(s1), s2) self.assertEqual(s1, ba) class QByteArrayOperatorAtSetter(unittest.TestCase): '''Test case for operator QByteArray[] - __setitem__''' def testSetterString(self): '''QByteArray[x] = pythonstring''' obj = QByteArray('123456') obj[1] = '0' self.assertEqual(obj, QByteArray('103456')) def testSetterStringLarge(self): '''QByteArray[x] = pythonstring (larget than 1 char)''' obj = QByteArray('123456') obj[3] = 'abba' self.assertEqual(obj, QByteArray('123abba56')) def testSetterQByteArray(self): '''QByteArray[x] = qbytearray''' obj = QByteArray('123456') obj[3] = QByteArray('array') self.assertEqual(obj, QByteArray('123array56')) class QByteArrayOperatorAtSetterNegativeIndex(unittest.TestCase): '''Test case for QByteArray[] - __setitem__ - for negative index''' def testSetterNegativeIndex(self): '''QByteArray[x] = string - negative index''' obj = QByteArray('123456') obj[-3] = 'array' self.assertEqual(obj, QByteArray('123array56')) class QByteArrayOperatorAtSetterLargeIndex(unittest.TestCase): '''Test case for QByteArray[] - __setitem__ - for 'overflown' index''' def testSetterLargeIndexEmpty(self): '''QByteArray[x] = somestring - Overflow index on empty string''' # should pad with spaces if the index is larger obj = QByteArray('') obj[2] = 'a' self.assertEqual(obj, QByteArray(' a')) def testSetterLargeIndexNormal(self): '''QByteArray[x] = somestring - Overflow index on normal string''' # should pad with spaces if the index is larger obj = QByteArray('mystring') obj[10] = 'normal' self.assertEqual(obj, QByteArray('mystring normal')) class QByteArrayOnQVariant(unittest.TestCase): def testQByteArrayOnQVariant(self): a = QSettings().value("some_prop", QByteArray()) self.assertEqual(type(a), QByteArray) class TestBug666(unittest.TestCase): '''QByteArray does not support slices''' def testIt(self): if not py3k.IS_PY3K: ba = QByteArray('1234567890') self.assertEqual(ba[2:4], '34') self.assertEqual(ba[:4], '1234') self.assertEqual(ba[4:], '567890') self.assertEqual(len(ba[4:1]), 0) class QByteArrayBug514(unittest.TestCase): def testIt(self): data = py3k.b("foobar") a = QByteArray.fromRawData(data) self.assertEqual(type(a), QByteArray) self.assertEqual(a.data(), data) class TestPickler(unittest.TestCase): def testIt(self): ba = QByteArray("321\x00123") output = pickle.dumps(str(ba)) ba2 = pickle.loads(output) self.assertEqual(ba, ba2) class QByteArrayBug720(unittest.TestCase): def testIt(self): ba = QByteArray(b"32\"1\x00123") self.assertEqual(str(ba), "32\"1\x00123") self.assertEqual(repr(ba), "PySide.QtCore.QByteArray('32\"1\x00123')") class QByteArrayImplicitConvert(unittest.TestCase): def testString(self): # No implicit conversions from QByteArray to python string ba = QByteArray("object name") obj = QObject() self.assertRaises(TypeError, obj.setObjectName, ba) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qcoreapplication_instance_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Test cases for QCoreApplication.instance static method''' import unittest from PySide.QtCore import QCoreApplication class QCoreApplicationInstanceTest(unittest.TestCase): '''Test cases for QCoreApplication.instance static method''' def testQCoreApplicationInstance(self): #Tests QCoreApplication.instance() self.assertEqual(QCoreApplication.instance(), None) app = QCoreApplication([]) self.assertEqual(QCoreApplication.instance(), app) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qdatastream_test.py ================================================ #!/usr/bin/python '''Unit tests for QDataStream''' import unittest import py3kcompat as py3k from PySide.QtCore import QBitArray, QByteArray, QIODevice, QDataStream, QDate, QTime, QDateTime def create_bitarray(string): array = QBitArray(len(string)) for i, char in enumerate(string): array.setBit(i, char != '0') return array class QDataStreamWrite(unittest.TestCase): '''Test case for QDatastream write* functions''' def setUp(self): self.ba = QByteArray() self.read = QDataStream(self.ba, QIODevice.ReadOnly) self.write = QDataStream(self.ba, QIODevice.WriteOnly) def testWriteUInt8(self): '''QDataStream.writeUInt8 (accepting str of size 1)''' x = 0xFF self.write.writeUInt8(x) y = self.read.readUInt8() self.assertEqual(x, y) self.assertRaises(TypeError, self.write.writeUInt8, 'aaaaa') def testWriteInt8(self): '''QDataStream.writeInt8 (accepting str of size 1)''' x = 65 self.write.writeInt8(chr(x)) y = self.read.readInt8() self.assertEqual(x, y) self.assertRaises(TypeError, self.write.writeInt8, 'aaaaa') def testWriteUInt8Int(self): '''QDataStream.writeUInt8 (accepting integer)''' x = 0xFF self.write.writeUInt8(x) y = self.read.readUInt8() self.assertEqual(x, y) def testWriteInt8Int(self): '''QDataStream.writeInt8 (accepting integer)''' x = 65 self.write.writeInt8(x) y = self.read.readInt8() self.assertEqual(x, y) def testWriteUInt16(self): '''QDataStream.writeUInt16''' x = 0x4423 self.write.writeUInt16(x) y = int(self.read.readUInt16()) self.assertEqual(x, y) def testWriteUInt32(self): '''QDataStream.writeUInt32''' x = 0xdeadbeef self.write.writeUInt32(x) y = int(self.read.readUInt32()) self.assertEqual(x, y) class QDataStreamShift(unittest.TestCase): '''Test case for << and >> operators''' def setUp(self): self.ba = QByteArray() self.stream = QDataStream(self.ba, QIODevice.WriteOnly) self.read_stream = QDataStream(self.ba, QIODevice.ReadOnly) def testQCharValid(self): '''QDataStream <<>> QChar - valid''' self.stream.writeQChar(42) res = self.read_stream.readQChar() self.assertEqual(res, py3k.unichr(42)) def testQCharNull(self): '''QDataStream <<>> QChar - null''' self.stream.writeQChar(None) res = self.read_stream.readQChar() self.assertEqual(res, py3k.unicode_('\x00')) def testQByteArrayValid(self): '''QDataStream <<>> QByteArray - valid''' self.stream << QByteArray("hello") res = QByteArray() self.read_stream >> res self.assertEqual(res, QByteArray("hello")) def testQByteArrayEmpty(self): '''QDataStream <<>> QByteArray - empty''' self.stream << QByteArray("") res = QByteArray() self.read_stream >> res self.assertEqual(res, QByteArray("")) self.assertTrue(res.isEmpty()) self.assertFalse(res.isNull()) def testQByteArrayNull(self): '''QDataStream <<>> QByteArray - null''' self.stream << QByteArray() res = QByteArray() self.read_stream >> res self.assertEqual(res, QByteArray()) self.assertTrue(res.isEmpty()) self.assertTrue(res.isNull()) def testQStringValid(self): '''QDataStream <<>> QString - valid''' self.stream.writeQString('Ka-boom') res = self.read_stream.readQString() self.assertEqual(res, py3k.unicode_('Ka-boom')) def testQStringEmpty(self): '''QDataStream <<>> QString - empty''' self.stream.writeQString('') res = self.read_stream.readQString() self.assertEqual(res, py3k.unicode_('')) def testQStringNull(self): '''QDataStream <<>> QString - null''' self.stream.writeQString(None) res = self.read_stream.readQString() self.assertEqual(res, py3k.unicode_('')) def testQBitArrayNull(self): '''QDataStream <<>> QBitArray - null''' self.stream << QBitArray() res = QBitArray() self.read_stream >> res self.assertEqual(res, QBitArray()) def testQBitArrayValid(self): '''QDataStream <<>> QBitArray - valid''' self.stream << create_bitarray('01010101') res = QBitArray() self.read_stream >> res self.assertEqual(res, create_bitarray('01010101')) def testQDateNull(self): '''QDataStream <<>> QDate - null''' self.stream << QDate() res = QDate() self.read_stream >> res self.assertEqual(res, QDate()) self.assertFalse(res.isValid()) self.assertTrue(res.isNull()) def testQDateValid(self): '''QDataStream <<>> QDate - valid''' self.stream << QDate(2012, 12, 21) res = QDate() self.read_stream >> res self.assertEqual(res, QDate(2012, 12, 21)) self.assertTrue(res.isValid()) self.assertFalse(res.isNull()) def testQTimeNull(self): '''QDataStream <<>> QTime - null''' self.stream << QTime() res = QTime() self.read_stream >> res self.assertEqual(res, QTime()) self.assertFalse(res.isValid()) self.assertTrue(res.isNull()) def testQTimeValid(self): '''QDataStream <<>> QTime - valid''' self.stream << QTime(12, 12, 21) res = QTime() self.read_stream >> res self.assertEqual(res, QTime(12, 12, 21)) self.assertTrue(res.isValid()) self.assertFalse(res.isNull()) def testQDateTimeNull(self): '''QDataStream <<>> QDateTime - null''' self.stream << QDateTime() res = QDateTime() self.read_stream >> res self.assertEqual(res, QDateTime()) self.assertFalse(res.isValid()) self.assertTrue(res.isNull()) def testQDateTimeValid(self): '''QDataStream <<>> QDateTime - valid''' time = QTime(23, 23, 23) date = QDate(2009, 1, 1) self.stream << QDateTime(date, time) res = QDateTime() self.read_stream >> res self.assertEqual(res, QDateTime(date, time)) self.assertTrue(res.isValid()) self.assertFalse(res.isNull()) class QDataStreamShiftBitArray(unittest.TestCase): def _check_bitarray(self, data_set): '''Check the >> operator for the given data set''' for data, expectedStatus, expectedString in data_set: stream = QDataStream(data, QIODevice.ReadOnly) string = QBitArray() stream >> string self.assertEqual(stream.status(), expectedStatus) self.assertEqual(string.size(), expectedString.size()) self.assertEqual(string, expectedString) def testOk(self): '''QDataStream with valid QBitArray''' data = [] data.append((QByteArray('\x00\x00\x00\x00'), QDataStream.Ok, QBitArray())) data.append((QByteArray('\x00\x00\x00\x01\x00'), QDataStream.Ok, create_bitarray('0'))) data.append((QByteArray('\x00\x00\x00\x01\x01'), QDataStream.Ok, create_bitarray('1'))) data.append((QByteArray('\x00\x00\x00\x02\x03'), QDataStream.Ok, create_bitarray('11'))) data.append((QByteArray('\x00\x00\x00\x03\x07'), QDataStream.Ok, create_bitarray('111'))) data.append((QByteArray('\x00\x00\x00\x04\x0f'), QDataStream.Ok, create_bitarray('1111'))) data.append((QByteArray('\x00\x00\x00\x05\x1f'), QDataStream.Ok, create_bitarray('11111'))) data.append((QByteArray('\x00\x00\x00\x06\x3f'), QDataStream.Ok, create_bitarray('111111'))) data.append((QByteArray('\x00\x00\x00\x07\x7f'), QDataStream.Ok, create_bitarray('1111111'))) data.append((QByteArray('\x00\x00\x00\x07\x7e'), QDataStream.Ok, create_bitarray('0111111'))) data.append((QByteArray('\x00\x00\x00\x07\x00'), QDataStream.Ok, create_bitarray('0000000'))) data.append((QByteArray('\x00\x00\x00\x07\x39'), QDataStream.Ok, create_bitarray('1001110'))) self._check_bitarray(data) def testPastEnd(self): '''QDataStream >> QBitArray reading past the end of the data''' data = [] data.append((QByteArray(), QDataStream.ReadPastEnd, QBitArray())) data.append((QByteArray('\x00'), QDataStream.ReadPastEnd, QBitArray())) data.append((QByteArray('\x00\x00'), QDataStream.ReadPastEnd, QBitArray())) data.append((QByteArray('\x00\x00\x00'), QDataStream.ReadPastEnd, QBitArray())) data.append((QByteArray('\x00\x00\x00\x01'), QDataStream.ReadPastEnd, QBitArray())) data.append((QByteArray('\x00\x00\x00\x02'), QDataStream.ReadPastEnd, QBitArray())) data.append((QByteArray('\x00\x00\x00\x03'), QDataStream.ReadPastEnd, QBitArray())) data.append((QByteArray('\x00\x00\x00\x04'), QDataStream.ReadPastEnd, QBitArray())) self._check_bitarray(data) def testCorruptData(self): '''QDataStream reading corrupt data''' data = [] data.append((QByteArray('\x00\x00\x00\x01\x02'), QDataStream.ReadCorruptData, QBitArray())) self._check_bitarray(data) class QDataStreamRawData(unittest.TestCase): def testRawData(self): data = QDataStream() self.assertEqual(data.readRawData(4), None) ba = QByteArray() data = QDataStream(ba, QIODevice.WriteOnly) data.writeRawData('AB\x00C') self.assertEqual(ba.data(), py3k.b('AB\x00C')) data = QDataStream(ba) self.assertEqual(data.readRawData(4), py3k.b('AB\x00C')) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qdate_test.py ================================================ #!/usr/bin/python '''Test cases for QDate''' import unittest from PySide.QtCore import * class TestQDate (unittest.TestCase): def testGetDate(self): date = QDate(2009, 22, 9) tuple_ = date.getDate() self.assertEquals(tuple, tuple_.__class__) (y, m, d) = tuple_ self.assertEqual(date.year(), y) self.assertEqual(date.month(), m) self.assertEqual(date.day(), d) def testGetWeekNumber(self): date = QDate(2000, 1, 1) tuple_ = date.weekNumber() self.assertEquals(tuple, tuple_.__class__) (week, yearNumber) = tuple_ self.assertEqual(week, 52) self.assertEqual(yearNumber, 1999) def testBooleanCast(self): today = QDate.currentDate() self.assertTrue(today) nodate = QDate() self.assertFalse(nodate) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qdatetime_test.py ================================================ import unittest import datetime from PySide.QtCore import QDateTime, QDate, QTime class TestQDate (unittest.TestCase): def testDateConversion(self): dateTime = QDateTime(QDate(2011, 5, 17), QTime(11, 1, 14, 15)) dateTimePy = QDateTime(datetime.date(2011, 5, 17), datetime.time(11, 1, 14, 15000)) self.assertEqual(dateTime, dateTimePy) def testDateTimeConversion(self): dateTime = QDateTime(QDate(2011, 5, 17), QTime(11, 1, 14, 15)) dateTimePy = QDateTime(datetime.datetime(2011, 5, 17, 11, 1, 14, 15000)) self.assertEqual(dateTime, dateTimePy) def testDateTimeNow(self): py = datetime.datetime.now() qt = QDateTime(py) self.assertEqual(qt, py) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qeasingcurve_test.py ================================================ import unittest from PySide.QtCore import QEasingCurve def myFunction(progress): if progress == 1.0: return 100.0 else: return -100.0 class TestQEasingCurve(unittest.TestCase): def testCustomType(self): ec = QEasingCurve() ec.setCustomType(myFunction) self.assertEqual(ec.valueForProgress(1.0), 100.0) self.assertEqual(ec.valueForProgress(0.5), -100.0) def testObjectCleanup(self): for i in range(100): ec = QEasingCurve() ec.setCustomType(myFunction) self.assertEqual(ec.valueForProgress(1.0), 100.0) self.assertEqual(ec.valueForProgress(0.5), -100.0) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qenum_test.py ================================================ #!/usr/bin/python '''Test cases for QEnum and QFlags''' import unittest from PySide.QtCore import * class TestEnum(unittest.TestCase): def testToInt(self): self.assertEqual(QIODevice.NotOpen, 0) self.assertEqual(QIODevice.ReadOnly, 1) self.assertEqual(QIODevice.WriteOnly, 2) self.assertEqual(QIODevice.ReadWrite, 1 | 2) self.assertEqual(QIODevice.Append, 4) self.assertEqual(QIODevice.Truncate, 8) self.assertEqual(QIODevice.Text, 16) self.assertEqual(QIODevice.Unbuffered, 32) def testToIntInFunction(self): self.assertEqual(str(int(QIODevice.WriteOnly)), "2") class TestQFlags(unittest.TestCase): def testToItn(self): om = QIODevice.NotOpen self.assertEqual(om, QIODevice.NotOpen) self.assertTrue(om == 0) self.assertTrue(om != QIODevice.ReadOnly) self.assertTrue(om != 1) def testToIntInFunction(self): om = QIODevice.WriteOnly self.assertEqual(int(om), 2) def testNonExtensibleEnums(self): try: om = QIODevice.OpenMode(QIODevice.WriteOnly) self.assertFail() except: pass if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qevent_test.py ================================================ #!/usr/bin/python '''Test cases for QtCore.QEvent''' import unittest from PySide.QtCore import QEvent class QEventTypeFlag(unittest.TestCase): '''Test case for usage of QEvent.Type flags''' def testFlagAccess(self): #QEvent.Type flags usage event = QEvent(QEvent.Timer) self.assertEqual(event.type(), QEvent.Timer) event = QEvent(QEvent.Close) self.assertEqual(event.type(), QEvent.Close) event = QEvent(QEvent.IconTextChange) self.assertEqual(event.type(), QEvent.IconTextChange) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qfile_test.py ================================================ import unittest import os import tempfile import py3kcompat as py3k from PySide.QtCore import QFile, QIODevice class GetCharTest(unittest.TestCase): '''Test case for QIODevice.getChar in QFile''' def setUp(self): '''Acquire resources''' handle, self.filename = tempfile.mkstemp() os.write(handle, py3k.b('a')) os.close(handle) def tearDown(self): '''release resources''' os.remove(self.filename) def testBasic(self): '''QFile.getChar''' obj = QFile(self.filename) obj.open(QIODevice.ReadOnly) self.assertEqual(obj.getChar(), (True, 'a')) self.assertFalse(obj.getChar()[0]) obj.close() def testBug721(self): obj = QFile(self.filename) obj.open(QIODevice.ReadOnly) memory = obj.map(0, 1) self.assertEqual(len(memory), 1) self.assertEqual(memory[0], py3k.b('a')) obj.unmap(memory) # now memory points to wild bytes... :-) # uncommenting this must cause a segfault. # self.assertEqual(memory[0], 'a') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qfileinfo_test.py ================================================ import unittest import os import tempfile from PySide.QtCore import QFile, QFileInfo class QFileConstructor(unittest.TestCase): '''QFileInfo constructor with qfile''' def testBasic(self): '''QFileInfo(QFile)''' obj = QFileInfo(QFile()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qflags_test.py ================================================ #!/usr/bin/python '''Test cases for QFlags''' import unittest from PySide.QtCore import Qt, QTemporaryFile, QFile, QIODevice, QObject class QFlagTest(unittest.TestCase): '''Test case for usage of flags''' def testCallFunction(self): f = QTemporaryFile() self.assertTrue(f.open()) fileName = f.fileName() f.close() f = QFile(fileName) self.assertEqual(f.open(QIODevice.Truncate | QIODevice.Text | QIODevice.ReadWrite), True) om = f.openMode() self.assertEqual(om & QIODevice.Truncate, QIODevice.Truncate) self.assertEqual(om & QIODevice.Text, QIODevice.Text) self.assertEqual(om & QIODevice.ReadWrite, QIODevice.ReadWrite) self.assertTrue(om == QIODevice.Truncate | QIODevice.Text | QIODevice.ReadWrite) f.close() class QFlagOperatorTest(unittest.TestCase): '''Test case for operators in QFlags''' def testInvert(self): '''QFlags ~ (invert) operator''' self.assertEqual(type(~QIODevice.ReadOnly), QIODevice.OpenMode) def testOr(self): '''QFlags | (or) operator''' self.assertEqual(type(QIODevice.ReadOnly | QIODevice.WriteOnly), QIODevice.OpenMode) def testAnd(self): '''QFlags & (and) operator''' self.assertEqual(type(QIODevice.ReadOnly & QIODevice.WriteOnly), QIODevice.OpenMode) def testIOr(self): '''QFlags |= (ior) operator''' flag = Qt.WindowFlags() self.assertTrue(Qt.Widget == 0) self.assertFalse(flag & Qt.Widget) result = flag & Qt.Widget self.assertTrue(result == 0) flag |= Qt.WindowMinimizeButtonHint self.assertTrue(flag & Qt.WindowMinimizeButtonHint) def testInvertOr(self): '''QFlags ~ (invert) operator over the result of an | (or) operator''' self.assertEqual(type(~(Qt.ItemIsSelectable | Qt.ItemIsEditable)), Qt.ItemFlags) def testEqual(self): '''QFlags == operator''' flags = Qt.Window flags |= Qt.WindowMinimizeButtonHint flag_type = (flags & Qt.WindowType_Mask) self.assertEqual(flag_type, Qt.Window) self.assertEqual(Qt.KeyboardModifiers(Qt.ControlModifier), Qt.ControlModifier) def testOperatorBetweenFlags(self): '''QFlags & QFlags''' flags = Qt.NoItemFlags | Qt.ItemIsUserCheckable newflags = Qt.NoItemFlags | Qt.ItemIsUserCheckable self.assertTrue(flags & newflags) def testOperatorDifferentOrder(self): '''Different ordering of arguments''' flags = Qt.NoItemFlags | Qt.ItemIsUserCheckable self.assertEqual(flags | Qt.ItemIsEnabled, Qt.ItemIsEnabled | flags) class QFlagsOnQVariant(unittest.TestCase): def testQFlagsOnQVariant(self): o = QObject() o.setProperty("foo", QIODevice.ReadOnly | QIODevice.WriteOnly) self.assertEqual(type(o.property("foo")), QIODevice.OpenMode) class QFlagsWrongType(unittest.TestCase): def testWrongType(self): '''Wrong type passed to QFlags binary operators''' self.assertRaises(TypeError, Qt.NoItemFlags | '43') self.assertRaises(TypeError, Qt.NoItemFlags & '43') self.assertRaises(TypeError, 'jabba' & Qt.NoItemFlags) self.assertRaises(TypeError, 'hut' & Qt.NoItemFlags) self.assertRaises(TypeError, Qt.NoItemFlags & QObject()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qhandle_test.py ================================================ #!/usr/bin/python '''Test cases for QEnum and QFlags''' import unittest from PySide.QtCore import QThread, Qt class TestHANDLE(unittest.TestCase): def testIntConversion(self): i = 0 h = QThread.currentThreadId() i = 0 + int(h) self.assertEqual(i, int(h)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qinstallmsghandler_test.py ================================================ '''Test cases for qInstallMsgHandler''' import unittest import sys from PySide.QtCore import * param = [] def handler(msgt, msg): global param param = [msgt, msg.strip()] def handleruseless(msgt, msg): pass class QInstallMsgHandlerTest(unittest.TestCase): def tearDown(self): # Ensure that next test will have a clear environment qInstallMsgHandler(None) def testNone(self): ret = qInstallMsgHandler(None) self.assertEqual(ret, None) def testRet(self): ret = qInstallMsgHandler(None) self.assertEqual(ret, None) refcount = sys.getrefcount(handleruseless) retNone = qInstallMsgHandler(handleruseless) self.assertEqual(sys.getrefcount(handleruseless), refcount + 1) rethandler = qInstallMsgHandler(None) self.assertEqual(rethandler, handleruseless) del rethandler self.assertEqual(sys.getrefcount(handleruseless), refcount) def testHandler(self): rethandler = qInstallMsgHandler(handler) qDebug("Test Debug") self.assertEqual(param[0], QtDebugMsg) self.assertEqual(param[1], "Test Debug") qWarning("Test Warning") self.assertEqual(param[0], QtWarningMsg) self.assertEqual(param[1], "Test Warning") qCritical("Test Critical") self.assertEqual(param[0], QtCriticalMsg) self.assertEqual(param[1], "Test Critical") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qlinef_test.py ================================================ #!/usr/bin/python '''Test cases for QLineF''' import unittest import os from PySide.QtCore import * class TestQLineF (unittest.TestCase): def testIntersect(self): l1 = QLineF(0, 0, 1, 0) l2 = QLineF(1, -1, 1, 1) tuple_ = l1.intersect(l2) self.assertEquals(tuple, tuple_.__class__) (value, p) = tuple_ self.assertEquals(QLineF.BoundedIntersection, value) self.assertEqual(QPointF(1, 0), p) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qlocale_test.py ================================================ #!/usr/bin/python '''Unit tests for QLocale''' import unittest import ctypes import sys from PySide.QtCore import QLocale class QLocaleTestToNumber(unittest.TestCase): def testToNumberInt(self): obj = QLocale(QLocale.C) self.assertEqual((37, True), obj.toInt('37')) def testToNumberFloat(self): obj = QLocale(QLocale.C) self.assertEqual((ctypes.c_float(37.109).value, True), obj.toFloat('37.109')) def testToNumberDouble(self): obj = QLocale(QLocale.C) self.assertEqual((ctypes.c_double(37.109).value, True), obj.toDouble('37.109')) def testToNumberShort(self): obj = QLocale(QLocale.C) self.assertEqual((ctypes.c_short(37).value, True), obj.toShort('37')) def testToNumberULongLong(self): obj = QLocale(QLocale.C) self.assertEqual((ctypes.c_ulonglong(37).value, True), obj.toULongLong('37')) def testToNumberULongLongNegative(self): obj = QLocale(QLocale.C) self.assert_(not obj.toULongLong('-37')[1]) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qmetaobject_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Tests for static methos conflicts with class methods''' import unittest from PySide.QtCore import * class Foo(QFile): pass class DynObject(QObject): def slot(self): pass class qmetaobject_test(unittest.TestCase): """ def test_QMetaObject(self): qobj = QObject() qobj_metaobj = qobj.metaObject() self.assertEqual(qobj_metaobj.className(), "QObject") obj = QFile() m = obj.metaObject() self.assertEqual(m.className(), "QFile") self.assertNotEqual(m.methodCount(), qobj_metaobj.methodCount()) obj = Foo() m = obj.metaObject() self.assertEqual(m.className(), "Foo") f = QFile() fm = f.metaObject() self.assertEqual(m.methodCount(), fm.methodCount()) """ def test_DynamicSlotSignal(self): o = DynObject() o2 = QObject() o.connect(o2, SIGNAL("bars()"), o.slot) self.assertTrue(o2.metaObject().indexOfMethod("bars()") > -1) #self.assertTrue(o.metaObject().indexOfMethod("bar()") == -1) #self.assertTrue(o.metaObject().indexOfMethod("slot()") > -1) #slot_index = o.metaObject().indexOfMethod("slot()") #o.connect(o, SIGNAL("foo()"), o2, SIGNAL("bar()")) #signal_index = o.metaObject().indexOfMethod("foo()"); #self.assert_(slot_index != signal_index) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qmodelindex_internalpointer_test.py ================================================ # -*- coding: utf-8 -*- ''' Test case for QAbstractListModel.createIndex and QModelIndex.internalPointer''' import sys import unittest from PySide.QtCore import * class MyModel (QAbstractListModel): pass class TestQModelIndexInternalPointer(unittest.TestCase): ''' Test case for QAbstractListModel.createIndex and QModelIndex.internalPointer''' def setUp(self): #Acquire resources self.model = MyModel() def tearDown(self): #Release resources del self.model def testInternalPointer(self): #Test QAbstractListModel.createIndex and #QModelIndex.internalPointer with regular #Python objects idx = self.model.createIndex(0, 0, "Hello") self.assertEqual("Hello", idx.internalPointer()) a = [1, 2, 3] idx = self.model.createIndex(0, 0, a) self.assertEqual(a, idx.internalPointer()) def testReferenceCounting(self): #Test reference counting when retrieving data with #QModelIndex.internalPointer a = [1, 2, 3] a_refcnt = sys.getrefcount(a) idx = self.model.createIndex(0, 0, a) ptr = idx.internalPointer() self.assertEqual(sys.getrefcount(a), a_refcnt + 1) def testIndexForDefaultDataArg(self): #Test QAbstractListModel.createIndex with a default #value for data argument idx = self.model.createIndex(0, 0) self.assertEqual(None, idx.internalPointer()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_children_segfault_test.py ================================================ '''Test cases for parent-child relationship''' import unittest from PySide.QtCore import QObject, QCoreApplication class ChildrenCoreApplication(unittest.TestCase): '''Test case for calling QObject.children after creating a QCoreApp''' def testQCoreAppChildren(self): #QObject.children() after creating a QCoreApplication # Minimal test: # 1- Create QCoreApp # 2- Create parent and childrens # 3- While keeping the children alive, call parent.children() # 4- Delete parent app = QCoreApplication([]) parent = QObject() children = [QObject(parent) for x in range(25)] # Uncomment the lines below to make the test pass # del children # del child2 del parent # XXX Segfaults here self.assert_(True) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_connect_notify_test.py ================================================ # -*- coding: utf-8 -*- ''' Test case for QObject::connectNotify()''' import unittest from PySide.QtCore import * from helper import UsesQCoreApplication def cute_slot(): pass class Obj(QObject): def __init__(self): QObject.__init__(self) self.con_notified = False self.dis_notified = False self.signal = "" def connectNotify(self, signal): self.con_notified = True self.signal = signal def disconnectNotify(self, signal): self.dis_notified = True def reset(self): self.con_notified = False self.dis_notified = False class TestQObjectConnectNotify(UsesQCoreApplication): '''Test case for QObject::connectNotify''' def setUp(self): UsesQCoreApplication.setUp(self) self.called = False def tearDown(self): UsesQCoreApplication.tearDown(self) def testBasic(self): sender = Obj() receiver = QObject() sender.connect(SIGNAL("destroyed()"), receiver, SLOT("deleteLater()")) self.assert_(sender.con_notified) self.assertEqual(sender.signal, SIGNAL("destroyed()")) sender.disconnect(SIGNAL("destroyed()"), receiver, SLOT("deleteLater()")) self.assert_(sender.dis_notified) def testPySignal(self): sender = Obj() receiver = QObject() sender.connect(SIGNAL("foo()"), receiver, SLOT("deleteLater()")) self.assert_(sender.con_notified) sender.disconnect(SIGNAL("foo()"), receiver, SLOT("deleteLater()")) self.assert_(sender.dis_notified) def testPySlots(self): sender = Obj() receiver = QObject() sender.connect(SIGNAL("destroyed()"), cute_slot) self.assert_(sender.con_notified) sender.disconnect(SIGNAL("destroyed()"), cute_slot) self.assert_(sender.dis_notified) def testpyAll(self): sender = Obj() receiver = QObject() sender.connect(SIGNAL("foo()"), cute_slot) self.assert_(sender.con_notified) sender.disconnect(SIGNAL("foo()"), cute_slot) self.assert_(sender.dis_notified) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_destructor.py ================================================ import sys import unittest from PySide import QtCore class MyObject(QtCore.QObject): def __init__(self, other=None): QtCore.QObject.__init__(self, None) self._o = other class TestDestructor(unittest.TestCase): def testReference(self): o = QtCore.QObject() m = MyObject(o) self.assertEqual(sys.getrefcount(o), 3) del m self.assertEqual(sys.getrefcount(o), 2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_event_filter_test.py ================================================ '''Test cases for QObject.eventFilter''' import unittest import weakref import sys from PySide.QtCore import QObject, QTimerEvent from helper import UsesQCoreApplication class FilterObject(QObject): '''Filter object for the basic test''' def __init__(self, obj=None, event_type=None, *args): #Creates a new filter object QObject.__init__(self, *args) self.obj = obj self.event_type = event_type self.events_handled = 0 self.events_bypassed = 0 def setTargetObject(self, obj): #Sets the object that will be filtered self.obj = obj def eventFilter(self, obj, event): '''Just checks if is the correct object and event type incrementing counter until reaching the limit. After that it stops filtering the events for the object.''' if (self.obj == obj): if isinstance(event, self.event_type) and self.events_handled < 5: self.events_handled += 1 return True else: self.events_bypassed += 1 return False else: return QObject.eventFilter(self, obj, event) class FilteredObject(QObject): '''Class that will be filtered. Quits the app after 5 timer events''' def __init__(self, app, *args): QObject.__init__(self, *args) self.app = app self.times_called = 0 def timerEvent(self, evt): #Overriden method self.times_called += 1 if self.times_called == 5: self.app.quit() class TestQObjectEventFilterPython(UsesQCoreApplication): '''QObject.eventFilter - Reimplemented in python Filters 5 TimerEvents and then bypasses the other events to the timerEvent method. After 5 runs, the timerEvent method will ask the core application to exit''' def setUp(self): #Acquire resources UsesQCoreApplication.setUp(self) self.obj_filter = FilterObject(event_type=QTimerEvent) def tearDown(self): #Release resources del self.obj_filter UsesQCoreApplication.tearDown(self) def testEventFilter(self): #QObject.eventFilter reimplemented in python filtered = FilteredObject(self.app) filtered.installEventFilter(self.obj_filter) self.obj_filter.setTargetObject(filtered) filtered.startTimer(0) self.app.exec_() self.assertEqual(filtered.times_called, 5) self.assertEqual(self.obj_filter.events_handled, 5) def testInstallEventFilterRefCountAfterDelete(self): '''Bug 910 - installEventFilter() increments reference count on target object http://bugs.pyside.org/show_bug.cgi?id=910''' obj = QObject() filt = QObject() self.assertEqual(sys.getrefcount(obj), 2) self.assertEqual(sys.getrefcount(filt), 2) obj.installEventFilter(filt) self.assertEqual(sys.getrefcount(obj), 2) self.assertEqual(sys.getrefcount(filt), 2) wref = weakref.ref(obj) del obj self.assertEqual(wref(), None) def testInstallEventFilterRefCountAfterRemove(self): # Bug 910 obj = QObject() filt = QObject() self.assertEqual(sys.getrefcount(obj), 2) self.assertEqual(sys.getrefcount(filt), 2) obj.installEventFilter(filt) self.assertEqual(sys.getrefcount(obj), 2) self.assertEqual(sys.getrefcount(filt), 2) obj.removeEventFilter(filt) self.assertEqual(sys.getrefcount(obj), 2) self.assertEqual(sys.getrefcount(filt), 2) wref = weakref.ref(obj) del obj self.assertEqual(wref(), None) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_inherits_test.py ================================================ '''Test cases for QObject methods''' import unittest from PySide.QtCore import QObject class InheritsCase(unittest.TestCase): '''Test case for QObject.inherits''' def testCppInheritance(self): #QObject.inherits() for c++ classes #An class inherits itself self.assert_(QObject().inherits('QObject')) def testPythonInheritance(self): #QObject.inherits() for python classes class Dummy(QObject): #Dummy class pass self.assert_(Dummy().inherits('QObject')) self.assert_(Dummy().inherits('Dummy')) self.assert_(not Dummy().inherits('FooBar')) def testPythonMultiInheritance(self): #QObject.inherits() for multiple inheritance # QObject.inherits(classname) should fail if classname isn't a # QObject subclass class Parent(object): #Dummy parent pass class Dummy(QObject, Parent): #Dummy class pass self.assert_(Dummy().inherits('QObject')) self.assert_(not Dummy().inherits('Parent')) def testSetAttributeBeforeCallingInitOnQObjectDerived(self): '''Test for bug #428.''' class DerivedObject(QObject): def __init__(self): self.member = 'member' QObject.__init__(self) obj0 = DerivedObject() # The second instantiation of DerivedObject will generate an exception # that will not come to surface immediately. obj1 = DerivedObject() # The mere calling of the object method causes # the exception to "reach the surface". obj1.objectName() def testMultipleInheritance(self): def declareClass(): class Foo(object, QObject): pass self.assertRaises(TypeError, declareClass) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_objectproperty_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Test case for the bug #378 http://bugs.openbossa.org/show_bug.cgi?id=378 ''' import unittest from PySide.QtCore import QObject class ExtQObject(QObject): def __init__(self): # "foobar" will become a object attribute that will not be # listed on the among the type attributes. Thus for bug # condition be correctly triggered the "foobar" attribute # must not previously exist in the parent class. self.foobar = None # The parent __init__ method must be called after the # definition of "self.foobar". QObject.__init__(self) class TestBug378(unittest.TestCase): '''Test case for the bug #378''' def testBug378(self): obj = ExtQObject() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_parent_test.py ================================================ '''Test cases for parent-child relationship''' import unittest from sys import getrefcount from PySide.QtCore import * class ParentRefCountCase(unittest.TestCase): '''Test case for the refcount changes of setParent''' def setUp(self): #Acquire resources self.parent = QObject() self.child = QObject() def tearDown(self): #Release resources del self.child del self.parent def testSetParent(self): #QObject.setParent() refcount changes self.assertEqual(getrefcount(self.child), 2) self.child.setParent(self.parent) self.assertEqual(getrefcount(self.child), 3) def testSetParentTwice(self): self.assertEqual(getrefcount(self.child), 2) self.child.setParent(self.parent) self.assertEqual(getrefcount(self.child), 3) self.child.setParent(self.parent) self.assertEqual(getrefcount(self.child), 3) def testConstructor(self): #QObject(QObject) refcount changes child = QObject(self.parent) self.assertEqual(getrefcount(child), 3) class ParentCase(unittest.TestCase): '''Small collection of tests related to parent-child relationship''' def testSetParent(self): #QObject.setParent() parent = QObject() child = QObject() child.setParent(parent) self.assertEqual(parent, child.parent()) def testParentConstructor(self): #QObject(parent) parent = QObject() child = QObject(parent) self.assertEqual(parent, child.parent()) orig_repr = repr(child) del child self.assertEqual(orig_repr, repr(parent.children()[0])) def testChildren(self): #QObject.children() parent = QObject() children = [QObject(parent) for x in range(25)] self.assertEqual(parent.children(), children) def testFindChild(self): #QObject.findChild() with all QObject parent = QObject() name = 'object%d' children = [QObject(parent) for i in range(20)] for i, child in enumerate(children): child.setObjectName(name % i) for i, child in enumerate(children): self.assertEqual(child, parent.findChild(QObject, name % i)) def testFindChildWithoutName(self): parent = QObject() name = 'object%d' children = [QObject(parent) for i in range(20)] for i, child in enumerate(children): child.setObjectName(name % i) child = parent.findChild(QObject) self.assertTrue(isinstance(child, QObject)) def testFindChildren(self): #QObject.findChildren() with all QObject parent = QObject() target_name = 'foo' children = [QTimer(parent) for i in range(20)] children.extend([QObject(parent) for i in range(20)]) for i, child in enumerate(children): if i % 5 == 0: child.setObjectName(target_name) else: child.setObjectName(str(i)) # Emulates findChildren with the intended outcome target_children = [x for x in children if x.objectName() == target_name] test_children = parent.findChildren(QObject, target_name) self.assertEqual(target_children, test_children) # test findChildren default value res = parent.findChildren(QTimer) self.assertEqual(len(res), 20) # test findChildre with a regex res = parent.findChildren(QObject, QRegExp("^fo+")) self.assertEqual(res, test_children) def testParentEquality(self): #QObject.parent() == parent parent = QObject() child = QObject(parent) self.assertEqual(parent, child.parent()) class TestParentOwnership(unittest.TestCase): '''Test case for Parent/Child object ownership''' def testParentDestructor(self): parent = QObject() self.assertEqual(getrefcount(parent), 2) child = QObject(parent) self.assertEqual(getrefcount(child), 3) self.assertEqual(getrefcount(parent), 2) del parent self.assertEqual(getrefcount(child), 2) # this will fail because parent deleted child cpp object self.assertRaises(RuntimeError, lambda :child.objectName()) # test parent with multiples children def testMultipleChildren(self): o = QObject() self.assertEqual(getrefcount(o), 2) c = QObject(o) self.assertEqual(getrefcount(c), 3) self.assertEqual(getrefcount(o), 2) c2 = QObject(o) self.assertEqual(getrefcount(o), 2) self.assertEqual(getrefcount(c), 3) self.assertEqual(getrefcount(c2), 3) del o self.assertEqual(getrefcount(c), 2) self.assertEqual(getrefcount(c2), 2) # this will fail because parent deleted child cpp object self.assertRaises(RuntimeError, lambda :c.objectName()) self.assertRaises(RuntimeError, lambda :c2.objectName()) # test recursive parent def testRecursiveParent(self): o = QObject() self.assertEqual(getrefcount(o), 2) c = QObject(o) self.assertEqual(getrefcount(c), 3) self.assertEqual(getrefcount(o), 2) c2 = QObject(c) self.assertEqual(getrefcount(o), 2) self.assertEqual(getrefcount(c), 3) self.assertEqual(getrefcount(c2), 3) del o self.assertEqual(getrefcount(c), 2) self.assertEqual(getrefcount(c2), 2) # this will fail because parent deleted child cpp object self.assertRaises(RuntimeError, lambda :c.objectName()) self.assertRaises(RuntimeError, lambda :c2.objectName()) # test parent transfer def testParentTransfer(self): o = QObject() self.assertEqual(getrefcount(o), 2) c = QObject() self.assertEqual(getrefcount(c), 2) c.setParent(o) self.assertEqual(getrefcount(c), 3) c.setParent(None) self.assertEqual(getrefcount(c), 2) del c del o class ExtQObject(QObject): def __init__(self): QObject.__init__(self) class ReparentingTest(unittest.TestCase): '''Test cases for reparenting''' def testParentedQObjectIdentity(self): object_list = [] parent = QObject() for i in range(3): obj = QObject() object_list.append(obj) obj.setParent(parent) for child in parent.children(): self.assertTrue(child in object_list) def testParentedExtQObjectType(self): object_list = [] parent = QObject() for i in range(3): obj = ExtQObject() object_list.append(obj) obj.setParent(parent) for orig, child in zip(object_list, parent.children()): self.assertEqual(type(orig), type(child)) def testReparentedQObjectIdentity(self): object_list = [] old_parent = QObject() new_parent = QObject() for i in range(3): obj = QObject() object_list.append(obj) obj.setParent(old_parent) for obj in object_list: obj.setParent(new_parent) for child in new_parent.children(): self.assertTrue(child in object_list) def testReparentedExtQObjectType(self): object_list = [] old_parent = QObject() new_parent = QObject() for i in range(3): obj = ExtQObject() object_list.append(obj) obj.setParent(old_parent) for obj in object_list: obj.setParent(new_parent) for orig, child in zip(object_list, new_parent.children()): self.assertEqual(type(orig), type(child)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_property_test.py ================================================ '''Test cases for QObject property and setProperty''' import unittest from PySide.QtCore import QObject, Property, Signal class MyObjectWithNotifyProperty(QObject): def __init__(self, parent=None): QObject.__init__(self, parent) self.p = 0 def readP(self): return self.p def writeP(self, v): self.p = v self.notifyP.emit() notifyP = Signal() myProperty = Property(int, readP, fset=writeP, notify=notifyP) class PropertyWithNotify(unittest.TestCase): def called(self): self.called_ = True def testNotify(self): self.called_ = False obj = MyObjectWithNotifyProperty() obj.notifyP.connect(self.called) obj.myProperty = 10 self.assert_(self.called_) def testHasProperty(self): o = MyObjectWithNotifyProperty() o.setProperty("myProperty", 10) self.assertEqual(o.myProperty, 10) self.assertEqual(o.property("myProperty"), 10) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_protected_methods_test.py ================================================ #!/usr/bin/python '''Test cases for QObject protected methods''' import unittest from PySide.QtCore import QObject, QThread, SIGNAL class Dummy(QObject): '''Dummy class''' pass class QObjectReceivers(unittest.TestCase): '''Test case for QObject.receivers()''' def cb(self, *args): #Dummy callback pass def testQObjectReceiversExtern(self): #QObject.receivers() - Protected method external access obj = Dummy() self.assertEqual(obj.receivers(SIGNAL("destroyed()")), 0) QObject.connect(obj, SIGNAL("destroyed()"), self.cb) self.assertEqual(obj.receivers(SIGNAL("destroyed()")), 1) def testQThreadReceiversExtern(self): #QThread.receivers() - Inherited protected method obj = QThread() self.assertEqual(obj.receivers(SIGNAL('destroyed()')), 0) QObject.connect(obj, SIGNAL("destroyed()"), self.cb) self.assertEqual(obj.receivers(SIGNAL("destroyed()")), 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Test cases for QObject methods''' import unittest import py3kcompat as py3k from PySide.QtCore import QObject class ObjectNameCase(unittest.TestCase): '''Tests related to QObject object name''' def testSimple(self): #QObject.objectName(string) name = 'object1' obj = QObject() obj.setObjectName(name) self.assertEqual(name, obj.objectName()) def testEmpty(self): #QObject.objectName('') name = '' obj = QObject() obj.setObjectName(name) self.assertEqual(name, obj.objectName()) def testDefault(self): #QObject.objectName() default obj = QObject() self.assertEqual('', obj.objectName()) def testUnicode(self): name = py3k.unicode_('não') #FIXME Strange error on upstream when using equal(name, obj) obj = QObject() obj.setObjectName(name) self.assertEqual(obj.objectName(), name) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_timer_event_test.py ================================================ #!/usr/bin/python '''Test case for QObject.timerEvent overloading''' import unittest from time import sleep from PySide.QtCore import QObject, QCoreApplication from helper import UsesQCoreApplication class Dummy(QObject): def __init__(self, app): super(Dummy, self).__init__() self.times_called = 0 self.app = app def timerEvent(self, event): QObject.timerEvent(self, event) event.accept() self.times_called += 1 if self.times_called == 5: self.app.exit(0) class QObjectTimerEvent(UsesQCoreApplication): def setUp(self): #Acquire resources super(QObjectTimerEvent, self).setUp() def tearDown(self): #Release resources super(QObjectTimerEvent, self).tearDown() def testTimerEvent(self): #QObject.timerEvent overloading obj = Dummy(self.app) timer_id = obj.startTimer(200) self.app.exec_() obj.killTimer(timer_id) self.assertEqual(obj.times_called, 5) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qobject_tr_as_instance_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Unit tests for QObject's tr and trUtf8 static methods.''' import os import unittest from PySide.QtCore import QObject #from helper import UsesQCoreApplication class QObjectTrTest(unittest.TestCase): '''Test case to check if QObject tr and trUtf8 static methods could be treated as instance methods.''' def setUp(self): self.obj = QObject() def tearDown(self): del self.obj def testTrCommonCase(self): #Test common case for QObject.tr invar1 = 'test1' outvar1 = self.obj.tr(invar1) invar2 = 'test2' outvar2 = self.obj.tr(invar2, 'test comment') self.assertEqual((invar1, invar2), (outvar1, outvar2)) def testTrAsInstanceMethod(self): #Test QObject.tr as instance invar1 = 'test1' outvar1 = QObject.tr(self.obj, invar1) invar2 = 'test2' outvar2 = QObject.tr(self.obj, invar2, 'test comment') self.assertEqual((invar1, invar2), (outvar1, outvar2)) def testTrUtf8CommonCase(self): #Test common case for QObject.trUtf8 invar1 = 'test1' outvar1 = self.obj.trUtf8(invar1) invar2 = 'test2' outvar2 = self.obj.trUtf8(invar2, 'test comment') self.assertEqual((invar1, invar2), (outvar1, outvar2)) def testTrUtf8AsInstanceMethod(self): #Test QObject.trUtf8 as instance invar1 = 'test1' outvar1 = QObject.trUtf8(self.obj, invar1) invar2 = 'test2' outvar2 = QObject.trUtf8(self.obj, invar2, 'test comment') self.assertEqual((invar1, invar2), (outvar1, outvar2)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qpoint_test.py ================================================ '''Test cases for QPoint and QPointF''' import unittest from PySide.QtCore import QPoint, QPointF class QPointTest(unittest.TestCase): def testQPointCtor(self): point = QPoint(QPoint(10,20)) class QPointFTest(unittest.TestCase): def testQPointFCtor(self): pointf = QPointF(QPoint(10,20)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qprocess_test.py ================================================ #!/usr/bin/python '''Test cases for QProcess''' import unittest import os import py3kcompat as py3k from PySide.QtCore import * class TestQProcess (unittest.TestCase): def testStartDetached(self): value, pid = QProcess.startDetached("dir", [], os.getcwd()) self.assertTrue(isinstance(value, bool)) self.assertTrue(isinstance(pid, py3k.long)) def testPid(self): p = QProcess() p.start("dir") p.waitForStarted() pid = p.pid() # We can't test the pid method result because it returns 0 when the # process isn't running if p.state() == QProcess.Running: self.assertNotEqual(pid, 0) else: print("PROCESS ALREADY DEAD :-/") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qproperty_decorator.py ================================================ import weakref import unittest from PySide.QtCore import QObject, Property class MyObject(QObject): def __init__(self): QObject.__init__(self) self._value = None @Property(int) def value(self): return self._value @value.setter def valueSet(self, value): self._value = value class PropertyTest(unittest.TestCase): def destroyCB(self, obj): self._obDestroyed = True def testDecorator(self): self._obDestroyed = False o = MyObject() weak = weakref.ref(o, self.destroyCB) o.value = 10 self.assertEqual(o._value, 10) self.assertEqual(o.value, 10) del o self.assertTrue(self._obDestroyed) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qrect_test.py ================================================ #!/usr/bin/python '''Test cases for QRect''' import unittest from PySide.QtCore import QPoint, QRect, QRectF class RectConstructor(unittest.TestCase): def testDefault(self): #QRect() obj = QRect() self.assert_(obj.isNull()) def testConstructorQPoint(self): topLeft = QPoint(3, 0) bottomRight = QPoint(0, 3) rect1 = QRect(topLeft, bottomRight) rect2 = QRect(topLeft, bottomRight) self.assertEqual(rect1, rect2) class RectOperator(unittest.TestCase): '''Test case for QRect operators''' def testEqual(self): '''QRect == QRect Note: operator == must be working as it's the main check for correctness''' rect1 = QRect() rect2 = QRect() self.assertEqual(rect1, rect2) rect1 = QRect(0, 4, 100, 300) rect2 = QRect(0, 4, 100, 300) self.assertEqual(rect1, rect2) def testNullRectIntersection(self): #QRect & QRect for null rects rect1 = QRect() rect2 = QRect() rect3 = rect1 & rect2 self.assertEqual(rect3, rect1) self.assertEqual(rect3, rect2) def testNoIntersect(self): '''QRect & QRect for non-intersecting QRects Non-intersecting QRects return a 'null' QRect for operator &''' rect1 = QRect(10, 10, 5, 5) rect2 = QRect(20, 20, 5, 5) rect3 = rect1 & rect2 self.assertEqual(rect3, QRect()) def testIntersectPartial(self): #QRect & QRect for partial intersections rect1 = QRect(10, 10, 10, 10) rect2 = QRect(15, 15, 10, 10) rect3 = rect1 & rect2 self.assertEqual(rect3, QRect(15, 15, 5, 5)) def testIntersetEnclosed(self): #QRect & QRect for a qrect inside another rect1 = QRect(10, 10, 20, 20) rect2 = QRect(15, 15, 5, 5) rect3 = rect1 & rect2 self.assertEqual(rect3, rect2) def testNullRectIntersectBounding(self): #QRect | QRect for null rects rect1 = QRect() rect2 = QRect() rect3 = rect1 & rect2 self.assertEqual(rect3, rect1) self.assertEqual(rect3, rect2) def testNoIntersectBounding(self): '''QRect | QRect for non-intersecting QRects Non-intersecting QRects return a greater QRect for operator |''' rect1 = QRect(10, 10, 5, 5) rect2 = QRect(20, 20, 5, 5) rect3 = rect1 | rect2 self.assertEqual(rect3, QRect(10, 10, 15, 15)) def testBoundingPartialIntersection(self): #QRect | QRect for partial intersections rect1 = QRect(10, 10, 10, 10) rect2 = QRect(15, 15, 10, 10) rect3 = rect1 | rect2 self.assertEqual(rect3, QRect(10, 10, 15, 15)) def testBoundingEnclosed(self): #QRect | QRect for a qrect inside another rect1 = QRect(10, 10, 20, 20) rect2 = QRect(15, 15, 5, 5) rect3 = rect1 | rect2 self.assertEqual(rect3, rect1) def testGetCoordsAndRect(self): rect1 = QRect(1, 2, 3, 4) self.assertEqual(rect1.getRect(), (1, 2, 3, 4)) self.assertEqual(rect1.getCoords(), (1, 2, 3, 5)) rect1 = QRectF(1, 2, 3, 4) self.assertEqual(rect1.getRect(), (1, 2, 3, 4)) self.assertEqual(rect1.getCoords(), (1, 2, 4, 6)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qregexp_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtCore import QRegExp class QRegExpTest(unittest.TestCase): def testReplace1(self): re = QRegExp('a[mn]') string = re.replace('Banana', 'ox') self.assertEqual(string, 'Boxoxa') def testReplace2(self): re = QRegExp('([^<]*)') string = re.replace('A bon mot.', '\\emph{\\1}') self.assertEqual(string, 'A \\emph{bon mot}.') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qresource_test.py ================================================ # -*- coding: utf-8 -*- '''Test cases for QResource usage''' import unittest from helper import adjust_filename from PySide.QtCore import QFile, QIODevice import resources_mc class ResourcesUsage(unittest.TestCase): '''Test case for resources usage''' def testPhrase(self): #Test loading of quote.txt resource f = open(adjust_filename('quoteEnUS.txt', __file__), "r") orig = f.read() f.close() f = QFile(':/quote.txt') f.open(QIODevice.ReadOnly) #|QIODevice.Text) print("Error:", f.errorString()) copy = f.readAll() f.close() self.assertEqual(orig, copy) def testImage(self): #Test loading of sample.png resource f = open(adjust_filename('sample.png', __file__), "rb") orig = f.read() f.close() f = QFile(':/sample.png') f.open(QIODevice.ReadOnly) copy = f.readAll() f.close() self.assertEqual(len(orig), len(copy)) self.assertEqual(orig, copy) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qsize_test.py ================================================ #!/usr/bin/python '''Unit tests for QSize''' import unittest from PySide.QtCore import QSize class QSizeOperator(unittest.TestCase): def testOperatorMultiply(self): #QSize operator * float # bug 131 a = QSize(1, 1) x = a * 3.4 self.assertEqual(QSize(3, 3), x) def testOperatorRevertedMultiply(self): #QSize operator * float, reverted # bug 132 a = QSize(1, 1) x = 3.4 * a self.assertEqual(QSize(3, 3), x) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qslot_object_test.py ================================================ #!/usr/bin/python import unittest from PySide import QtCore global qApp class objTest(QtCore.QObject): def __init__(self, parent=None): QtCore.QObject.__init__(self, parent) self.ok = False def slot(self): global qApp self.ok = True qApp.quit() class slotTest(unittest.TestCase): def quit_app(self): global qApp qApp.quit() def testBasic(self): global qApp timer = QtCore.QTimer() timer.setInterval(100) my_obj = objTest() my_slot = QtCore.SLOT("slot()") QtCore.QObject.connect(timer, QtCore.SIGNAL("timeout()"), my_obj, my_slot) timer.start(100) QtCore.QTimer.singleShot(1000, self.quit_app) qApp.exec_() self.assert_(my_obj.ok) if __name__ == '__main__': global qApp qApp = QtCore.QCoreApplication([]) unittest.main() ================================================ FILE: tests/QtCore/qsrand_test.py ================================================ import gc import unittest from PySide.QtCore import qsrand class OverflowExceptionCollect(unittest.TestCase): '''Test case for OverflowError exception during garbage collection. See bug #147''' def testOverflow(self): # NOTE: PyQt4 raises TypeError, but boost.python raises OverflowError self.assertRaises(OverflowError, qsrand, 42415335332353253) # should not abort if bug #147 is fixed gc.collect() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qstate_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtCore import * class QStateTest(unittest.TestCase): def testBasic(self): app = QCoreApplication([]) o = QObject() o.setProperty("text", "INdT") machine = QStateMachine() s1 = QState() s1.assignProperty(o, "text", "Rocks"); s2 = QFinalState() t = s1.addTransition(o, SIGNAL("change()"), s2); self.assert_(isinstance(t, QSignalTransition)) machine.addState(s1) machine.addState(s2) machine.setInitialState(s1) machine.start() o.emit(SIGNAL("change()")) QTimer.singleShot(100, app.quit) app.exec_() txt = o.property("text") self.assert_(txt, "Rocks") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qstatemachine_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtCore import QObject, QState, QFinalState, SIGNAL from PySide.QtCore import QTimer, QStateMachine from PySide.QtCore import QParallelAnimationGroup from helper import UsesQCoreApplication class StateMachineTest(unittest.TestCase): '''Check presence of State Machine classes''' def testBasic(self): '''State machine classes''' import PySide.QtCore PySide.QtCore.QSignalTransition PySide.QtCore.QPropertyAnimation class QStateMachineTest(UsesQCoreApplication): def cb(self, *args): self.assertEqual(self.machine.defaultAnimations(), [self.anim]) def testBasic(self): self.machine = QStateMachine() s1 = QState() s2 = QState() s3 = QFinalState() QObject.connect(self.machine, SIGNAL("started()"), self.cb) self.anim = QParallelAnimationGroup() self.machine.addState(s1) self.machine.addState(s2) self.machine.addState(s3) self.machine.setInitialState(s1) self.machine.addDefaultAnimation(self.anim) self.machine.start() QTimer.singleShot(100, self.app.quit) self.app.exec_() class QSetConverterTest(UsesQCoreApplication): '''Test converter of QSet toPython using QStateAnimation.configuration''' def testBasic(self): '''QStateMachine.configuration converting QSet to python set''' machine = QStateMachine() s1 = QState() machine.addState(s1) machine.setInitialState(s1) machine.start() QTimer.singleShot(100, self.app.quit) self.app.exec_() configuration = machine.configuration() self.assert_(isinstance(configuration, set)) self.assert_(s1 in configuration) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qstring_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Test cases for QString''' import unittest import py3kcompat as py3k from PySide.QtCore import QObject class QStringConstructor(unittest.TestCase): '''Test case for QString constructors''' def testQStringDefault(self): obj = QObject() obj.setObjectName('foo') self.assertEqual(obj.objectName(), py3k.unicode_('foo')) obj.setObjectName(py3k.unicode_('áâãà')) self.assertEqual(obj.objectName(), py3k.unicode_('áâãà')) obj.setObjectName(None) self.assertEqual(obj.objectName(), py3k.unicode_('')) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qsysinfo_test.py ================================================ import unittest from PySide.QtCore import QSysInfo class TestQSysInfo(unittest.TestCase): def testEnumEndian(self): self.assertEqual(QSysInfo.BigEndian, 0) self.assertEqual(QSysInfo.LittleEndian, 1) self.assert_(QSysInfo.ByteOrder > -1) def testEnumSizes(self): self.assert_(QSysInfo.WordSize > 0) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qtext_codec_test.py ================================================ import gc import unittest from PySide.QtCore import QTextCodec class TestCodecGetters(unittest.TestCase): def testCodecsNames(self): for codec_name in QTextCodec.availableCodecs(): codec = QTextCodec.codecForName(codec_name) self.assert_(type(codec), QTextCodec) def testCodecsMibs(self): for codec_num in QTextCodec.availableMibs(): codec = QTextCodec.codecForMib(codec_num) self.assert_(type(codec), QTextCodec) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qtextstream_test.py ================================================ '''Unit tests for QTextStream''' import unittest import py3kcompat as py3k from PySide.QtCore import QByteArray, QTextStream, QIODevice, QTextCodec, QFile class QTextStreamShiftTest(unittest.TestCase): def setUp(self): self.ba = QByteArray() self.read = QTextStream(self.ba, QIODevice.ReadOnly) self.write = QTextStream(self.ba, QIODevice.WriteOnly) def testNumber(self): '''QTextStream << number''' self.write << '4' self.write.flush() res = self.read.readLine() self.assertTrue(isinstance(res, py3k.unicode)) self.assertEqual(res, '4') class QTextStreamGetSet(unittest.TestCase): def setUp(self): self.obj = QTextStream() def testCodec(self): '''QTextStream set/get Codec''' codec = QTextCodec.codecForName('ISO8859-1') self.obj.setCodec(codec) self.assertEqual(codec, self.obj.codec()) def testDevice(self): '''QTextStream get/set Device''' device = QFile() self.obj.setDevice(device) self.assertEqual(device, self.obj.device()) self.obj.setDevice(None) self.assertEqual(None, self.obj.device()) class QTextStreamInitialization(unittest.TestCase): def testConstruction(self): '''QTextStream construction''' obj = QTextStream() self.assertEqual(obj.codec(), QTextCodec.codecForLocale()) self.assertEqual(obj.device(), None) self.assertEqual(obj.string(), None) self.assertTrue(obj.atEnd()) self.assertEqual(obj.readAll(), '') class QTextStreamReadLinesFromDevice(unittest.TestCase): def _check_data(self, data_set): for data, lines in data_set: stream = QTextStream(data) res = [] while not stream.atEnd(): res.append(stream.readLine()) self.assertEqual(res, lines) def testLatin1(self): '''QTextStream readLine for simple Latin1 strings''' data = [] data.append((QByteArray(), [])) data.append((QByteArray('\n'), [''])) data.append((QByteArray('\r\n'), [''])) data.append((QByteArray('ole'), ['ole'])) data.append((QByteArray('ole\n'), ['ole'])) data.append((QByteArray('ole\r\n'), ['ole'])) data.append((QByteArray('ole\r\ndole\r\ndoffen'), ['ole', 'dole', 'doffen'])) self._check_data(data) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qthread_prod_cons_test.py ================================================ #!/usr/bin/python '''Producer-Consumer test/example with QThread''' import unittest from random import random import logging logging.basicConfig(level=logging.WARNING) from PySide.QtCore import QThread, QCoreApplication, QObject, SIGNAL class Bucket(QObject): '''Dummy class to hold the produced values''' def __init__(self, max_size=10, *args): #Constructor which receives the max number of produced items super(Bucket, self).__init__(*args) self.data = [] self.max_size = 10 def pop(self): #Retrieves an item return self.data.pop(0) def push(self, data): #Pushes an item self.data.append(data) class Producer(QThread): '''Producer thread''' def __init__(self, bucket, *args): #Constructor. Receives the bucket super(Producer, self).__init__(*args) self.runs = 0 self.bucket = bucket self.production_list = [] def run(self): #Produces at most bucket.max_size items while self.runs < self.bucket.max_size: value = int(random()*10) % 10 self.bucket.push(value) self.production_list.append(value) logging.debug('PRODUCER - pushed %d' % value) self.runs += 1 self.msleep(5) class Consumer(QThread): '''Consumer thread''' def __init__(self, bucket, *args): #Constructor. Receives the bucket super(Consumer, self).__init__(*args) self.runs = 0 self.bucket = bucket self.consumption_list = [] def run(self): #Consumes at most bucket.max_size items while self.runs < self.bucket.max_size: try: value = self.bucket.pop() self.consumption_list.append(value) logging.debug('CONSUMER - got %d' % value) self.runs += 1 except IndexError: logging.debug('CONSUMER - empty bucket') self.msleep(5) class ProducerConsumer(unittest.TestCase): '''Basic test case for producer-consumer QThread''' def setUp(self): #Create fixtures self.app = QCoreApplication([]) def tearDown(self): #Destroy fixtures del self.app def finishCb(self): #Quits the application self.app.exit(0) def testProdCon(self): #QThread producer-consumer example bucket = Bucket() prod = Producer(bucket) cons = Consumer(bucket) prod.start() cons.start() QObject.connect(prod, SIGNAL('finished()'), self.finishCb) QObject.connect(cons, SIGNAL('finished()'), self.finishCb) self.app.exec_() prod.wait() cons.wait() self.assertEqual(prod.production_list, cons.consumption_list) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qthread_signal_test.py ================================================ '''Test cases for connecting signals between threads''' import unittest from PySide.QtCore import QThread, QObject, SIGNAL, QCoreApplication thread_run = False class Source(QObject): def __init__(self, *args): QObject.__init__(self, *args) def emit_sig(self): self.emit(SIGNAL('source()')) class Target(QObject): def __init__(self, *args): QObject.__init__(self, *args) self.called = False def myslot(self): self.called = True class ThreadJustConnects(QThread): def __init__(self, source, *args): QThread.__init__(self, *args) self.source = source self.target = Target() def run(self): global thread_run thread_run = True QObject.connect(self.source, SIGNAL('source()'), self.target.myslot) while not self.target.called: pass class BasicConnection(unittest.TestCase): def testEmitOutsideThread(self): global thread_run app = QCoreApplication([]) source = Source() thread = ThreadJustConnects(source) QObject.connect(thread, SIGNAL('finished()'), lambda: app.exit(0)) thread.start() while not thread_run: pass source.emit_sig() app.exec_() thread.wait() self.assert_(thread.target.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qthread_test.py ================================================ #!/usr/bin/python '''Test cases for QThread''' import unittest from PySide.QtCore import QThread, QCoreApplication, QObject, SIGNAL, QMutex, QTimer from PySide.QtCore import QEventLoop from helper import UsesQCoreApplication mutex = QMutex() class Dummy(QThread): '''Dummy thread''' def __init__(self, *args): super(Dummy, self).__init__(*args) self.called = False def run(self): #Start-quit sequence self.qobj = QObject() mutex.lock() self.called = True mutex.unlock() class QThreadSimpleCase(UsesQCoreApplication): def setUp(self): UsesQCoreApplication.setUp(self) self.called = False def tearDown(self): UsesQCoreApplication.tearDown(self) def testThread(self): #Basic QThread test obj = Dummy() obj.start() obj.wait() self.assert_(obj.called) def cb(self, *args): self.called = True #self.exit_app_cb() def abort_application(self): self._thread.terminate() self.app.quit() def testSignalFinished(self): #QThread.finished() (signal) obj = Dummy() QObject.connect(obj, SIGNAL('finished()'), self.cb) mutex.lock() obj.start() mutex.unlock() self._thread = obj QTimer.singleShot(1000, self.abort_application) self.app.exec_() self.assert_(self.called) def testSignalStarted(self): #QThread.started() (signal) obj = Dummy() QObject.connect(obj, SIGNAL('started()'), self.cb) obj.start() self._thread = obj QTimer.singleShot(1000, self.abort_application) self.app.exec_() self.assertEqual(obj.qobj.thread(), obj) # test QObject.thread() method self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qtimer_singleshot_test.py ================================================ #!/usr/bin/python '''Test cases for QTimer.singleShot''' import unittest from PySide.QtCore import QObject, QTimer, QCoreApplication, Signal from helper import UsesQCoreApplication class WatchDog(QObject): '''Exits the QCoreApplication main loop after sometime.''' def __init__(self, watched): QObject.__init__(self) self.times_called = 0 self.watched = watched def timerEvent(self, evt): self.times_called += 1 if self.times_called == 20: self.watched.exit_app_cb() class TestSingleShot(UsesQCoreApplication): '''Test case for QTimer.singleShot''' def setUp(self): #Acquire resources UsesQCoreApplication.setUp(self) self.watchdog = WatchDog(self) self.called = False def tearDown(self): #Release resources del self.watchdog del self.called UsesQCoreApplication.tearDown(self) def callback(self): self.called = True self.app.quit() def testSingleShot(self): QTimer.singleShot(100, self.callback) self.app.exec_() self.assert_(self.called) class SigEmitter(QObject): sig1 = Signal() class TestSingleShotSignal(UsesQCoreApplication): '''Test case for QTimer.singleShot connecting to signals''' def setUp(self): UsesQCoreApplication.setUp(self) self.watchdog = WatchDog(self) self.called = False def tearDown(self): del self.watchdog del self.called UsesQCoreApplication.tearDown(self) def callback(self): self.called = True self.app.quit() def testSingleShotSignal(self): emitter = SigEmitter() emitter.sig1.connect(self.callback) QTimer.singleShot(100, emitter.sig1) self.app.exec_() self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qtimer_timeout_test.py ================================================ '''Test case for timeout() signals from QTimer object.''' import unittest import os import sys from tempfile import mkstemp from PySide.QtCore import QObject, QTimer, SIGNAL from helper import UsesQCoreApplication class WatchDog(QObject): '''Exits the QCoreApplication main loop after sometime.''' def __init__(self, watched): QObject.__init__(self) self.times_called = 0 self.watched = watched def timerEvent(self, evt): self.times_called += 1 if self.times_called == 20: self.watched.exit_app_cb() class TestTimeoutSignal(UsesQCoreApplication): '''Test case to check if the signals are really being caught''' def setUp(self): #Acquire resources UsesQCoreApplication.setUp(self) self.watchdog = WatchDog(self) self.timer = QTimer() self.called = False def tearDown(self): #Release resources del self.watchdog del self.timer del self.called UsesQCoreApplication.tearDown(self) def callback(self, *args): #Default callback self.called = True def testTimeoutSignal(self): #Test the QTimer timeout() signal refCount = sys.getrefcount(self.timer) QObject.connect(self.timer, SIGNAL('timeout()'), self.callback) self.timer.start(4) self.watchdog.startTimer(10) self.app.exec_() self.assert_(self.called) self.assertEqual(sys.getrefcount(self.timer), refCount) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/qtnamespace_test.py ================================================ #!/usr/bin/python '''Test suite for QtCore.Qt namespace''' import unittest from PySide.QtCore import Qt class QtNamespace(unittest.TestCase): '''Test case for accessing attributes from Qt namespace''' def testBasic(self): #Access to Qt namespace getattr(Qt, 'Horizontal') getattr(Qt, 'WindowMaximizeButtonHint') self.assert_(True) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/quoteEnUS.txt ================================================ Fine! Dishonor! Dishonor on you, dishonor on ya cow! ================================================ FILE: tests/QtCore/qurl_test.py ================================================ #!/usr/bin/python '''Test suite for QtCore.QUrl''' import unittest from PySide.QtCore import QUrl class QUrlBasicConstructor(unittest.TestCase): '''Tests the basic constructors''' def testBasic(self): #Default constructor for QUrl url = QUrl() self.assertEqual(url.toString(), "") def testSetAttributes(self): #Construct QUrl by set* methods url = QUrl() url.setScheme('ftp') self.assertEqual(url.toString(), 'ftp:') url.setHost('www.google.com') self.assertEqual(url.toString(), 'ftp://www.google.com') url.setPort(8080) self.assertEqual(url.toString(), 'ftp://www.google.com:8080') url.setPath('mail/view') self.assertEqual(url.toString(), 'ftp://www.google.com:8080/mail/view') url.setUserName('john') self.assertEqual(url.toString(), 'ftp://john@www.google.com:8080/mail/view') url.setPassword('abc123') self.assertEqual(url.toString(), 'ftp://john:abc123@www.google.com:8080/mail/view') class QueryItemsTest(unittest.TestCase): '''Test query item management''' def testQueryItems(self): #QUrl.queryItems url = QUrl('http://www.google.com/search?q=python&hl=en') valid_data = [(('q'), ('python')), (('hl'), ('en'))] self.assertEqual(sorted(url.queryItems()), sorted(valid_data)) def testEncodedQueryItems(self): #QUrl.encodedQueryItems url = QUrl('http://www.google.com/search?q=python&hl=en') valid_data = [(('q'), ('python')), (('hl'), ('en'))] self.assertEqual(sorted(url.encodedQueryItems()), sorted(valid_data)) def testSetQueryItems(self): #QUrl.setQueryItems urla = QUrl('http://www.google.com/search?q=python&hl=en') urlb = QUrl('http://www.google.com/search') urlb.setQueryItems(urla.queryItems()) self.assertEqual(urla, urlb) def testAddQueryItem(self): #QUrl.addQueryItem url = QUrl() valid_data = [('hl', 'en'), ('user', 'konqui')] url.addQueryItem(*valid_data[0]) self.assertEqual(url.queryItems()[0], valid_data[0]) url.addQueryItem(*valid_data[1]) self.assertEqual(sorted(url.queryItems()), sorted(valid_data)) def testAllEncodedQueryItemsValues(self): #QUrl.allEncodedQueryItemValues url = QUrl() key = 'key' valid_data = ['data', 'valid', 'test'] for i, data in enumerate(valid_data): url.addQueryItem(key, data) self.assertEqual(url.allEncodedQueryItemValues(key), list(valid_data[:i+1])) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/repr_test.py ================================================ import PySide import unittest from PySide.QtCore import QByteArray, QDate, QDateTime, QTime, QLine, QLineF from PySide.QtCore import Qt, QSize, QSizeF, QRect, QRectF, QPoint, QPointF from PySide.QtCore import QUuid class ReprCopyHelper: def testCopy(self): copy = eval(self.original.__repr__()) self.assert_(copy is not self.original) self.assertEqual(copy, self.original) class QByteArrayReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QByteArray('the quick brown fox jumps over the lazy dog') class QDateReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QDate(2010, 11, 22) class QTimeReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QTime(11, 37, 55, 692) class QDateTimeReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QDateTime(2010, 5, 18, 10, 24, 45, 223, Qt.LocalTime) class QSizeReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QSize(42, 190) class QSizeFReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QSizeF(42.7, 190.2) class QRectReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QRect(100, 200, 300, 400) class QRectFReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QRectF(100.33, 200.254, 300.321, 400.123) class QLineReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QLine(1, 2, 3, 4) class QLineFReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QLineF(1.1, 2.2, 3.3, 4.4) class QPointReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QPoint(1, 2) class QPointFReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QPointF(1.1, 2.2) class QUuiCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QUuid("67C8770B-44F1-410A-AB9A-F9B5446F13EE") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/resources.qrc ================================================ quoteEnUS.txt sample.png ================================================ FILE: tests/QtCore/resources_mc.py ================================================ # -*- coding: utf-8 -*- # Resource object code # # Created: Thu Feb 3 16:09:36 2011 # by: The Resource Compiler for PySide (Qt v4.6.3) # # WARNING! All changes made in this file will be lost! from PySide import QtCore qt_resource_data = b"""\ \x00\x00\x00\x35\ \x46\ \x69\x6e\x65\x21\x20\x44\x69\x73\x68\x6f\x6e\x6f\x72\x21\x20\x44\ \x69\x73\x68\x6f\x6e\x6f\x72\x20\x6f\x6e\x20\x79\x6f\x75\x2c\x20\ \x64\x69\x73\x68\x6f\x6e\x6f\x72\x20\x6f\x6e\x20\x79\x61\x20\x63\ \x6f\x77\x21\x0a\ \x00\x00\xda\x88\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\xb1\x00\x00\x00\xd2\x08\x06\x00\x00\x00\x05\x49\x21\x31\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xda\x03\x0a\ \x0c\x02\x2e\xb0\x96\x99\x74\x00\x00\x00\x19\x74\x45\x58\x74\x43\ \x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\x77\ \x69\x74\x68\x20\x47\x49\x4d\x50\x57\x81\x0e\x17\x00\x00\x20\x00\ \x49\x44\x41\x54\x78\xda\x94\xbd\xd9\xaf\x24\xd9\x7a\xdd\xf7\x8b\ \x21\x33\x77\x44\xe4\x9c\xa7\xaa\xcf\xa9\xb1\xab\x87\x6b\xf2\x92\ \xd4\x15\x49\x0b\x84\x64\xd9\x22\x64\x3f\xd8\x30\x0c\xd8\x8f\x34\ \xfc\x68\x43\x7f\x8b\xfe\x04\x02\x06\xfc\x64\xbf\xd1\x06\x04\x13\ \x7a\x30\x65\x59\x04\x4d\x03\xa4\x48\xba\x29\xf9\x72\xb8\xdd\x5d\ \x55\x5d\xc3\x39\x75\xea\x9c\x9c\x23\xf6\xce\xcc\x18\xfc\xb0\x87\ \x88\xc8\xcc\x6a\xd9\xd9\x68\x44\xce\x79\x2a\x73\xc5\x8a\xb5\xd7\ \xb7\xbe\x2f\xbc\xdf\xff\x17\xbf\x57\x09\x00\x15\x82\xc8\x29\x89\ \xb0\x97\x24\xaa\x90\x52\x51\x12\x91\x44\x95\xb9\x37\x42\x56\x1e\ \x91\x97\x91\x4a\xcf\x3d\x27\x8a\x04\x12\x1a\xaf\xd6\xcf\x45\x54\ \xa0\x3c\x7e\xfc\x22\xeb\xe7\x9b\xeb\xfa\xbd\xea\xdb\x08\x01\x4a\ \x01\x11\x42\x54\x28\xe5\xe9\x2d\x20\xc0\xdd\x6e\x5e\xdc\x7d\x4a\ \x02\x7d\x2a\xd1\x73\x8f\x79\x6a\x07\xa2\xa0\x22\xd6\xd7\x81\x24\ \xdb\xe3\x8d\x87\xad\xf7\xc8\xe3\x12\x80\x30\xf3\xc9\xe3\x92\x30\ \xf3\x09\x63\x81\x22\x43\x10\x03\x99\x79\x66\x6c\xfe\xce\x12\x94\ \x5f\xbf\xc1\xd1\xed\x38\x28\xf4\xfb\x85\x11\x79\x2e\xf1\x37\x7d\ \xb6\xb1\xe4\x61\x76\xe0\xf6\xe5\x82\xc3\x04\x46\xe3\x01\x00\x7d\ \x42\xb6\xe4\x4c\xbd\x31\xd5\x70\xc3\xc6\xef\x33\x28\xb7\x78\xeb\ \x01\xeb\x47\x01\x09\x3d\x52\x76\x24\xe8\x7f\x57\x90\x29\x3a\x71\ \x0f\x45\xfd\x7d\x77\x85\x60\xaf\xd4\xc9\x37\x2e\x44\x81\x52\x01\ \x82\x0a\x85\x87\xcc\x04\xdf\x7e\xbc\x67\x1c\x06\xfa\xfb\x99\x54\ \xcc\x98\x50\x72\x4f\x12\x27\x88\x69\x42\x99\x15\x27\xef\xe3\xc7\ \x41\xeb\xfe\xbd\x52\xc8\x4c\x00\x50\x72\x8f\xcf\x8c\x49\x2c\x29\ \x45\x84\x1f\x07\x54\x9d\x11\xde\x61\xa5\x1f\xcf\x0a\x56\x73\xb8\ \x5b\xbc\xa4\x5a\xae\x4f\xde\xdb\x1b\x0f\x19\x52\xf1\xd9\xe3\x11\ \x4c\x1f\x52\x75\x46\x27\xcf\x79\xf4\xe8\x6b\x42\xfd\x63\x07\x20\ \x72\x50\x01\xb0\xa7\x2b\xba\xec\x91\xec\xa5\x06\x88\xaf\x0e\x48\ \x72\x03\x18\x0d\xea\x14\x8f\x3d\x12\x64\xc4\x1e\x40\xda\xfb\x61\ \x8f\x44\x00\x25\x5e\x8d\x4f\xc0\x47\x52\x12\x31\x2c\x3d\xd6\x7e\ \xe5\x6e\x83\x47\x15\x65\x78\xd2\xc3\x8f\xa0\x94\xfa\x47\x90\x91\ \xa4\xb4\x3b\x8a\x52\x06\xd2\x12\x94\x05\xa9\xbe\x47\x99\x5d\x47\ \x35\x76\x16\x0b\x68\x0d\xe4\x08\xa5\x4a\x03\x66\xe8\x09\xfd\xfc\ \xca\x00\xaf\x12\x3d\xfa\xf3\x0d\x69\xdc\xa5\xf2\xf5\xeb\x06\xa5\ \xc7\xc6\xaf\x18\x64\x3e\x79\x2c\xd0\x1f\x1a\x93\xc7\x10\x02\x82\ \xb8\x01\xe4\x06\x58\x9b\x00\x06\x8a\x2a\x26\x40\x11\x67\x92\x2c\ \x8e\xc8\x8a\x80\xa2\x27\x98\x50\xd6\xc0\xce\x24\x19\x53\x1e\xbe\ \x80\x2d\x39\x7d\x42\xd4\x7c\x05\xd3\x11\x7d\x42\xf6\xd5\x16\x56\ \x1e\x83\xd1\x96\xd5\x6a\x44\x39\xd8\x32\xe2\x82\x42\x1c\x10\xf8\ \xa0\x34\x80\x01\x14\x1e\x5d\x21\xda\x80\xa5\xa2\x14\x91\x03\x73\ \x57\x08\x94\x52\xee\x7e\x94\xe2\x2f\x6e\x7e\xce\x24\xeb\xc3\x64\ \x48\x31\x9a\x10\x2c\x16\x94\x13\x0d\xc2\xae\xf8\x34\xfd\x34\x01\ \x5c\x55\x63\xba\x62\x09\x68\x20\xfb\xcc\xea\xbf\xc9\x3e\x7f\x59\ \x12\x24\xf5\x0e\xc0\xbc\x60\xbb\x08\x48\x3c\x48\xab\x09\x89\xb7\ \x00\x20\x8d\xbb\x24\xcb\x35\x98\x1d\x1a\xc0\x3b\xac\x5a\x40\xf6\ \x0e\x2b\x92\x7e\x07\xfd\x8d\x0b\xf3\x87\x88\x02\x44\x41\xa6\xe6\ \x35\x9b\x01\x4a\xe4\x1a\xe8\xe6\xf6\x1e\xc9\x1e\x49\xd7\x80\xa7\ \x4b\x64\x71\x85\xdf\x40\xed\xbe\x71\xbd\x06\x2c\x6c\xfd\xcc\xec\ \xa9\x91\x7b\xcc\x93\xb1\x7e\x8e\xf4\xf0\x0d\xeb\x5b\x30\xa7\xd2\ \x03\xa9\xdc\xbb\xc9\x06\x5f\xcb\x16\x9b\xd7\xcf\x50\xca\xd3\x47\ \x81\x06\xb8\x85\xa8\xe8\x89\x88\x9d\x92\x20\x0a\xc7\xc0\x9e\xda\ \xe9\x2f\x30\x38\xb8\x77\xdb\xf8\x15\xd1\x11\xb3\xb7\x18\x3a\x53\ \xa7\x00\xb6\xc0\xed\x09\xb7\x0d\x76\x35\x80\x5b\xaf\xcf\x25\x59\ \x11\x10\xb3\x26\x9c\x68\x60\x66\x0c\x99\x7a\x63\xba\x5e\x9f\x7c\ \x9a\x68\x20\x37\x2e\x87\x95\xa7\x9f\x1f\xea\xf7\x4a\xf0\x89\x18\ \x20\x44\x41\x11\x0b\x3a\x71\xef\x04\xc0\x80\x06\xea\x19\x66\xb6\ \xc0\x96\x99\xe0\xe3\xdb\x1c\x80\x65\x5e\x10\xac\x34\x90\x3e\x96\ \x17\x44\xb1\x3a\x01\xeb\xa7\x2e\x41\xb2\xd1\xdf\x7e\x56\xff\x0d\ \xf6\xf5\x00\x45\x3a\x20\x48\x36\x54\x9d\x11\x65\x56\x50\xa4\x83\ \xd6\xe3\x16\xc0\xcb\xaa\x20\xc9\xf6\xa4\x71\xb7\xf5\xfe\x16\xc0\ \x96\xc9\x01\xd2\xed\x01\x3f\x57\x92\x03\x19\x76\xbb\xc9\x4b\x64\ \xd8\x63\x93\x97\xe4\x4a\xb2\xc9\x4b\x0e\xee\x90\x69\x7e\x33\x15\ \x9a\x43\xc7\xbe\x05\x5a\x0b\x72\xcb\x5b\xdd\x86\xb8\x28\x3f\x71\ \xdd\x8f\x2a\x4a\x22\xfd\x3e\x91\xa8\x81\x6c\xbe\x78\xbb\xb5\xaf\ \x29\xa5\x57\x33\xf5\xb1\xe4\x70\xd7\x23\x07\xe0\x63\x56\xf6\xcc\ \xbf\x45\x19\x06\x06\xe8\x77\x05\x24\x29\x69\xd1\x31\xcc\x1c\x18\ \x00\x1b\x90\x92\x91\xc7\x82\x4c\x1f\x73\xb4\x1c\x88\x85\x79\x9f\ \x8c\xa2\x8a\xdb\x3f\xe6\x4e\x51\xf4\x04\x83\x3c\xa5\x9f\x45\x2d\ \x70\x0f\x7b\x5d\x27\x27\xe2\xa0\x60\x3b\xd0\xe0\xf7\x37\x7d\xca\ \xc1\x96\x65\xe5\xc3\xd8\x27\x9c\x8c\xc8\xa7\x89\xf9\xf4\x5a\xe2\ \x6c\x07\x3e\x49\x6c\x8f\x44\x01\x3e\x29\x25\x09\x82\xaa\x75\x88\ \xf7\xe3\xa0\x75\x88\x3f\xbe\xde\x7c\x7e\x3e\xd2\xdf\xe7\x22\xde\ \x32\x0e\x03\x96\xb9\x06\xec\x67\x7e\xc5\xff\x9f\x4b\x91\x0e\xd8\ \x2b\xd5\x02\xe6\xb9\xbf\xc1\x3b\xac\xf0\xe3\x80\x20\xd9\x38\xc0\ \xa7\xd5\x84\x65\x55\xb0\xac\x0a\xc6\x5e\xe0\xe4\x5d\x4b\x5e\x18\ \xf0\x1e\xcb\x0a\x1f\x40\xe5\xe6\x07\x31\xdb\x6a\xb5\x43\x76\x6f\ \xc9\x52\xc3\x6b\xf7\x1e\x07\xb1\xa9\x59\x57\xe4\x0e\xa0\xea\x88\ \x71\xbb\x47\xaa\xf8\xdf\x75\xb1\x80\x6c\x5e\xb7\x4c\xec\x47\x15\ \xa5\x92\x24\x51\x85\x2f\x22\xf7\xce\xb5\x3e\xaf\xb9\x58\xfe\x88\ \x0e\x3f\xa7\x97\x05\xe0\x91\x51\x88\x94\x8d\x5f\x69\x20\x43\x83\ \x7d\x63\xc2\x4c\x19\x29\x11\x1b\x19\x12\xb6\x98\x16\xa0\xd3\x9b\ \x12\xec\x94\xbb\xff\x18\xa8\x00\x59\x1c\x31\xec\x75\xb5\x84\x88\ \x43\x26\x71\x5b\x72\x0c\x09\xf0\x1f\x7b\x84\x61\x84\xff\xd8\x63\ \x1d\x7b\x24\x71\xc2\xe8\xf1\x23\xd4\x24\xc1\x9f\x14\x74\x27\x43\ \xb6\x03\x9f\x69\xd8\x37\x47\x80\x94\xd5\xfa\xee\x93\x8c\xdb\xbc\ \x58\x76\xb6\x5b\x61\x8e\xbc\x16\x58\xe1\xaa\x82\xcf\x87\x4c\xb2\ \xbe\x03\x70\x1b\x24\xe9\x89\x0e\x3e\x77\xf1\xbc\x25\x9d\xde\x65\ \x8b\x89\x9b\x92\xc6\x32\xb5\x05\x61\x91\x1a\xed\x3f\x29\x38\x70\ \xe7\xc0\x6b\xc1\x9c\xc6\x5d\x56\xc5\x96\xdc\xdf\x9e\x30\xb1\x05\ \x74\x52\x76\xf1\xe7\xb1\xbe\x21\xc3\x9e\x03\xef\x7d\x25\x51\xe9\ \x73\x7d\x7f\xf7\x16\x6f\xd4\xc3\x33\xa0\xd8\x23\x41\x05\x7a\x2b\ \x0a\xba\x44\x8e\x99\xed\xe3\x25\x91\xd6\xd2\x47\x2c\x7d\x0c\xc0\ \x13\xc9\xd1\x7c\xcc\xcb\x5a\xbb\x43\xa9\x34\xc3\xfa\x51\x85\x3c\ \x62\xbe\x7a\x39\x69\x24\x85\xf2\xea\x6d\x53\x52\x58\x80\x9a\x6d\ \x45\x4c\xa0\x12\x06\xa5\xc7\x76\xaf\xa8\x44\x8f\x4c\x2f\x13\x90\ \x4a\xb2\xf1\xab\xc6\xc2\x0d\x02\xe5\xd3\x31\x12\xa1\x29\x17\x8a\ \x9e\xd0\x92\xe2\xdc\x4e\x3a\xd8\xd6\x6c\x1c\xd7\xdf\xd3\x64\x3a\ \xe3\xb3\xe1\x8c\xd1\xf0\x82\x22\x16\x24\xf4\x98\x4d\x05\x13\x31\ \x62\x22\x46\x88\x69\x42\x57\x08\x92\x38\x21\x89\x93\x13\xb0\x0a\ \x62\x46\xc3\x36\x68\x7d\x25\x5b\x00\x6b\x5d\x37\x40\x14\x54\x2d\ \xe9\xd3\x15\x82\x0f\xa5\xc7\x17\xd5\x80\x7c\x90\x30\x79\xe0\x9f\ \x2c\x00\x7f\x4c\x07\x37\x3f\xa7\xaa\xc6\x1c\x76\x37\x6e\x51\xd7\ \x94\x16\xcd\x1d\xcc\x02\xd0\x82\x7a\xbb\xa8\xc1\x0b\xb4\x98\xd8\ \xf3\xe6\x84\x65\x9f\xd2\x5f\xb4\x64\x84\xdd\x01\x52\x7f\x8f\x2f\ \x3e\xd6\xd4\xac\x1e\xac\x48\x6f\xbb\x04\xc9\x15\x22\x79\xcd\x32\ \x1e\x9f\xa7\x4f\x51\x20\x54\x48\x97\x48\x83\x56\x74\xcc\xa2\x50\ \x33\xb1\x05\xaf\x3a\xf3\xd2\x54\x1e\x39\x15\x91\xa8\xb7\x52\xd5\ \xb7\x81\x2d\x9a\x85\x25\x90\x44\x42\xbb\x22\x44\x2d\x80\x47\x44\ \x48\x64\x43\x54\x44\x48\x51\x19\x38\x37\x80\x2c\xaa\xda\xc5\x30\ \x00\x2e\x44\xda\x62\xe2\x41\xe9\xe1\xa9\x82\x98\x2e\x91\xa8\x18\ \x94\x9e\x63\xe1\x4e\x4f\xd0\x69\x68\x5d\x0b\x5a\xa7\x7f\xab\x98\ \x49\xec\x33\xa1\x64\x81\xef\xd8\x36\x0c\x23\xfc\x49\xa1\xc1\x48\ \x8f\x84\x1e\x13\x31\xd2\x32\x40\x44\x74\x85\xa0\x2b\x84\x5e\xfd\ \xf7\x8b\x5a\x0a\x64\x6b\xf6\x4a\xb1\x5a\xdf\xb1\x79\xa7\x98\xe7\ \x5b\xfa\x1b\xf3\x99\xf3\xa5\x01\x98\x80\x78\xe8\x40\x74\xcc\xc4\ \x4d\xb0\xa5\x94\x27\x2e\x85\xd5\xc7\x0f\xfa\x4b\xe7\x4a\xe4\xe5\ \xd4\x49\x8a\x7d\xfe\xf6\x64\xa1\xfa\x63\x8b\x3b\xcf\x5b\xb6\x34\ \xbf\xd5\xc4\x4d\xe9\x52\x75\x46\x0e\x80\xe7\xdc\x06\x56\xa1\x03\ \xf3\xb2\x2a\xa8\xd6\x93\x16\x13\xdb\xc5\x5d\x90\x6c\xdc\xe7\x86\ \xcb\x78\xcc\xc4\x82\x2e\x7d\xce\xc5\x58\xb2\x38\x40\xb4\x7f\x48\ \xd4\x91\xb0\x7f\xe8\x98\x7a\x00\xa0\x02\xba\xa2\x8b\x62\x6f\xd8\ \x2e\xd0\xc7\xe6\xc6\x1e\x5b\x44\x15\x9e\x8c\xe9\x1e\x31\x6e\xd7\ \x30\x69\x53\x42\x68\x17\x83\x1a\xc0\x66\x5b\x20\xe9\x13\x21\x1d\ \xb0\x65\xad\x51\xab\x18\xe9\x65\x0e\xc0\xc7\xf6\x5c\xa4\x3c\x63\ \xc9\x79\x2d\x69\xa1\x0c\x0b\x6b\xdd\x9e\x11\xa8\x84\xc8\x00\xde\ \x31\xa4\x88\x0c\x30\x05\x01\x0a\xcf\x80\xf4\x90\x78\x3c\xac\x1a\ \xd2\xa7\xf3\x04\xff\xb0\xa4\xec\x8c\x19\x1c\x24\x9b\x4e\x04\x87\ \x25\xe5\xe8\x82\x27\x07\x49\xca\x8e\x72\x74\xc1\x2c\xa8\xce\xda\ \x52\x30\x84\xac\x60\xaf\x94\x61\xbb\x21\x7e\x39\x39\x79\x6e\x18\ \x46\x0c\x27\xda\x70\xc3\xab\xd9\x7e\xbf\xbd\xa5\xe4\x33\xba\xfd\ \x05\x6c\x87\xf8\x86\x89\x89\xfb\x2d\x60\xed\x95\xa2\x10\x07\x22\ \x06\xec\x51\x28\x3c\x07\xaa\xbd\x52\x74\x85\x60\x53\x44\x2c\xf3\ \x3b\xc2\x4d\x4a\x10\x06\x5c\x4c\xc6\x6c\xbf\xff\x81\xd7\x6f\x97\ \x84\xbf\x1e\x31\x11\x33\x67\xa5\x1d\x5b\x6a\xcd\x7f\x93\x9a\xa7\ \xa4\x59\x0a\xa4\x5a\xe3\x4f\xee\x81\xc4\xd9\x6b\x7a\x61\xb7\x72\ \xee\x84\x5b\xb0\xd2\x90\x45\xa3\xdc\x5d\x1d\x7b\x01\xde\x70\x01\ \x8c\xf5\x77\x53\xb6\xdd\x89\xaa\x1a\x6b\x77\xe2\x59\xa4\x57\xe8\ \x83\xd0\x67\xd2\x91\x6e\xdb\xbc\x0c\x42\x9f\x41\xe8\x23\x1a\x4e\ \x46\x57\x74\xe9\x12\x39\x3b\xae\x7b\xc6\x69\x00\xa8\xa2\x0c\xdf\ \x3c\xbe\x8f\x2a\xa7\xa1\xfd\xa8\x62\xdf\x94\x0f\x0d\x00\x97\xd2\ \xd3\x00\x06\x22\xc3\xcc\xa9\xf4\x88\x3c\xfd\xfc\xc8\xab\xb0\x0a\ \x39\x32\xff\x39\x96\x76\x87\x15\x0f\x41\xa6\xf7\x2f\x7c\xad\x89\ \x0d\xa0\x2d\x13\xdb\x45\x5e\x24\x2a\x36\x7e\xe5\x3c\xe1\x09\x25\ \xe3\x64\xc3\x70\xa2\xd9\xf5\x6a\x1a\xf2\xac\x17\x50\x4e\xa1\xec\ \x8c\x29\xa7\x10\x07\x6b\x84\xf0\x99\x05\x15\x62\x9a\x30\x0b\x2a\ \x26\x62\xc4\xe0\x20\xcd\xce\x30\xe2\xc1\xc0\x77\xcc\xea\x18\xb6\ \xaf\xfd\xd0\xd2\x5f\xe0\xc7\x01\x62\x9a\x68\xe7\x27\xab\xef\xd7\ \xd2\x63\x48\x21\x0e\x24\x71\x42\x11\x0b\xed\x3e\x3c\xaa\xdc\xf5\ \x45\x19\x10\x64\x8a\xfd\x5d\x17\x5f\x49\x14\x9e\xf6\x87\xb3\xf5\ \x09\x80\x03\xd5\x69\xb1\x70\xd3\x47\xde\x2b\xc5\xe0\x20\x19\x87\ \x01\xf9\x20\x61\xbb\xd0\x7f\xc7\xe7\x5f\x3c\xe3\x65\x01\x7f\xfe\ \xe7\x6f\xb9\xff\x6e\x89\x9a\xa7\xf8\xa4\xa8\x79\x4a\x31\x5f\x3a\ \xf6\xf7\xe3\x00\x6f\x34\x85\xf9\x56\x1f\x31\x16\x01\xf3\x45\xc0\ \xd8\x2b\x9d\x0c\xaa\xaa\xb1\x93\x0f\xe7\xd8\xb7\xc3\x05\xdb\xfd\ \xde\x31\xb1\x05\xf0\xb2\x2a\x60\x51\x51\x6d\x47\x90\xad\x5b\x1e\ \x33\x80\x3f\xf6\x49\xb7\x07\x2d\x00\xfd\x20\x01\x34\x80\xed\xed\ \xc4\x93\x66\xd5\x18\x91\xab\x39\x21\x7d\x54\x83\x6d\xad\x96\x3d\ \x5e\xc8\x95\x44\x54\x51\x46\xe9\x2c\xb3\x18\x90\x1a\xd4\xb2\x21\ \x1f\xa4\xd2\xaf\x8d\xaa\x1f\x2d\x7f\x58\xa0\xa6\x46\x9c\xe8\x42\ \xcb\xe9\x6b\x9a\xf7\x09\x7c\x14\x25\x8a\x58\xb3\x8e\x28\x50\xca\ \xa3\x27\x22\x3c\x91\x39\x00\x6b\x9f\xb8\xf6\x85\x43\x2a\x2d\x13\ \xa2\x10\xaf\x6a\xc8\x2c\x55\x32\x13\xa1\x96\xc7\xc1\x9a\x84\x29\ \x25\x05\x1f\x45\x48\xe2\x57\x06\x80\x09\x92\x0d\x01\x7b\x20\xd1\ \x2c\x87\x70\xee\x81\x64\x43\xc4\x00\x89\x07\x2c\x49\x08\x80\x35\ \xc4\x43\x0d\xe4\xf9\x2d\xa8\x00\x21\x02\x4a\x0a\xe8\xaf\x09\x54\ \x97\x94\x1d\x42\xf8\x04\xaa\x83\xa2\xa6\xb0\xd1\xf0\x82\x0e\x15\ \x05\x70\xc8\x76\x04\x40\x11\x17\x28\x95\x50\x88\x0d\x81\xea\x18\ \x1d\xdf\x39\xfb\xfd\x5a\x20\xdb\x62\x47\x31\x9a\xc0\xbd\x66\xc4\ \xe5\xee\x9a\xe2\xb3\x2b\x7e\xf6\x1b\x3f\x43\xbe\x7a\xcd\xdb\xc5\ \x9a\x3c\x2f\xf8\xea\xc1\x8c\x7c\xb1\xe4\xe5\xab\x1f\xe8\x7c\xbf\ \xe6\x97\x7f\xf5\x21\x28\x78\x9b\xdd\xb1\xf9\x7e\xc3\xab\x97\xbf\ \xa0\x3f\xb9\xe0\xf3\x17\xcf\xd9\x8e\xa7\x4c\xd0\x45\x8e\xaa\xaa\ \xa5\x80\x95\x03\xf6\xfa\x87\xd2\xe3\xc0\x1d\x7d\x19\x43\x37\x87\ \x51\x4e\x59\x6d\x59\xd2\xaf\x8f\xec\x71\x41\x27\x9e\xb5\x5e\x5b\ \xa4\x03\x0e\xbb\xf7\x24\xfd\x8e\x06\xb1\x05\xac\x03\xa5\xbd\xad\ \x02\x12\x21\x41\x44\x40\x61\xa4\x43\xe1\x00\x9c\x56\x8d\xe7\x36\ \xfd\x60\x0b\xe0\x06\xa0\x01\x3a\x51\xc6\x41\x2a\x84\x01\xb2\x4f\ \xd5\xf2\x85\x6d\xd5\xcf\x8f\xaa\x96\x71\x26\x91\x24\x51\xf4\x49\ \x00\x9f\xfe\x40\x65\xcb\x5a\xb3\xd7\x2b\x2b\x29\x94\x44\x08\xed\ \x4e\x48\x15\x13\x09\xcd\xc2\x21\x10\x1f\x2a\xaa\x78\xd5\x02\x71\ \xbe\xde\xf0\x61\x0d\xa3\x61\x44\x21\xba\xa4\x99\xd6\x7e\x0f\xc2\ \x0a\xca\x09\x29\x25\xb0\xb1\x4b\x57\x53\x45\xcb\x59\xd8\x4a\x20\ \xf7\x28\x42\x02\x14\x59\x67\xc8\xe0\x70\x57\xaf\x17\x94\x22\x25\ \x04\x42\xc8\x52\x56\x6b\x49\x18\x2a\x12\xa5\xdf\xc7\xee\x44\xed\ \x23\x70\x0a\x24\x0e\x88\x6b\x34\xb9\x0c\xb3\x80\x22\xfe\x34\x70\ \x8f\xdd\x82\x26\x98\x3f\xf3\x2b\x82\x30\x60\x39\x48\x58\xbe\x4b\ \x11\xd3\x25\x0c\xe0\xf1\x6f\xfe\x1a\xf3\xfb\x35\xb3\xd5\x82\xbb\ \xc5\x92\x8b\xc9\x98\xce\x62\xcd\xdd\x72\xc1\x9b\x77\x05\x30\xe1\ \xf5\xea\x7b\xaa\x65\xc8\x7e\xf4\x80\x8b\xf1\x98\x8b\xc9\xf8\x93\ \x8b\xb9\x26\x08\x83\x64\xc3\x67\x7e\x85\xe4\x82\x03\xcb\x9a\x89\ \x8d\xa3\x58\x56\x5b\xaa\xf1\x8c\x73\xb5\x96\xc3\xee\x86\x34\x4b\ \x35\x13\x77\x89\xd8\xab\xba\x4a\x67\x81\xbc\x57\xfb\x96\xce\x75\ \xa5\xca\xc6\xe1\x3f\x91\xf2\x44\xf3\x5a\x3f\x57\xeb\x62\x08\xa4\ \x47\x69\xc0\xad\x88\xe8\xe2\x81\x94\x4e\x3e\xf8\x8d\x85\x9c\x2b\ \x63\x9b\xeb\xbe\xb9\x1e\x9d\x61\x5b\x0b\xee\xa8\xe1\x4e\xb4\xca\ \xd1\xca\xab\x8b\x1c\xf8\xba\xb8\x41\xa6\xe5\x84\xa8\x1c\x1b\x6b\ \x49\x11\xb9\xd2\x76\x10\x17\x44\xbd\x09\x4a\x95\x08\xa1\x8f\x4c\ \x01\x11\xc5\xbb\x94\x70\xbc\x45\x70\xe1\x0e\xf7\x6c\xd7\xa4\xe6\ \xcb\xd7\x40\xcb\x0d\xa0\xd1\xc0\xcc\x72\x88\x43\x03\x52\x48\xb3\ \x14\x3f\xde\x91\x66\xf5\xe2\x47\xdb\x70\xfa\x79\xc4\x21\xa1\x71\ \x32\x52\xeb\x6f\x1a\x47\xc3\x02\xda\x28\x65\xc0\xee\x20\x3d\x86\ \x04\xac\x29\x28\xe2\xc2\x01\xbc\x59\x8e\xfe\x14\x13\x0b\x2a\xc7\ \xc4\x51\xac\x28\x4a\xcd\xc6\x77\xcb\x05\x17\xff\x46\x4b\x8a\x7e\ \xfa\x9a\x89\x0f\xc5\x63\xc1\x40\x1b\x7b\xfc\xf2\xaf\x3e\x44\x66\ \xcf\xf8\x50\xea\xef\x77\xb6\x78\x00\x63\xf8\x7c\x32\x74\x00\x1e\ \x4d\x6b\xdd\x1a\x24\x1b\x07\xda\xa6\x1c\xd0\xd2\x62\xce\x61\xb5\ \xd4\x0c\xbc\x5a\x90\x45\x09\xfd\xf5\x18\x46\x39\xb3\xaa\xa0\xda\ \x54\xe4\xfe\x96\x90\x87\xad\x85\x9d\x98\x42\xa7\x77\x59\x57\xec\ \xba\xa2\x7b\x22\x0d\x9c\xe6\x6d\xdc\xa7\xce\xf9\xc0\x0d\x10\x36\ \x75\x70\x20\x3d\x57\xc0\xd8\x9b\x6d\xb7\xc1\xba\xcd\xd7\x36\xfd\ \x5f\xd9\xb8\x1e\xb5\x96\x6b\x5a\x4a\x70\x24\x33\xb0\x15\x2a\x03\ \xdc\xf6\x4e\x57\x39\x37\xc5\x82\xba\x09\xe0\x8a\x18\xd1\x5c\xd1\ \x2b\xc5\x26\x0b\x90\xbb\x05\x42\xf8\xba\x54\xdd\x94\x4a\xeb\x7a\ \xa5\x9f\x66\x4b\x94\x52\xa8\xf9\x1e\xb9\x5b\x40\x96\xb3\xf5\x52\ \x16\x59\xa9\xc1\x9b\x99\x05\x8a\xb9\xbe\x96\x5b\x88\x43\xfd\xb8\ \x2d\xa1\x14\x0d\xbf\x35\xab\x17\x34\xe5\xa2\xed\xc3\xae\xe5\xf6\ \x47\x59\xd5\x32\x71\x90\x05\x67\x01\x5c\x88\xc3\x89\x2b\x61\x4b\ \xce\xda\xae\xab\xe8\x0a\xc1\x6c\x02\x83\x99\x96\x03\x87\xd5\x92\ \x57\xdf\xff\xc0\xab\x05\x6c\x19\x93\xb2\x73\xef\xbb\xe9\xe8\xef\ \x2c\x58\x2d\x90\xaf\x5e\xeb\x1d\x72\x90\x70\x31\x19\x73\x98\x8c\ \x98\x4c\xd3\x56\x15\xaf\xcc\x0a\x67\xa7\x59\x67\x22\x48\x36\x94\ \x4b\xfd\x5d\xac\xaa\x0a\x56\x21\xfe\x48\x2f\x6c\xcb\xa1\x26\x86\ \x85\xaf\x8f\x86\x61\xd9\x3f\xa9\xd4\x55\x9d\xd1\x91\x26\x6e\x94\ \x84\x9b\x8b\xb4\x63\x1f\x57\x57\xe2\x74\x2e\x42\x49\x45\x27\xaa\ \x38\x48\x75\xe4\x4a\x68\xf6\xb5\x4c\x5b\x36\xae\xfb\x4d\x1b\xad\ \x11\x2c\x6a\x32\x30\x47\xc0\x75\x60\x3d\x62\xe2\xda\x56\x13\x44\ \x48\x04\xc2\x1d\x25\xd4\xa7\x02\x47\x8e\xa9\x33\x97\x9b\x50\x4a\ \x22\x44\x44\x98\xf9\x60\x16\x76\x9b\x2c\x00\x16\xa4\x72\x07\xd9\ \x54\x33\xe6\x7c\xc5\xbb\x65\xc9\x44\x7e\x64\xdb\xbf\x22\x3e\x54\ \x06\x88\x3b\xf0\x04\x78\x8a\x78\xe5\x43\x08\x6b\x4f\xd5\xb9\x09\ \x2f\x63\x58\x09\x5d\xd5\xcb\x72\x5b\x5f\xd2\x36\x5c\xaf\xcb\xda\ \x53\x0c\xa3\x3e\x6b\xb9\x65\x68\xf3\x06\x93\x7b\x67\x51\x85\x59\ \xc4\x30\xee\xff\x7f\xab\x98\x19\x26\x4e\x8e\xc4\xc7\x39\x79\x61\ \xf3\x0c\x7a\xc1\xa7\xaf\x0f\x0e\x92\xd0\x17\x7c\x18\x4d\x18\xfe\ \x6c\xc2\x37\x7f\xfe\x0d\x37\x7f\xfb\x1d\x00\x3f\x7d\xa8\xa9\xf5\ \x62\x5c\x3b\x28\x77\xcb\x05\xe3\xa7\x4f\x18\xcc\x2e\xf8\xcc\xaf\ \x0c\xfb\xae\xb4\x55\x58\x6a\x17\xc3\x3a\x1a\x96\x89\x2d\x98\x2d\ \x90\xef\xbe\x5f\x3a\x57\xa2\x5c\x2d\xe8\xf3\x80\xb2\xb3\x87\x55\ \x48\x39\x5c\xe2\x8d\x4a\xe0\x49\x4b\x8a\x34\xb5\x71\xd2\xef\x10\ \x5a\xd0\xee\x39\x95\x06\x4e\x5a\x44\x15\x5d\xa9\x0b\x08\x5d\x0b\ \x9d\x48\xa0\x9a\xbe\xae\x54\x1c\xa4\x87\x88\x2a\x0d\x77\x03\x52\ \xcd\xce\xc2\x95\xa3\x6d\x65\x2e\x89\x04\xa9\xac\x8b\x1c\xf2\x18\ \xbc\x55\x4c\xe4\x65\xad\x4c\x5b\x1b\xc0\xb5\x3f\x8c\x10\x67\x81\ \xab\x8e\x00\x7c\x2c\x25\xdc\xfb\x29\x0f\xcf\x4f\xe9\x67\x09\x39\ \x0a\x01\x7c\x54\x7a\xf7\x2e\x59\x72\xd8\xa4\xe0\x57\x78\xc5\x9c\ \xc5\xed\x94\x22\x54\xed\x32\xbb\xf1\x52\x33\x51\x12\x28\x05\xf8\ \xae\x10\x82\xd0\x80\x0d\xbc\x8c\x45\x15\x13\xec\x14\x0b\x63\xdb\ \xad\x3d\x45\x51\xc5\x2c\xb2\x92\xc0\x33\xc0\x8e\x57\x90\xc1\x26\ \x4c\x18\xe4\x69\xcd\xd2\x8d\x42\x89\x9f\x8d\x28\xe3\x15\x65\x67\ \x0c\xc6\x0d\x19\x12\xb0\xce\xb4\x1f\x7d\x4e\x4a\x58\x4f\x58\xa7\ \xd7\x54\xcb\x62\xf3\x95\x34\xe1\x28\x8f\xd1\x14\xba\xac\x51\xaa\ \xe4\xef\xfc\xa3\x67\x8c\xdf\x3e\x61\xf9\xdd\x5b\xc6\x4f\x1f\x13\ \x6e\x52\xc7\xba\x83\xd9\x05\x4f\x79\x6e\x4a\xd3\x95\x29\x35\x9b\ \x85\xec\x76\xa8\x17\xa7\x8d\x94\x9b\x95\x14\x16\xbc\x45\x3a\xc0\ \x1f\xfb\x5c\x4c\x0a\xde\x7c\xf8\x6b\x58\xc5\x64\x51\x42\x2c\x3f\ \x92\x1d\x12\xe2\xe1\x12\xd6\x07\x2a\xff\xe2\x93\xba\xba\xea\x8c\ \x1a\x9a\xb8\x01\xe4\x26\xa0\x1d\x78\xa5\x76\x85\x9b\x55\xb8\x52\ \x7a\x0e\x94\x0a\x0c\x2b\x7b\x6e\xa1\x56\x1a\x4f\x58\x57\x1d\x6a\ \xeb\xcc\x8f\x04\xbe\x94\x86\xcf\x9b\xa0\x6e\xfb\xb5\x78\x59\xcb\ \xa9\x88\x1a\xce\x44\xdb\x1f\xe6\x4c\x04\xf4\x0c\x98\xcf\x00\xb8\ \xa5\x8b\x55\x00\x5d\x1d\xb9\x54\x71\xd9\x08\xfa\xf8\x78\xc1\x80\ \x70\xb1\x26\x1f\x02\x83\xda\x73\x0e\x33\x1f\x11\x0b\x17\x02\x2a\ \xaa\x98\x40\x64\xa0\x34\x68\x8b\x5e\xac\x41\xdd\x03\x94\xcf\x20\ \x48\xc9\x08\x08\xcc\xbf\xcd\x66\x2e\x26\xb1\xcf\x5a\xd6\xd2\x61\ \x90\x14\x4c\xd2\x84\xfc\x53\xc5\x05\x53\x65\x1d\x1c\xa4\xa9\x88\ \xa5\x4e\x52\x68\x4d\x5c\xeb\x68\x0b\x66\x6b\xb1\xd9\x20\x97\x95\ \x19\x7b\x05\x5d\x11\xe9\x8a\x9e\x0a\xf0\x95\x24\xeb\x0c\x89\xc5\ \x9a\x9f\x54\x4f\xf9\xc9\x17\x70\xff\xc5\x0b\xd6\xd5\x8a\x7c\xae\ \x01\x35\x9b\x98\x52\xb5\x75\x4a\xa6\x38\x8a\x2a\x49\xa8\xaa\x31\ \x9e\xb7\x3c\xf1\x96\xeb\x62\x48\xe0\x40\xf9\xa1\xf4\x28\xb2\x88\ \x15\x15\x03\x99\x6a\x4d\x2c\x63\x4a\x99\xc2\xb0\x53\x07\xac\xce\ \x64\x28\xbc\xc3\x4a\x97\x9d\x8f\x59\xb7\xbd\x72\x52\xee\x7e\x6d\ \x87\x09\x2d\x3b\x4c\x50\xc7\x79\xbb\x86\x85\x5d\xde\xc1\xea\x61\ \xf3\x7a\x11\x09\x84\x54\xee\xb1\xa8\xa1\xa3\x65\x83\x89\x9d\x94\ \x30\x3f\xae\xb4\x8c\x6c\x41\xeb\x65\x48\xf3\x9f\xf3\x87\x95\xd2\ \xc5\x8d\x63\x8b\xae\x51\xe4\xb0\x9f\x96\x37\xdc\x0a\x17\xc3\x24\ \x76\xd7\x9b\xf9\x61\xfb\x3a\x1b\xf4\xc9\x5f\x0c\xa9\x82\xa9\xcb\ \x16\xeb\xc7\x1a\x5f\xae\xf2\x5d\x39\xda\x7e\xe9\xc1\x4e\x11\x07\ \x85\x03\xad\x8d\x61\x1e\x03\x78\x91\x95\x0c\x23\x2d\x19\x86\x95\ \xc0\xab\x46\x2c\xf0\x5d\xe6\xb8\xa9\x9b\xfd\x6c\x84\x9f\x8d\x5c\ \x49\x37\x8a\xef\x19\xd2\xd4\xd0\xc9\x09\x80\xcf\xbb\x13\x29\x89\ \x0a\x11\x54\x8d\x50\x50\x0a\xa2\xe4\xc1\x21\x23\x62\x40\xb0\xbb\ \x26\xf0\xde\x71\xe1\xad\xf8\x6a\x2f\xf9\xc9\x45\xc5\x2f\xf5\x33\ \xfd\x78\xac\x18\x4d\x61\x38\x19\x9f\x94\xb6\x03\xef\xdd\x27\x3f\ \xb7\x29\x2d\x9a\x21\xa3\xd1\x58\xef\x84\xb1\x4c\x29\xf9\x88\x3f\ \x9a\x90\x1d\xba\xee\xbb\x3d\x97\x66\xab\x3a\x23\x5d\x76\xb6\xcc\ \xeb\xd8\xf7\x48\x13\x1f\x87\x75\x2c\x38\x8b\x66\xe5\xcd\x80\xb2\ \x4b\xa4\xb5\xaf\x88\xe8\x97\x71\xeb\xb1\xd2\x80\xce\x37\x1a\x98\ \x23\x56\x6f\xb1\xaa\x97\x41\x15\x1b\x49\x51\xb5\x64\xc3\x89\x3f\ \x7c\x9c\x9b\x68\x2c\x00\x2d\x5b\xdb\x05\x5d\xa0\x12\xc7\xc2\xde\ \x51\x32\x0f\x60\xbb\x57\x28\x25\x1d\x50\x15\x31\x79\xa6\x1c\x90\ \xbd\xf1\x90\x62\x90\x10\xc6\x25\x79\xe6\xbb\x14\x1b\xa2\xd4\x91\ \x55\xfb\x85\xdb\x2f\x5d\x94\x64\x9d\xd3\x1d\xac\xa8\x62\x97\x27\ \x5e\xcb\xad\x2e\x55\x67\xa5\x06\x34\x1a\xd4\xf6\x71\x1b\x22\x22\ \xcb\xf1\x99\x69\x19\x61\x98\x38\x8a\x95\x73\x3a\x80\x86\x94\xc8\ \x29\x3b\xe3\x23\x47\xa3\x1d\x06\x82\xd8\x2d\xec\xba\x42\x80\xf2\ \xb5\x0f\x6d\xfe\x76\x5f\x69\x8f\xd7\x25\xe5\x6c\x9a\xb0\xb1\x18\ \xf4\x95\x74\x59\x89\xbd\x52\x2d\x96\xf7\x49\x5d\xd1\xc5\xb2\xb1\ \xbd\x7e\xbc\xc8\x6b\x16\x39\x36\xd5\x85\xbb\x1d\x77\xf6\x3f\x1a\ \xc5\xb4\xdb\xb3\x9a\xd8\x8f\x2a\x94\x2d\x46\x9c\xa0\x46\xb3\xaf\ \x27\xe3\xda\x03\x96\xed\x1d\x20\xf1\x32\xd6\xbe\xe7\xec\xb3\xd2\ \xd9\x65\xed\xbc\xb0\x05\x78\xd3\xb1\x70\x4c\x6c\xca\xca\x2d\xb8\ \x2a\x79\x26\xf0\x13\x9d\x08\x0a\x0d\x7c\x88\x84\xae\xcd\x09\x17\ \x00\xca\xe8\xb5\x0a\x1d\x75\x97\x47\xbf\x2b\xd8\xfa\x29\x42\x44\ \x48\xe5\x11\xc5\x25\x52\x49\xa2\xb8\x22\x37\x07\x68\x9d\x68\xcb\ \x34\x58\xe3\x92\xdc\xb2\xbc\xf9\xe1\x85\xcd\x15\xdb\xc3\x9f\xbd\ \xae\x7c\x17\xa0\x1f\xe4\xa9\x76\x25\x4c\xaa\x6d\x51\xc5\x2c\x4c\ \x95\x70\x2d\x33\x26\x71\xdf\x69\xe0\x45\x56\x32\xc8\x53\x07\xe4\ \x32\x5e\x39\x3d\xec\x67\x23\xd2\x78\x75\xe4\x1e\xef\xdc\xfd\xfe\ \x61\x79\x96\x89\xf7\x4a\x91\xb2\x43\x66\x23\xee\xb3\x05\x33\x26\ \xdc\xb3\x70\x5d\x1c\x92\x99\x0b\xef\x90\x65\xb5\xf7\x9d\xd5\x8c\ \x5f\x4b\x17\xa3\xf7\x17\xef\xc8\x33\x9f\x65\x3e\x24\xdc\xdc\xd2\ \x9f\x0c\xf9\xfa\x71\x8f\xa6\xc1\x7b\x5c\xaa\x76\x60\x36\x05\xca\ \x55\x55\x31\xf0\xa0\x42\x67\xd9\xb7\x51\x46\xbc\x3e\xc0\xf8\x54\ \x46\x1c\x83\x3a\x3c\xab\x21\x8d\x0c\x38\x66\x65\x5d\xc8\x88\x8c\ \xcb\x60\x5d\x88\xca\xad\xc6\x6c\xf8\x27\x95\x6d\x5b\x4e\x44\x15\ \xd8\x16\xa6\x33\x15\xba\xa8\xe1\x0b\x63\x98\x58\x36\x16\x70\xd1\ \x89\x5f\xd1\xbe\x1e\xa4\x3e\x45\x22\x8d\xe7\x19\x6b\x29\x61\x74\ \x70\x33\xb5\xe6\x18\x58\x05\xae\x72\x67\x3b\x3b\xb6\x4a\x01\x01\ \x0a\x49\x64\x81\xec\x5e\x97\x91\xc7\x75\x2b\x92\x75\x34\x5c\x5b\ \x92\x05\xaa\xf2\x81\x0c\xa1\xe2\x13\x1d\x67\x3b\x41\x28\xe2\xfa\ \xc7\xdf\x29\xe7\x50\x60\x1d\x0c\xeb\x5c\x64\x39\x13\x80\x30\x3a\ \xab\x87\xed\xd6\x7a\xc4\xc7\x8f\xdb\xd6\x25\xc7\xe0\x68\xc7\x63\ \xbd\xe9\xb3\xdd\x5f\xa3\x78\x8b\x48\x07\xcc\x79\xa9\x19\x90\x0d\ \x07\xee\xe8\x18\x49\x60\xf3\x0c\x1d\x2e\x38\xf0\x9a\x4e\x12\x41\ \x9a\x40\x92\x9a\x0c\xf6\x15\xd3\x49\xa1\x8f\x18\x93\x0b\xfc\xde\ \x88\xa7\xb1\x42\x66\x33\x3e\xbe\xfc\x86\x8f\x3c\xe7\xc1\x63\x23\ \xad\xe2\xe1\x27\x43\xf5\x77\x8b\x25\xdb\xc5\x1d\xfd\xc9\x45\xeb\ \xfe\xb8\xa9\x89\x8f\xd8\xfc\xb8\xb3\x23\xb4\xc0\xeb\x1c\x81\xd1\ \x05\x76\x8c\xfd\xe6\xb6\x51\x45\x81\xc4\x23\xa6\x38\xb2\xd8\xdc\ \x73\x84\x4e\x9a\xa9\xa3\x50\x8f\x05\x6a\xd4\xd0\xbb\x78\x19\x52\ \x2a\x92\x48\x1c\x89\x04\xd9\x28\x33\x67\xed\x62\x88\x54\xf4\xcb\ \x98\xad\x9f\xd1\x2f\x63\xca\x6a\x4b\x90\xf6\x51\x49\x0d\x9c\xc8\ \x84\x7f\x44\xc3\x9d\xe8\x99\x9e\xb8\x4a\xf4\x4e\xe4\xc4\x09\x13\ \x8b\x0a\xa9\x3c\x2a\x11\xe0\xa9\x82\x48\x64\xda\x86\x03\xfa\x24\ \x90\x59\xfd\x9c\x81\x8a\x5d\x44\x53\x19\x50\x2b\xe5\x6b\x66\x36\ \x92\x43\x58\xd6\xb6\x8f\x99\x85\xdf\xda\xfc\xdb\x16\xf8\x47\x6c\ \x6c\xe4\xc6\x6e\xcf\xb0\xd7\xa5\x4a\xd2\x56\x15\xd1\xcf\x46\x44\ \xf1\x3d\xeb\x46\x26\xb9\x20\x27\x25\xac\x01\x6c\x5e\x9f\x67\x2f\ \x5d\x90\x3f\x8c\x25\xcf\x26\x0f\x5d\xae\x61\xd3\x79\xee\x02\x4c\ \xb3\xe0\x19\x00\xf7\x85\xc7\xe0\xf0\xb0\xf1\xed\x3c\x44\x66\xc2\ \x85\xe7\xa7\xfe\xe8\x24\x47\x6c\xfe\x71\x74\x7a\x63\xf2\xc5\x73\ \xfc\xf9\x1b\x0e\xde\x63\x3a\x8f\x22\x5d\x5e\x27\x71\x0b\xbc\x63\ \x40\xf7\x27\x17\x8e\x81\x87\x5e\xc9\xba\xf2\x09\xe3\x88\x78\x9d\ \xe2\x0d\xe6\x28\x9e\x20\x3e\x91\x61\x66\xed\x69\x39\x21\x22\xa1\ \xcb\xc1\x06\xcc\xbe\xd4\xdb\xbd\xd4\x8f\xf9\x52\xb6\xec\xb2\xc0\ \x64\x1e\x8a\x06\xe0\xad\xee\xf5\x91\x94\x0a\xfc\x48\xcb\x05\xd1\ \x14\x00\x86\x69\x2d\x18\x71\xcd\xa6\xfa\x59\x41\xea\xb3\xf6\x2b\ \x92\x48\xd6\xcc\xac\xe6\x48\xd0\x1a\xdb\xd7\x00\x06\xd8\x26\x3a\ \xb5\x5c\x50\x12\xa4\x7d\xca\x6a\xeb\x52\x6e\x51\x23\xbd\xa6\x0c\ \x9b\xf6\x88\xd9\x71\x5e\x4e\xd8\x7e\xba\xfe\xa1\x64\x4b\x0d\x60\ \xbd\x2d\x88\x44\x85\x52\x92\x64\x69\xbe\xfc\x81\x87\x17\x0c\x1a\ \x7d\x76\x70\xd8\x29\x02\x51\x82\x52\x28\x15\x23\x0c\x58\x01\xa6\ \x99\x47\x16\x57\x4e\xd3\x17\x76\xe1\xd7\x70\x60\x02\x2f\x63\x6d\ \x16\x76\x64\xb9\x03\x35\xa2\x24\x3f\x48\xc2\x34\x69\x34\x9a\xe4\ \x8e\x71\xf5\xdf\xbf\x65\xed\xf7\xcf\xba\x12\xf3\x6c\xce\xe2\xd5\ \x86\xc9\xe7\xcf\xe8\x67\xe0\x4f\x6c\x61\x44\x7f\x8f\x63\x63\x44\ \x0e\xe2\x94\x85\x79\xcb\x32\x97\x6c\x36\x7a\xa1\xb9\x04\x86\xcc\ \x59\xe3\xb1\xfd\x3e\xa0\x3f\xd1\xa5\x66\xfd\x7b\xcf\x09\xe7\x26\ \xa7\x3c\x1d\xd1\xf5\xfa\xc0\x9c\xed\xcb\x37\x7a\x31\x3c\x5d\xd2\ \x7f\xb7\x25\xf9\x72\xd6\x62\x53\xbb\xd5\x72\xe0\xde\x01\x18\x60\ \x5d\xf9\x0c\xbd\x12\x64\xda\x4e\x3a\x9e\x61\xe2\x32\x2b\x60\x58\ \x11\x0a\xa0\x40\x22\xf0\x50\xc6\x45\x50\x40\xc7\xbe\x58\x7a\x54\ \x51\x45\x60\x4b\xc5\xad\x36\xa4\x88\x22\xca\x60\x11\x22\xd8\x3a\ \xf1\xaf\x5b\x8a\x32\x84\x01\x5c\x5c\x94\x64\x52\xe9\x6d\xe0\xeb\ \xcc\x6f\xa3\xd8\x11\xa4\x3e\x65\xb5\x65\x1b\xf8\x0c\xcb\x98\xad\ \x94\xe8\x67\xe9\x2c\x85\x8e\x66\xda\xfc\x80\xd0\xaf\x6f\xf8\x19\ \x9d\x24\xe3\x90\xf6\x29\x1a\xcd\x97\x3d\x62\x76\x22\x73\xad\x52\ \x4d\x00\x1f\x5f\x36\xbe\xce\x0e\x6f\x8b\x0e\xd1\xe0\xdf\x91\xcd\ \x30\x00\xae\x8a\x8d\x0d\x91\x1e\xc9\x89\x1a\xc0\x7a\xab\x8b\x09\ \xb6\x22\x88\x10\x47\xa5\x08\x0d\x5c\x5b\x20\xb1\xa5\xe6\x49\x96\ \xb3\xf6\x14\xf1\xa1\x22\x0c\xa3\x9a\x89\x1b\x9e\xb1\x2e\x67\xe7\ \x2c\xca\x80\xa9\x1f\x38\x56\xd6\xe5\x6f\x28\xdf\x55\x75\x45\x6c\ \xf1\x3d\x0b\x60\xf5\x32\x60\xe0\xdd\x39\xb0\xcc\x06\x3e\x55\x30\ \x65\x34\x1e\xb0\x5a\x6e\x1a\x7f\xd5\x7d\xbd\xe6\x32\xdb\x47\x93\ \x81\x03\x6f\xdf\xe4\x3d\x6e\x57\x25\xbb\x72\x41\x6f\x55\x72\x98\ \x68\x81\x3b\x1b\xe9\x9d\x77\x38\x99\xb2\x5f\xac\x51\x4a\xd1\x15\ \xc9\x89\xe5\xe6\x9b\x1d\xd1\x63\x4a\xc5\x9c\x75\xe5\xb7\x81\xdc\ \xac\x14\xf7\xd7\x94\xdb\xe1\x49\xe8\xdf\x55\xec\x02\x22\x8a\x48\ \xd2\x95\x1e\x45\x54\x21\xa4\x87\x32\x7a\xb7\x59\x81\x73\x8b\x32\ \x23\x0f\xb4\x5c\x88\x40\x28\x50\x03\x67\xbb\x95\x52\xea\xae\x65\ \x22\x7c\x35\x27\x03\xf2\x55\x48\x16\xe7\x70\x00\x9f\xd0\x24\xdb\ \x42\xed\xc2\x89\x9c\xb8\x71\x84\x89\x8c\xf4\x00\xed\x37\x27\x54\ \xa7\xb5\x3c\x67\xa1\xe9\x18\xa2\xdc\xef\x89\x92\xb0\x4e\xb1\x19\ \xf3\x5e\x9d\x69\xf6\xac\xce\xb0\xb1\x2d\x4f\xb7\xb5\x70\xa3\x5d\ \x49\x05\x78\xe3\x1a\x7e\xc5\x20\xa1\xb0\x5a\x57\x65\x74\x7a\x53\ \x0e\xbb\x66\x79\x25\xa3\xa8\xa6\xa8\xe5\x9a\x55\xb6\x67\xc4\x80\ \x2c\xae\xc8\xe7\x7b\xe7\x6e\x0c\x07\x1d\xe6\xc5\x0e\x44\x0d\xe4\ \xb5\xa7\x40\xc2\x10\xe1\xaa\x82\x6b\x4f\x31\x34\x4c\x6c\xf5\x32\ \x71\xe8\x4a\xd5\xfd\x4d\xc9\x7a\x52\x34\x98\x38\x24\x5f\x6f\x08\ \x27\x11\x53\x86\xae\x73\xa2\x3f\x29\x98\x4c\xe0\x62\xf2\x33\xf6\ \x8b\xef\xf1\x99\x32\xf6\x4a\xf6\x95\x6e\x52\x7d\x61\xed\xb2\xb1\ \x0f\xcb\x52\x6f\x81\x4e\xdc\xe3\x90\x35\x9c\x8e\xc6\x63\x4f\xbc\ \x3e\xf0\x14\xc6\x3e\x45\x2c\x08\xde\x67\xfc\xdb\xf9\x96\xc3\x6a\ \xc9\xaf\x98\x58\x67\x90\x05\xf8\x22\xc5\x25\x7b\x4c\xea\x4f\x4b\ \x1c\xc9\x76\x71\x47\x32\xf1\x9d\x94\x38\x06\xb2\x00\x28\x27\xae\ \x80\xd2\x64\x65\x9d\x9d\x30\x01\x74\xeb\x36\x78\xb2\xb6\xc6\x02\ \x63\x7d\x15\x06\xb8\x2e\xd0\xde\xd0\xb9\x42\x2a\x23\x87\xf2\x96\ \x13\xa1\x6d\x9a\x43\xa3\xb1\x32\x22\xee\xf4\x28\xc5\x54\x5b\x27\ \x22\x32\x5b\x3d\xeb\xa2\xea\xc7\x44\x91\xa0\x30\xba\x56\xb7\x31\ \x45\x6e\xdb\xea\xa8\x33\x00\x96\xe6\xf0\x2c\xa5\x32\x76\x4c\x64\ \x42\xef\x25\x42\x54\x2e\x3b\x21\x1a\x8b\xba\x73\x00\xf6\xc8\xd8\ \xf8\x15\xc9\xa1\x3c\xe9\x70\x96\xd6\x6b\x1e\xd7\x11\xff\xad\x9f\ \x36\x58\x22\x43\x08\xdb\xb2\x94\x35\x58\x58\x7f\x6a\x12\x1c\x60\ \xe0\xb1\xc6\xd3\x95\x3f\x20\xce\xbc\xba\x64\xed\xa4\x9d\x62\x10\ \x17\x14\x55\xec\x00\x9d\x15\x01\x59\xc7\xd3\xc9\xba\x24\xd5\x76\ \x5c\xec\xd7\x00\x8e\xdb\xeb\xf2\x66\x79\x24\x0c\x23\x92\x38\x61\ \x32\x9d\xd5\x8c\x3f\xe8\xf0\xf4\xf1\x15\xc3\xc9\x98\x07\x5f\x7e\ \xc1\x83\xc7\x3d\x18\xfb\x74\x27\x43\xc6\x13\x03\x5e\x03\x4e\xb7\ \x35\x51\xcf\x4e\xdc\x70\x3a\xcc\x63\x55\xb9\x6a\xbd\x26\xc8\x14\ \xc5\xa3\x98\x27\x13\x0d\x56\xdb\xad\xdd\x89\xf5\x71\xb4\xcc\x0a\ \x17\x4d\xfd\xb1\x4b\x93\x85\x8f\x17\x76\xc7\x76\x5d\xba\x3d\xe0\ \x97\xd2\xe3\x60\x80\x77\x68\x54\xdb\x9a\x16\x98\x03\x76\xc3\xdb\ \x15\x0d\xbd\xdb\x64\xd0\x33\xc7\x5f\x10\x11\xd1\x24\x24\x4b\x2e\ \xf0\x45\x0d\xd8\xaa\x1f\xeb\x34\x5c\x54\x39\x97\x57\x82\x03\x27\ \xc7\xc5\x68\x0b\xda\xa6\xa1\x26\x74\x01\x46\xcb\x14\x79\xc6\x6a\ \xf1\x5a\x1d\xd8\xad\x05\x89\xa9\xd6\x09\x11\xe9\xb6\xfd\x8e\xef\ \x40\x6b\xc1\x7c\x0c\xea\x3c\x2e\xdb\xa1\x21\xd0\x92\x41\x94\xad\ \x56\x26\x5b\xec\xf0\x2f\x9e\x52\x0c\x1e\x90\xc7\x25\xfe\xc5\x53\ \xdd\x35\x1d\x47\x84\xd3\xae\x91\x1e\xb5\x2b\xb1\x34\xbe\xe9\x02\ \xdf\xb1\x70\x7c\xa8\xc8\x3a\x9e\xc9\x73\x68\x3d\xbc\xc8\xca\x16\ \x13\x77\x46\x55\x43\x5e\x68\x67\xc2\x76\x44\xef\x95\xe2\xd5\xcb\ \x5f\xe8\xac\xef\xa6\xc4\xdf\x7e\xa0\xb8\xff\x86\xe2\xfb\xb9\x66\ \x57\x13\xc2\x71\xdb\x26\xdb\x36\xfe\xdf\x6f\x6f\xf5\x76\xb1\x86\ \x65\x49\x55\xae\x38\xac\x6a\x0f\xbc\x13\xf7\xdc\xc8\x80\xe9\x17\ \x9f\xb3\xaa\x2a\x3e\x2e\xee\xe9\x4e\x86\x94\x62\xd6\xc8\x9b\x27\ \xf8\xe8\x80\x7d\xdd\x28\x7a\xe1\xd8\x37\x59\x04\x2d\x36\x06\xc8\ \xfd\xad\x2b\xa4\x9c\x6b\x52\x0d\xab\x28\x03\xe9\xd5\xe1\x19\x03\ \x13\x81\x70\x5e\x71\x2d\x13\xbc\x56\x74\xb2\x95\x87\x20\x42\x52\ \xb5\x53\x6a\x22\xd7\x93\x85\x9a\xa5\xe4\x46\x93\xe7\x71\xb9\xd8\ \x39\xbe\x4a\x9d\x3c\x2e\xed\x82\xcd\xde\x67\x26\x02\x49\xa0\x5f\ \x64\x7a\x87\x20\xd2\xbe\xb0\x69\x41\xe2\x4c\x97\x73\x93\x85\x2d\ \x2b\x4b\xe5\xe1\x99\xd8\xa9\x05\xad\x95\x15\x76\xf2\x8f\x03\xb0\ \x59\xcc\xe9\x49\x40\xa5\xb3\xd8\x94\x52\x08\x3b\x94\x44\x98\x8a\ \x5c\x4f\x03\x39\x30\x56\x5c\xd1\xf0\x92\x6d\x89\x7a\x58\xe9\x06\ \xad\x45\x55\x7b\xc8\x71\x50\xe0\x6f\xfa\xc4\x83\xed\x89\x76\x76\ \x0b\xbe\x46\x1a\xee\xb0\xf2\xf4\x5a\xcb\xb1\x73\x6a\x5c\x0a\x78\ \x9b\x49\x7e\xc8\xde\xf1\x2c\x7e\x4c\xc6\x90\xb2\xd4\xef\xe9\x57\ \x3e\xf1\x62\x8d\x9a\x24\x0c\x97\x25\xeb\x71\x45\xb9\xd0\x7a\xb7\ \x4e\xc7\x4d\xdd\xa2\x6e\xbc\xd2\x8b\x39\x7f\x92\xa0\xa8\x28\x17\ \x23\xfc\x49\x41\xb6\x80\xb7\x8b\x35\x89\xb7\xe0\xd9\xaf\x3c\x41\ \xc4\x7d\x3e\x6e\x34\x03\xaf\x4d\x85\xf3\x84\x55\x0d\x13\xd7\x8d\ \xa2\x5a\x4e\x00\xdc\x72\xc0\x67\xc1\xc5\xe2\x21\xc1\xf4\x00\xf8\ \xe4\x65\xff\xbc\x17\x6c\x41\x3c\xdf\x54\x44\xb9\x42\xe6\x25\x22\ \x54\xd8\xce\xa4\xb2\x55\x46\x8e\xf0\xe5\xf9\x84\x82\x6a\x65\x2a\ \xda\xc5\x0d\x0d\xe0\xcd\x49\x41\xc2\x5e\xfb\x54\xde\x41\x0a\x41\ \xa4\x54\xed\x0f\x3b\xc0\x4a\x22\x21\x74\xa9\xb9\x51\xbd\xcb\x02\ \x9f\x7e\xea\x53\xcc\xaa\xd6\xdf\x64\xab\x68\x9f\x5a\xd0\x35\xdb\ \x93\xd4\x32\x68\x69\x62\xeb\x50\x0c\x4e\xfe\xbd\xd9\xc9\x6d\xa1\ \x62\xc7\xc8\x1a\xc8\x3e\x42\x64\xee\xd8\x65\xc3\x40\x81\x97\xb5\ \x87\xac\x54\x31\x50\xb2\xde\xed\xb5\x5f\x5c\x04\xf4\xb3\x88\x6d\ \x2c\xc9\x81\x69\xa3\xec\xdc\x04\xb0\x5d\x04\x0e\x2b\x41\xb9\x08\ \xd8\x0e\xf4\x2a\xc3\xb2\x73\xea\xe4\x46\x8f\x19\x13\x7e\xfa\xf8\ \x67\x6e\x41\x96\x15\x11\x79\xa6\x18\x32\xe7\x36\x8e\x18\x02\x6f\ \xa3\x1d\x43\xba\xf8\x93\x02\x1f\x5d\xf2\x1e\x8d\xa6\x4c\x0f\x4b\ \xfc\xec\x0b\xc6\x23\x8f\xca\xd7\x12\xc1\x5f\xac\x18\x4e\xc6\xdc\ \x4f\x2a\xfc\xc5\x8a\xf1\x17\x63\xc2\xc5\x92\xbb\xc5\x90\x37\xef\ \x16\x4c\x33\xd8\xee\x74\xa5\xed\xcb\xa1\x47\xc7\x24\xeb\x9a\x12\ \xa2\x29\x29\xf2\xec\x3c\x0a\xd2\x49\xe1\xa6\x6d\x08\x30\xc9\xb8\ \xba\x68\xd2\x64\xe4\x50\x9b\xfd\x15\x03\x7c\x36\xb9\xa0\x13\xe2\ \x1a\x3a\x05\xc2\xb8\x13\x19\x05\x10\x50\x39\xc6\x16\x26\x5b\x21\ \x8e\x18\xd9\xea\xd9\x54\x7a\xf4\x3b\x7b\xb2\xc3\x00\xc8\xd9\x02\ \x81\x54\x10\x9d\xd6\xdb\x4e\x8a\x1f\x8e\x89\x4d\x5a\xcd\x54\xea\ \x22\x03\xe6\xd6\x7d\x40\x50\xc6\x4e\x4b\xdb\xe6\xd0\xf6\xac\x89\ \xcc\xfd\x8d\xc7\x9a\xb8\x32\x0b\x33\x08\x8c\x4c\xa8\x5a\x5a\xf8\ \xf4\x62\xbc\xe6\x62\xe3\x16\x27\xea\xcc\x0e\xa2\x41\xed\x1b\xfb\ \x6d\x4e\x60\x3e\xaf\xe8\x09\x0d\xe6\xaa\xd6\xc2\xe0\xeb\xad\xd0\ \x1d\xde\x76\xc1\xb3\xde\xc1\xb0\x17\x01\xca\x01\xbd\xc9\xca\xa0\ \x47\x02\x9c\xbb\x24\xb1\xa9\xe0\x21\x18\x3f\x7d\x42\xb8\x49\xe9\ \x4e\x9e\xd1\x05\xa2\x89\x62\xd3\x89\x74\x03\xd0\xea\x8e\x71\xef\ \x8a\xe5\xee\x9a\x71\xef\x8a\xbb\xc5\x92\xe9\xa4\x60\xfe\xca\x94\ \xd2\x78\x69\xaa\x6a\x13\x57\xa3\xbb\x5b\x4c\x18\x32\xe7\x8e\x29\ \x77\x8b\xa5\x71\x78\x34\x83\x87\xbb\x3d\x79\x16\x71\x31\x9e\x50\ \x4e\x86\x28\x8a\x13\xd9\x69\x01\x6c\x01\xb9\x1b\x97\xb0\x80\x64\ \xe2\x73\x28\x3e\xf0\x78\xf1\x84\x74\x52\xb0\xae\xec\x20\x2c\xce\ \x96\xaf\x7d\x52\x5d\xec\x18\x0c\x62\xa7\xe5\x06\xa6\x75\x48\x49\ \x2d\x27\xea\x92\x70\x44\x61\xb5\x70\x43\x5b\xda\x38\xa6\x38\x93\ \x03\xf6\x91\x26\xc0\xb1\xa9\xa1\x6a\x16\x91\xcd\x7e\x0c\x3b\x8c\ \x30\x6a\x15\x94\xdb\xcd\x49\x91\x59\xb0\x49\x03\xee\x08\xd9\xaa\ \xf4\xcd\x92\x82\xc2\xf6\xcb\xd9\xd6\xfc\xc6\xce\x55\x11\x23\x0c\ \xd0\x76\xc6\xd7\x3d\x76\x29\x3c\x91\xa1\x96\x7b\x2a\xd1\x6b\x31\ \xf1\xd6\x46\x34\xe3\xa3\x24\x55\x30\xe0\xb0\xd9\x20\x06\x89\x03\ \xb6\xb2\xfa\x18\x9c\x57\x8c\x5b\xe4\x95\x2d\x06\x0e\x3c\x3d\x39\ \x28\x35\x16\x5d\x62\x99\xdc\x56\xf6\x8c\x55\xb7\x46\xdb\x6c\x04\ \x85\x8b\x74\x5a\x56\x76\x51\xcd\x66\xb0\xde\xb2\x31\x90\xc4\x39\ \x12\x1d\x74\x0f\xc2\x80\x57\x1f\xfe\x8a\x7e\x57\x10\xee\x04\x79\ \x76\xad\xa5\x6f\x3e\xe4\x62\x78\xed\x7a\xeb\xc2\x18\xe6\x8b\x88\ \x3c\x96\x84\x59\x44\x1e\x0b\x53\xc8\x91\x0d\xfa\x92\x6c\x7a\x13\ \xf2\x9d\x74\x05\x9d\x61\x35\x61\x34\x9a\xea\x46\xd9\x09\xbc\x01\ \x62\xd6\x08\x1e\xb4\xfe\xed\xad\x30\x90\x92\x2c\xf3\x82\xa9\x17\ \xba\x8e\x98\x4e\xf0\x19\xe9\xa4\x40\x72\x4f\xd4\x82\xb0\x0d\x18\ \x0d\x1b\x8b\xbc\xc4\x44\x31\xed\x62\xce\xe8\x5d\xd5\xe8\x81\xb3\ \xb2\xa0\x38\xb3\x60\xb2\x61\x20\xa1\x6c\x0f\x5e\x0d\x3e\x69\x3d\ \x61\x36\x8d\xc7\x3e\x7d\xb1\x15\x38\xcb\xa6\x16\xe6\x91\x6d\xbb\ \x6f\x48\x15\x07\x6f\xc3\xca\x49\x54\x71\x48\x03\x48\x24\xa8\xa8\ \x9e\x94\x69\x62\x97\x98\xc5\x9b\x05\x74\xaf\x31\xc9\xd2\x02\xd8\ \xca\x09\x31\xee\x1a\x56\x8e\x1c\x13\x27\x87\x92\x66\x48\x2c\x63\ \x4f\x6c\xf4\x71\xb0\xd1\x51\xcd\x30\x36\xa0\xb3\x9f\xd3\x00\xad\ \x6a\xe6\x2b\x44\xc9\x61\x37\x77\xce\xc5\x61\x37\x87\xa8\x24\x69\ \xac\x13\x6a\x56\xcf\x48\xbd\x92\x40\xfa\xf8\xa2\x44\x1c\x22\x07\ \xe0\xb5\xa7\x75\xf6\x49\xca\xed\xf8\x90\x4c\x08\xdc\xb3\xb9\x87\ \x8b\xe1\x9e\x71\x3c\x26\xcf\x14\x0b\x25\x19\x18\xef\xfa\x62\xb8\ \x67\xdc\xbb\xa2\x8c\x57\xae\x6b\x63\x70\x90\x04\x19\x74\x26\x3d\ \x14\xa6\x0b\x64\x3a\xf9\xd1\xdf\xd0\xc6\x2f\x2b\xff\xd2\x84\x82\ \x16\x74\xbd\x91\x2b\xbf\x5b\x09\xe1\xb6\x26\x60\x34\x0e\x77\xbc\ \x5d\x94\x8e\x8d\xfd\xc9\x82\x74\x31\x21\x99\xcc\x18\x2c\xbe\x85\ \xe1\x57\xba\x3d\x69\x7b\xa1\x19\xdc\x3a\x1c\x59\xe2\x2c\xb6\xd0\ \xfa\xbe\x55\x54\x51\xca\xb8\x66\xd7\x48\xb4\x17\x69\xcd\x85\x9f\ \x54\xf8\x4d\xf7\x41\x6d\x80\x01\xd2\xa6\x39\xc0\xb0\xf0\xce\x59\ \x74\x41\x43\x38\x14\x48\x02\x3b\x53\xc2\x14\x43\xb6\x41\xe6\xc8\ \xd7\x8d\x89\x35\xc5\x01\x54\x04\xaa\xd6\xc3\x56\x7f\x46\xa6\xca\ \xe7\xba\x76\x45\xd5\x72\x20\x9a\x96\x9a\x65\xdf\xe3\xaa\x9d\x6d\ \x16\xf5\x44\x81\x5a\xee\x9d\x2e\xb2\x4c\x7c\x2a\x26\x72\x0a\x21\ \x08\x94\xc2\x0b\x29\xf9\xbd\x95\x00\x00\x20\x00\x49\x44\x41\x54\ \x06\x6c\xf7\x77\x24\x45\x8f\xce\x80\x46\x67\x89\x72\xec\xac\x7d\ \xe4\x7a\xf8\xa0\x10\x82\xd4\xcb\x48\x2a\xed\x4c\xf8\x55\xc6\x6e\ \xa7\x0b\x0b\xc1\x46\x5b\xa9\x5f\x4c\x47\x2c\x6d\x2b\x96\xf9\xda\ \x8a\x95\x2e\x96\xac\x1b\x9e\xf2\x8f\x01\xb8\xd9\xf2\x14\x74\x57\ \x14\xbd\x09\x4f\xe2\x88\xee\x95\x68\xb5\xf2\xd7\xbf\x6a\xcf\x65\ \x94\x01\x96\xa3\x89\xbb\xbe\xc8\x22\x4a\x5b\xf2\x68\xb4\x51\x35\ \x27\x13\x09\xf1\xce\xe8\x7d\xc9\x3a\x8b\x78\x44\x40\x35\xdc\x00\ \xbd\x96\x23\xe1\xa4\x84\x19\x66\x68\xc7\x66\xf5\x96\x3e\xfe\x64\ \x41\xb9\x98\xe0\x4f\x16\xc0\x8c\xcd\xe4\x2b\x2e\x4c\x7b\x52\xd9\ \x2f\xf0\xb7\xfa\xf5\xf6\x3d\xf6\x4a\xe9\xb2\xb3\xed\xc0\x08\xa4\ \x6c\x31\x5e\x13\xb4\xcd\x7f\x6a\x57\x7a\x0e\xc0\x71\x51\x92\x89\ \x9c\xb8\xe8\x91\x1d\x36\x2d\x85\xab\x7d\xdb\x1e\x19\xd0\x27\x62\ \x6b\x80\x6b\x8b\x2b\x4d\x19\xd2\xeb\x47\xf8\x69\x40\x91\xa4\x48\ \xe9\x1d\x39\x15\x5e\xad\x9e\x8d\x0e\xce\x84\x47\xac\xac\x7f\xbc\ \xa3\x93\x14\x3a\xb3\xa0\x70\x4c\x6c\x01\xaa\x27\x60\xd6\x32\xa8\ \xf7\x09\x9f\xd8\x16\x3b\x6c\x76\xc2\x96\xa3\xb7\x45\x87\x04\xad\ \x7f\xad\x53\xb1\x53\xb9\x63\xe3\x3e\x17\x1a\xc8\xef\x2b\x78\xd4\ \x6f\x15\x3b\x9a\x3e\xb2\x65\x66\x9f\x0c\x5d\x14\xcc\xb8\x55\x8a\ \xe2\xed\x82\x0f\xab\x5b\x76\x77\x7b\x3e\x2c\xdf\xf2\x48\xe4\xfc\ \xd5\x93\x9f\xf0\xd3\xe7\xda\x76\xaa\x06\x53\x3a\x55\xc2\xd5\x64\ \x4c\xe0\x95\x40\x41\xbe\x92\x70\x26\xe2\xd9\xb4\xdd\xec\xed\xf5\ \x22\x73\x76\x1f\x71\xa9\x3b\xb0\x33\x93\xcb\xcb\xd2\xd3\xd7\x34\ \x0f\xdd\x71\x42\x9a\xa5\x5a\x5f\x37\x82\x44\xee\x08\x9a\x09\xfa\ \x2c\x59\x2e\x20\x98\xe0\xbc\xe4\x92\x7b\x32\x86\x8c\x58\x81\xf2\ \x4d\xa1\x83\xf6\xe2\x4e\x49\xba\x22\x22\xdc\xdc\x36\xdc\xa9\x19\ \xcb\xe2\x9a\x31\x57\xa4\x8b\x92\xab\xa9\xfe\x4b\x9a\x4c\xdc\xf2\ \x8a\x15\xba\xec\x8c\x49\xa4\x45\xd1\x84\x54\xea\x6a\x91\x30\x76\ \x1a\x26\x81\x56\x18\xe0\xb9\xd2\x85\x19\xc8\x9d\xf5\xe3\xfa\xe7\ \x92\xbe\x2b\x2b\x47\x91\x60\x7b\x34\x1c\xb0\xa9\x77\xb7\x48\x44\ \x14\xd5\x95\x3f\x24\x24\x11\x30\xa5\x44\x11\xa4\x1e\x45\x52\x3a\ \x2d\x8c\x8a\x9c\x6b\x81\x52\xc4\xf4\x88\x84\x44\xa8\x8c\x83\x9e\ \xd3\xd3\xea\xa1\xeb\x89\xc8\x01\xd3\x5e\xb7\xba\xb8\x82\x93\xf6\ \x24\x77\x5b\x05\x48\xea\x8a\x5d\x4e\x45\x1f\xc1\x76\x0f\xc9\x26\ \x85\x60\xe0\xd8\xb8\xe9\x1b\x57\xfe\x0c\xaf\xeb\xa1\x96\x8a\x24\ \x38\xb8\xb2\xb4\x17\x0c\x34\xd0\xb7\xd7\x6c\xc3\x09\x87\x4d\xca\ \xdb\xbb\x0f\x6c\xb2\x15\x3f\x7c\xfb\xbd\xfe\x61\xa3\x4b\xd4\xf5\ \x3b\xae\xf7\x1a\xe4\x7f\x79\xb7\x81\x3f\xff\xd7\xfc\xcb\x8b\x01\ \x5f\x3e\xec\x90\x2d\x0b\xe2\x71\xc0\xdf\xfb\xfa\x37\x99\x3d\x0b\ \x18\x8b\x3e\xb3\xcf\x1e\x30\x59\xc3\x75\x67\x8f\x98\x07\x84\x93\ \x91\x2e\x96\x78\x05\x1e\xc9\x09\x30\x3d\xb5\x23\x4e\xba\x75\x07\ \x36\xb0\x5e\x64\xc4\x41\x41\xb6\x08\x18\xf6\xba\x8d\xce\x6b\xbd\ \x28\x94\xd9\x0c\x50\x8e\x6d\x93\x38\x41\x70\x8f\x6a\x4d\xe0\x94\ \x2c\xb2\x31\xdb\xf8\x9a\x07\xf1\xd8\xb1\xeb\x7a\xb7\xe7\x89\xd7\ \x83\x46\x50\xc8\x02\xf8\xb8\xd8\x91\x0f\xea\xeb\xe9\xc2\xca\xc9\ \x7b\x60\xc2\x87\x6a\xc1\x8c\x19\x61\xb7\x51\x59\xb5\xd5\xbe\x6c\ \x4d\x57\x24\x86\x89\x5b\xae\x6d\xbb\x4d\xc8\xea\x61\xcb\xa0\x96\ \x4f\x14\x15\x42\x49\x5d\xc9\x33\x00\xb7\x56\x17\x46\x0a\xb8\x09\ \xf2\x26\xff\x10\x48\x0f\x19\xd1\x7a\x3f\x5b\x1c\xd1\x96\x9a\xfe\ \x1b\x92\x08\x48\xeb\x50\x7b\xa4\x1a\xf6\x9c\x93\x17\x0a\x44\x84\ \x42\xb5\x7a\x1a\x6c\x5e\xa2\x6d\xff\x65\x8d\x83\xe5\xa9\x57\xdc\ \x6a\x4f\x32\x5e\xf1\x71\xe9\x19\xd0\x63\x5f\x8b\x3b\x44\x3c\x3d\ \x11\x18\x91\xc8\x08\xd1\xab\xfd\x3c\xee\x12\x66\xba\x2c\x1d\x6c\ \x36\x04\x1b\xf8\xb6\x90\xdc\xbe\x7b\xc5\xab\x77\x19\xea\xfa\x1d\ \x37\xcb\x37\xf5\x0e\x14\x6b\x6a\x98\x45\x4f\xb9\x97\x6f\x78\xf6\ \xf4\xa7\x74\x0b\x0d\xea\xef\x6e\x0f\xa4\x77\x1b\x7e\x7a\x7b\xe0\ \x7f\xf8\x8b\xff\x91\x17\xcf\x03\xa2\xc7\xff\x21\xff\xf1\x3f\xe8\ \xf1\x60\xf4\x1f\x10\xcb\x15\x74\x21\xcf\xbb\xf8\x1d\x89\x57\x3d\ \x04\x8e\x3a\xad\x9b\x15\x3c\x7a\x48\x46\x94\xdc\x33\xec\x75\xf5\ \x00\xed\xd0\xce\x10\x6e\x57\xd1\xce\x8d\x67\x55\xce\x8d\xa9\x07\ \xaf\x44\xb1\x62\x9f\x17\x7a\x04\x80\x29\xf5\xf7\xb3\xa8\x36\x33\ \x1a\x91\xd4\x93\xe9\x9a\x4a\x4f\x1e\x7a\x6b\x6f\x4f\x16\x70\x87\ \x93\x14\x0f\x17\x0b\x18\xce\xc8\xf7\x99\x03\xb2\x93\x23\xb6\x83\ \xc5\xdf\xb7\x3d\xe4\x61\xe9\xb1\x95\xd2\x68\x52\xa9\x01\x28\x3d\ \x8a\xc8\x00\xcf\x68\xe1\x75\x2a\x11\x89\x06\xa6\x02\x02\x93\x58\ \x3b\x8e\xa7\xdb\x02\x48\xab\xf3\xf6\x9c\xa9\xd6\xd0\x9e\xa9\xf4\ \xf0\xcd\x02\x4f\x2f\xec\xa4\x0b\xfc\x38\x6b\xad\xe1\x11\x97\xd5\ \x16\x21\xa6\x28\x2a\x76\x66\xae\x84\x05\x72\xd3\x99\x50\x67\x5c\ \x89\xe3\xdc\xc4\xb1\xfd\x66\xc3\xf1\x22\xee\x12\x66\x3e\xdb\x3d\ \xa8\xe5\xbe\x55\x82\x6e\xca\x06\xab\x50\x42\x33\x88\xe5\xa6\x08\ \xd8\xbc\xbb\x65\x79\x77\xcd\xdf\xbc\xc9\x1d\x38\x89\x1f\xb3\xca\ \xbf\xe6\x8b\x81\xa2\x5b\xbc\x63\x1f\x3c\x6e\x01\x79\x16\x3d\x65\ \x16\xa1\x1f\x7b\xfa\x53\xb6\xa6\xdf\xf7\x46\xbe\x81\xd7\x6f\xf8\ \xfd\x6b\x9f\xaf\x2e\xbf\xe3\xf1\xd3\xdf\xe2\xcb\x9f\x8c\x08\x46\ \xa5\x8e\x86\xae\x37\x8e\x4d\x5d\x51\x84\x7a\x0e\x73\x9a\xa5\x10\ \xef\x48\x48\x4c\x6b\x93\x32\x91\xcd\x5e\xeb\x76\x42\xaf\x9e\x7b\ \xd1\x92\x18\x5a\x4e\x94\x8b\x40\xa7\xe1\x0c\x4b\x87\x8d\xcc\xf3\ \x49\x37\x89\x25\x9e\x13\x97\xc1\xa7\x14\x11\xdb\xc5\xc7\xd3\xcf\ \x31\xda\xf8\x76\x82\xd3\xc4\xc7\xaf\xb7\x3a\x3b\x29\xbb\xa6\x65\ \xdf\xf8\xba\xbe\x99\xe0\x6e\x17\x5c\x76\x3b\xd8\x56\x64\x81\x02\ \x15\xa2\xa8\x78\x38\x6b\x03\xd1\x2d\xd4\x8e\xfc\x5f\xdf\xee\x08\ \x8d\x12\x36\x47\xbd\x19\xc7\xd5\xbb\x56\xde\xd8\x31\xaf\x74\xa7\ \x3a\x88\xec\x8e\x61\xc6\xf5\x1f\xbc\x7e\x63\x9a\x4e\xfb\x3c\x1e\ \x9f\xb2\xd4\xf2\xa3\x56\xa5\x66\xc3\xa8\x75\x2b\x8e\x2b\x76\xeb\ \xd8\xc7\xf7\x0b\x50\x92\x30\xbb\x38\xb1\xdc\x74\x9c\x32\xa5\xa8\ \x12\x96\x4a\xb2\x58\x2c\xb9\xfb\xdb\x1f\x78\x69\xe6\x32\xdc\xef\ \xeb\xe7\xcf\xa2\xa7\x20\x7f\x01\x3c\xe5\xe3\xc3\xe7\x3c\x0d\xcc\ \x21\xfe\x16\xc2\x27\x2f\xe0\x5e\xdf\xde\x07\x8f\x99\x8f\x5e\x33\ \x5d\x3d\x77\xe0\xee\x16\xba\x7f\xed\xdb\x1b\x8f\xf7\xea\xcf\xa8\ \xe6\x13\x2e\xfe\xee\xd7\x8c\x45\x9f\xac\x0f\x76\xc4\xc4\xc4\x00\ \x2b\xcf\x22\xbc\xfd\x12\x46\x38\x6d\x2b\x19\x99\xd6\x26\xad\x89\ \xed\x10\x40\xdb\xea\x94\x92\xb7\xe4\x45\x13\xc0\x76\xa4\xc0\xc9\ \xbf\x3d\x53\x10\xf7\x74\xff\xdf\xe4\x9e\xa6\xa5\xd3\x94\x0f\xee\ \xfa\x27\x4e\xa1\xd0\x09\x3e\x63\x77\xf7\x81\xf1\x85\x4f\xba\x98\ \xe8\xcc\xd0\x51\x83\x41\xf3\xfd\x5a\x4c\xec\x37\x42\xf1\x27\x8b\ \xdc\xc0\x2e\xe5\x36\x08\x11\x35\x3a\x99\x55\x6d\x7c\x35\x1a\x33\ \xa3\x33\xe0\x94\xb4\xa5\x84\x3c\x03\xe6\xd6\xb4\x9f\x93\xce\x46\ \xe3\x25\xab\xfa\xb1\x43\x1a\xd0\x49\x0a\x0a\x0b\x76\x3b\x40\x45\ \x54\x27\x65\x71\x61\x58\x53\xcf\x24\x6e\x3b\x17\x1a\xac\x09\x1b\ \xbf\x6a\x8d\xb6\x02\x58\xc7\x3e\x9e\xaa\x88\x45\x0e\x22\x22\x38\ \x94\xdc\xed\xef\xb9\x60\x76\x02\xe4\x55\xe5\x91\x2f\x17\xbc\x7e\ \xbb\xe0\xf5\x9f\xfd\x6b\xae\xf7\x25\xe9\xdd\x86\xe4\x62\xd0\x06\ \x30\xf0\xe2\xab\x7f\x00\xc0\x4f\x2e\x66\xfc\x5f\x87\x11\x7f\xbf\ \xb3\x82\xce\xbd\xae\x52\x3d\x86\x37\xea\x9a\xd1\x7d\xce\x74\xf5\ \xfc\x84\xa5\x01\xc6\x83\x1b\xb2\x65\xc1\x1f\x2e\xef\x78\x51\x24\ \x3c\xfb\xf2\x09\x97\xcf\xd7\x04\xa3\xaf\x48\xb3\x1d\xfd\x2a\x6a\ \x05\xfe\xf3\x5c\x92\x66\x11\xc4\x21\x65\x76\xcf\xf5\x62\x4f\x1c\ \x14\x84\x59\xc4\x7a\xb7\xa7\x9f\x45\xa6\x62\xa7\xc1\x3a\x1a\x5e\ \x1c\xfd\x00\xf7\x46\x72\xd4\xd2\xc3\x4e\x0f\xb2\x2d\x4b\x13\x11\ \x51\x66\xf7\x67\x17\x89\x9f\xac\xd8\x0d\xda\x32\xe6\x50\x7c\xa0\ \x77\xd1\x65\x79\x77\x4d\xef\xa2\x0b\xcc\x4c\x05\xf4\x47\xca\xce\ \x0e\x58\x52\x1d\x85\x79\x2a\xa4\xe9\x4c\xde\x22\xf5\x4c\x09\x67\ \x87\xe1\xba\x3b\xdc\x20\x6d\x75\xe4\x2a\x9c\x01\x63\xd0\x90\x26\ \x67\x2b\x75\xe7\xcb\x5e\x8d\xec\x84\x6a\x06\x3c\x5a\xfa\x8c\x46\ \x07\xc7\xb9\x2a\xa2\x6a\x1c\xfe\x43\x51\x11\x9a\x53\x1f\xb8\x8a\ \x9d\xef\x52\xbf\x8e\x89\x0b\x91\xd2\x27\x66\x2b\xb4\x0f\xac\x94\ \xa4\x1f\x0c\x10\x9d\x94\x2d\x29\xa2\x39\x1d\x49\x49\x3e\x2e\x56\ \xfc\xe2\xdf\x7c\xcf\xcb\xd7\x6f\x48\xef\x74\x2e\x20\xb9\x18\x38\ \x20\xcf\xa2\xa7\x0c\x1f\xc2\xd7\xbf\xf6\x05\x9f\x5d\x3d\xa5\x5c\ \xf7\x99\x87\x1e\xff\x19\x70\xb3\xdc\x33\x9e\xe9\x21\x21\xcb\xbf\ \x79\xcb\x53\x71\x05\x8f\x61\xfd\xae\xd6\xcf\x57\x5d\x9f\x3d\x70\ \x2f\xdf\x00\x4f\xe9\xa2\x59\xf9\xe5\xab\xd7\x04\xea\x15\xd9\xe1\ \xef\xf1\xc5\x57\xdf\xe2\x75\x9e\x52\x25\x29\xc5\xca\x07\xfa\x6c\ \xf7\x8a\xe7\xbe\xaf\xa7\xc5\x65\x39\xf9\x62\x45\x8e\x07\x03\xed\ \x3b\x8d\x7b\x57\x44\x13\x75\x04\xd6\xf3\xce\x73\x21\xba\x04\x6a\ \x6f\x8a\x32\x5e\xab\x42\xb8\x57\xaa\x76\x30\x1a\x71\xcd\xba\xf1\ \x34\x69\x6d\x8b\xde\x15\xe1\xe6\x07\x0e\xc5\x07\xc3\xc0\xba\x5c\ \x5d\x2e\x26\x74\x02\x78\xb8\xf8\x1e\x86\x33\x42\x7f\xeb\x7e\xcd\ \xe3\x1d\x22\xe9\x77\x08\x0f\x44\x7a\xa2\x62\x54\xb9\xe8\x65\xad\ \x65\x95\x03\x30\x91\x3e\xac\x67\x87\x2e\x7e\x60\x60\x7a\x34\x57\ \xa2\x06\xb0\x6c\xed\x00\x7d\xfb\x63\x2b\xb3\xc3\x44\xc7\x13\x7e\ \x9a\x4c\xac\x1f\xf1\xb6\x15\xbd\x7e\xa4\xb3\xc2\xa2\x6a\xa5\xd6\ \x38\x3e\xa5\x55\xe3\xf4\x60\x34\x4f\x0b\x66\xde\x51\x1c\x55\x1a\ \x43\xe5\x9d\x48\x8a\xe6\xc2\x4e\x29\xdd\x67\x97\x31\x44\xa9\x0d\ \x7d\x11\xbb\xbe\xba\x9c\xd2\x81\x77\x6b\x5e\x9b\x2f\x7d\x16\x8b\ \x0d\xdf\xfd\xe5\x1f\xf3\xd2\x2c\xc6\x2c\xfb\x5a\x30\x03\x46\x0a\ \x3c\x06\x15\xf0\xf9\x64\x4c\x32\xd1\xc5\x85\x70\x55\x71\xff\xc5\ \x0b\xf2\xfb\x35\x9b\xfb\x3b\xe6\xbf\x35\x63\xf9\xdd\x5b\x6e\xee\ \xee\x19\x3e\x7e\x0a\x87\x37\xac\x6f\x71\xda\xf9\xaa\xeb\x73\xdd\ \x90\x17\xfb\xe0\x31\xdf\xde\xbc\xe3\x2b\xfe\x94\xb9\xf7\x35\xd3\ \x2f\xa1\x58\xfd\xc4\xc8\x81\x85\x9e\xb8\xee\x5f\x81\xc9\xe3\x86\ \x93\x11\xd3\x46\x77\x74\x84\x72\x5d\xd2\x1a\xc0\xe9\x19\x20\x9b\ \xd0\x8e\xb2\xc3\x0c\xdb\xcf\x49\x33\x5c\x72\x2e\xcf\x25\x8c\xdb\ \x3a\xb6\x14\x91\x2b\x70\xd8\xad\x67\xe6\xd8\x5d\x97\x57\x3c\x0b\ \x4a\x7a\x17\x5d\x76\x77\x7b\xc7\xc6\x37\x8b\x2f\xe8\x15\x77\x84\ \xe5\xdf\x39\x49\xc1\x95\xa6\x33\x3b\xdd\x1e\x08\x3b\x48\x94\xf4\ \x10\x78\xad\xc6\xce\x52\x7a\xe6\xd4\x5e\x9e\x69\xee\xd4\x95\x39\ \xa1\xb4\x1f\xdc\xca\x50\x28\xe9\x5c\x09\xfd\xe3\x5a\x45\xa4\x41\ \x1b\xa4\x3e\x71\xb5\x25\x13\xa7\x5a\xda\xce\x21\xb6\x47\x02\x89\ \x47\x5c\x94\xb0\x3e\xe8\x25\x42\x3f\x6e\x2f\x10\x8e\x00\x2c\xa8\ \x58\xd8\x40\x90\xd2\x3e\xb7\x70\x61\x9c\xc8\x01\x59\x1d\xb1\xf2\ \x49\x2a\xaa\x31\x3c\x51\x88\xc8\x01\xd4\xc7\xd3\x41\xa0\x32\x21\ \xa7\x64\x4b\x46\x9f\xd8\x9d\x16\x01\xe0\xe3\xe2\x3d\x2f\x7f\x71\ \x7d\x16\xc0\xcb\x71\xc4\x78\xa9\xbf\x99\xeb\x7d\xc9\x0b\xe0\x90\ \xbd\xe3\xcf\xfe\x48\x31\x1e\x8f\x78\xfe\xec\x21\xa3\x2f\x86\x8c\ \x83\x29\xab\xc9\x03\x1e\x3d\x19\x72\x2b\x61\x91\x57\xa8\x59\x84\ \xb8\x97\xdc\xdc\xc1\xd0\xb0\xf2\xf7\x1b\xc1\x28\xd4\x32\x46\x33\ \x32\x5c\x75\x35\x23\xa7\x1f\x0a\xbe\x15\x07\xbe\xe2\x9e\xe9\x97\ \x7f\xcb\x65\xfc\x33\xe6\x0b\x7d\x3a\xad\xfd\x62\x0d\x93\xc4\x65\ \x90\xdb\xe7\xc0\x4b\x1b\xdf\x48\xda\x62\xde\x20\x0b\x28\xe2\xa2\ \x35\x1a\xa0\x5c\x28\xfc\x09\x24\x71\x0d\xe4\xa4\xe1\x82\x4d\xfc\ \xe2\x6c\x89\xb9\x05\xe4\x26\xa3\x1e\xde\x40\xe7\xb1\x63\x62\xc0\ \x5c\xff\xc0\x20\xb8\x3a\xab\x89\xf5\x18\x81\xa4\x0e\x00\x75\xa2\ \xca\x00\x19\x57\x72\xb6\x00\x2d\x4c\x76\x42\x33\x99\x86\x42\x3e\ \x3f\xd0\x79\x6c\xaa\x70\x91\x30\x2c\xae\x4b\xcd\xbe\xd7\x67\xeb\ \x7b\xa6\x25\xc9\x27\x8a\xa4\xb9\xad\xa5\x88\x46\x79\xe6\xb4\xb6\ \x34\xef\x19\x45\xc2\x74\x2d\xeb\x56\x26\x26\x3d\x77\x68\xaf\x27\ \xbf\xab\x23\xde\xd6\x72\xa2\xc9\xd2\x75\x7b\xbe\x0d\xc4\x47\x2e\ \x5d\x86\x19\x46\x2d\x84\x40\x2d\x7d\x42\x3b\xab\xd8\x9c\x98\xd1\ \x2e\xf2\xb6\xa4\x84\xca\xa3\x14\x03\x60\xa3\x47\xbf\xa2\x25\x46\ \x5f\xc4\x6c\xc9\x88\x22\xc1\x66\xe1\xf1\xf1\xfa\x9a\x6f\xfe\xcf\ \x6b\xfa\xd7\xdf\x90\xe6\x9d\x16\xfb\xf6\xe3\x35\x49\x38\x68\xc1\ \xc2\x97\x37\xec\xee\x9e\xc0\xc5\x3d\x72\x79\x4f\x59\x6d\xc9\x8a\ \xc7\xbc\xb8\x0a\x18\xc7\x43\xf0\x21\x61\xc0\x8b\x9f\x7c\xc9\x57\ \x8b\x19\x1f\x9e\x7b\xf0\xe7\xdf\x38\x56\xfe\xe2\x9d\x96\x12\x16\ \xc0\x76\xe7\xd0\x54\x1f\xc2\xab\xd7\x04\x4a\xff\xdb\xfb\xbf\x91\ \x52\x15\x1b\x92\xac\x42\x7d\xf6\xd0\x2d\xec\xdc\x62\xce\x6c\xb5\ \x17\xbc\x6b\xf9\xc8\x3e\x82\x92\x94\xf5\x4e\xc2\xae\x4e\x9b\x85\ \xb1\x84\x18\x86\xb4\x4f\xcf\x65\x99\x78\xb9\xbb\x26\xcf\x46\x8c\ \x9b\x55\x6a\x53\x72\xf7\x4d\xb1\x4a\x6f\x7d\xf6\x96\x5a\x3a\x4f\ \x39\x14\xd7\x9f\xd4\xbc\xd6\x62\xb3\x16\x5d\xb3\x62\xe7\xe6\x13\ \x07\x44\x04\x0d\xae\x2a\x90\x46\xdc\x7a\x04\xd2\xd3\x16\x9a\x05\ \xb8\xd2\xad\x45\xba\x65\xa9\x69\x9b\x29\x67\x79\xc5\x05\x64\x87\ \x1d\x1c\xc0\x2b\x7a\x70\x50\xd0\xe9\x21\x03\x45\x54\x98\x25\xd6\ \x61\x07\x41\xd4\x0a\xd2\x17\xcd\x6e\x65\xdb\xd1\xa1\x38\x93\x38\ \x6e\x6b\x60\x94\x57\x57\xf7\x8e\xc0\x5b\x7f\x91\xb2\x5e\x8c\x58\ \x50\x5b\xcf\x58\xc4\xad\xa1\x2a\xa1\xb2\xb2\x6a\x4d\x6c\x40\xdb\ \xa7\x5e\xec\xf5\x89\xd9\xca\x8c\xc5\x62\xc5\xcb\x5f\x5c\xf3\xc3\ \x9b\x9f\xb3\xd8\x45\x4c\x7a\xa7\x95\xaf\x77\x79\xce\xe3\xc6\xc2\ \xee\xbb\xdb\x03\xf0\x96\xcf\xcc\x90\xbc\x1f\xee\xde\xf2\xc3\x77\ \x6f\xf9\xf0\xe5\x13\xaa\xbe\xc7\x2c\x18\x31\x0a\xfa\x84\x93\x11\ \xb3\x27\x0f\x39\xa4\x7d\x5e\xfc\xe6\x13\xf8\x33\xb8\xb9\xbb\x67\ \x35\x0b\xc9\xdf\xbe\x3c\xf9\x9c\xab\xae\xcf\xf5\xbe\xe4\xaa\xeb\ \xf3\xed\x8d\x07\xfc\x82\xdd\xf8\x92\x8b\xb0\xa0\x1a\x4c\x1d\xd0\ \x5c\x07\x88\xa9\xc6\xd5\xee\x44\x7d\x6e\xbd\x3c\x53\xe4\xf1\x9e\ \x4e\x4f\x30\x31\x7e\x72\x39\xb1\x33\x2f\xbc\x06\x7b\x9f\xd7\xce\ \x3a\x59\xd7\x37\x5d\x21\x01\x9d\x66\x17\x58\x63\x36\x47\xb7\xc1\ \xc4\x9d\xf8\x31\x87\xe2\x43\xcb\xa5\x38\x14\x1f\xd8\x14\x77\xc0\ \x17\xad\x79\x1e\x2d\xbf\xd9\x16\x3b\x22\x24\xdb\x48\x77\x70\x54\ \x64\x6e\xe1\x25\x51\x26\xf7\x50\x03\xa6\x14\x1d\xc8\x34\x7f\xb6\ \x22\x21\x91\xd0\x0c\xbb\x3e\xc0\xb0\x43\x2c\x4d\x3a\x3f\x2b\x08\ \xed\xa9\x36\x94\x47\x66\x7c\xc4\xb8\xd3\xa3\x3a\xd3\x09\x22\xcf\ \x74\x88\xd4\x8b\xba\xe8\x14\xcc\x06\xb8\x91\xad\xd8\x99\x57\x58\ \xfc\x0a\x4e\xf3\x1f\xe2\x68\xa9\x7b\x5c\xbd\x2b\x44\x4a\xa0\xb4\ \x36\x54\x4a\x12\xe2\xe9\x69\xa0\xa2\xd6\xc2\x1b\xe5\xb1\xbe\x97\ \xbc\x7c\xfd\x86\xc5\x4e\x1f\x8a\x6f\x97\xb7\x94\xf2\x23\x7e\xf4\ \xc0\x6d\xbf\x78\xf4\x81\x2a\x7c\xec\x18\x3a\xb9\x18\xf0\xdd\xed\ \x81\x6c\xf9\x9a\x78\x5c\xdb\x50\xd7\x3f\xcf\xf9\xfc\x71\xcc\x9b\ \xbb\x37\x8c\x2f\xae\x18\xce\x03\xbe\x79\xf5\x57\xae\xcb\x66\xd0\ \xdf\x73\x73\x47\xcb\xa9\x68\x5e\x2c\x1b\x37\x81\x5c\x7c\xf3\x06\ \xef\xc1\x67\xf4\x1e\xed\x18\x35\x2c\xb3\x34\x83\x3c\xbf\xd3\x43\ \x5c\x76\x4b\x13\x62\x12\x80\xae\xde\xd1\xeb\xba\x41\x29\x7a\x4c\ \x86\x76\x1c\x44\x7c\xcf\x21\x0b\x28\x9c\x8c\x48\x5d\x37\x89\x1e\ \x68\x98\xd6\xbe\xb1\x59\xd8\x75\x6c\xf3\xa4\xcd\x93\xd8\x3c\xb5\ \x6a\x30\xf1\x99\x8b\x05\xf4\x3e\x9b\xd6\x7e\xbc\x8a\x8f\xa4\xc8\ \xbd\x2e\x3b\x07\x52\xb3\x58\xd0\x58\x5a\x35\xe3\x92\x4d\xc6\x45\ \xe9\x54\xdb\x7e\xda\x21\x57\xba\xdf\xcd\x49\x04\x57\xb1\x2b\xf5\ \xe4\x16\x33\xf8\x62\xb8\x3e\x40\xa7\x47\xd5\x8f\x89\xb7\x86\x81\ \x2d\x78\xb6\x19\x55\xdf\x33\x59\x63\xcf\x2d\x0e\xcf\xf9\xc7\x38\ \xcd\x6b\xd8\x3f\xf5\xdb\xc5\x12\xd1\x38\xf5\x97\x09\x17\xc5\x8b\ \x1d\xea\x51\xd7\xc5\x4a\xad\x25\x77\x3e\xfc\xab\x35\x7f\x61\xea\ \xfc\x96\x91\x9b\x0b\x40\x3b\xe2\x2a\xc7\x63\x7b\x7d\xcd\x87\xf7\ \xd7\xbc\x7d\x27\x99\xf4\x72\x07\x64\x3f\x7a\xc0\xf5\xf5\x47\x36\ \xea\x8a\xe7\xd1\x8e\x6f\xe5\x1b\x1e\x4d\x15\xf1\x44\x90\x5c\x3c\ \x76\x52\xe3\x26\x5e\x53\xed\x1f\xd7\x8b\xb3\x0d\xfc\xf5\xf5\x2f\ \xf4\x0e\xbe\x7c\x4b\x19\x5d\x72\xd5\x0b\x29\x67\x0f\x88\xbc\x15\ \xb2\x1a\x11\x5e\x48\x9e\x7f\xff\x96\x25\x97\xe7\xbd\x83\xbb\x0d\ \x3f\x0d\x0f\xbc\x1e\x4f\xb9\xea\xfa\x7c\x58\xbe\x25\x50\xaf\x78\ \x11\x7f\x8d\xba\x1c\x73\x55\x14\xbc\x3b\xe4\x2c\x97\x7b\x67\xbd\ \x0d\x07\x3d\xc2\x49\xd4\xee\xd7\xcb\x72\xa7\x83\x13\xe7\x03\x07\ \x1c\x8e\x9c\x8a\x66\x55\x70\x8d\x9e\xc8\x39\x5f\xac\xc9\x83\xc2\ \x2d\xec\x4e\x98\xd8\xc4\x4c\x5b\x4c\xfc\x23\x72\xa2\x1b\xcf\xeb\ \x1c\xb7\x28\xcd\xe0\x43\x9b\xc7\x30\x51\x4c\x94\xc4\x13\x15\x92\ \x18\xdb\xbe\x7f\x30\x4c\x17\x34\x2c\x14\x1b\xc7\x3c\x18\x98\xf5\ \x85\x0e\xe4\xb4\xea\x5e\x07\x74\xf4\xb2\xd3\x00\xb6\xd5\xb6\x96\ \x43\x27\x13\x5d\x44\x31\xe0\x97\xd2\xa3\x1f\x09\x88\x6c\x20\x3c\ \x6a\x49\x85\x48\x19\x77\xa2\xb5\xb0\x93\x14\x89\x66\xd9\xa2\xd1\ \x0e\xef\x6d\xeb\x10\xfc\xa4\x1f\x71\x28\x63\xca\xed\x96\x83\xa7\ \xc1\xbb\xf5\x33\xfa\x69\x4c\xc7\x10\x71\x2e\x2a\xba\x4a\x39\xb6\ \x6b\x9e\x1e\xcc\x56\xe2\xb4\xb4\xd0\x05\x92\x91\x57\x91\x4a\x9f\ \x74\xb1\xe3\xcd\x56\xb2\xbe\xc5\x49\x88\x49\x2f\x87\xde\x43\x16\ \xbb\x90\xab\x2b\xa8\xf6\x1b\xe6\xf7\x5b\xa6\xab\x29\xef\xf9\x88\ \x2f\x1f\xf0\x70\x5c\x3b\x15\x6f\x16\x53\x9e\xf2\x8e\xbf\xcc\x73\ \x1e\x87\x21\x3a\x81\x6b\xa4\xc1\x12\xf6\x1b\xf0\x07\x6f\x29\x77\ \x39\xbe\xbc\x71\x39\x8b\x57\xfe\x8e\xe9\x27\xd8\x2b\xb9\x18\xf0\ \xf3\xbb\x0d\x09\x70\xb3\x7c\xc3\x25\x4f\x79\x3f\x0e\x79\x01\xc4\ \xdb\x15\xeb\x87\x0f\x61\x1e\x33\x1e\x6b\x54\x0d\x7b\xdd\xd3\x00\ \x90\xb9\x6e\xa5\xc7\xf5\x42\x03\xfe\xb0\xf9\x08\x9b\x0a\x6f\x3c\ \x64\xca\xd0\x2c\xe4\x12\x88\x77\xad\xd7\x8f\x99\x50\xb2\x3d\x62\ \xe2\x8c\x7a\x68\x46\xdc\x8a\x6f\xde\x2d\xbf\x39\x2b\x27\x5c\x46\ \x32\xb8\x38\x91\x21\x7a\xca\xbd\x19\x8a\x68\x27\xc5\x57\x06\xc0\ \x56\xdf\x76\x8c\xab\x60\x59\xb6\x38\x1a\xb4\x6d\x17\x73\xba\x63\ \xb9\xa7\x81\x2b\x22\xa2\x89\x7e\x97\x4d\xdf\xa3\xea\xc7\x8d\x22\ \x89\x65\xdd\xd8\x2d\xe2\xaa\x7e\xec\x1a\x46\x6d\x17\xf3\xf1\x28\ \x69\xd9\x3c\x81\x62\xc3\x33\xa6\x51\xec\xa8\xdf\xbf\x7e\xde\xcc\ \x9c\x07\xad\x93\x14\xf8\x9e\x1d\xac\xa2\x8f\x1a\x4d\x26\x0e\x95\ \x47\x89\x71\x30\x84\xce\x22\xe7\xa2\x72\x6c\x0c\xf5\xf4\xcc\x50\ \x79\xa4\xd2\xd7\x67\x7f\x52\x7b\xf2\xeb\x65\xeb\x90\xbe\x10\x6b\ \xed\x4a\x8c\xe6\x3c\x1c\x3f\xe4\xf9\xe8\x4b\xae\xae\x1e\x70\x3f\ \xdd\x73\x58\x4d\x9d\xdc\xb0\x8c\x3d\xe9\xe5\x6c\xb3\x21\xe3\xa5\ \x24\xbd\xdb\xf0\x2e\xcf\xf1\xb2\x77\x4e\x12\x74\x8b\x77\x7c\xef\ \xef\x50\xd7\xef\xf8\xee\xf6\xc0\x72\x73\xc9\xcb\xd7\x6f\xa8\x6e\ \xfc\x13\x29\x61\x59\xd8\xca\x95\xf4\x6e\xc3\x36\x1b\x72\xbd\x2f\ \xc9\xff\xf6\x03\xdf\xbe\x3e\xb0\x54\x5b\x86\x1b\x7d\x62\x9d\xe1\ \x24\x76\x00\xb6\x13\x36\xc9\x72\xd6\x8b\x8c\xf5\x6e\xc9\x7a\xb7\ \x67\xbd\xdb\xb3\xc0\x67\xd8\xeb\x52\xf4\x04\x9d\xc1\x03\x3a\x8f\ \x1e\x32\x9d\x0c\x0d\x6b\x1b\x2b\x2e\xcb\x5b\x91\xd0\x6d\xac\x65\ \x8b\x8e\x61\x6a\x26\x3e\x2e\xd1\x5b\x39\x71\xd8\xdd\xe0\x4d\xf3\ \x96\x7c\xb8\xde\xb5\xd7\x15\x5a\x13\x5b\x77\xca\x9e\x8b\xa5\x30\ \x80\x16\x5a\x13\x7b\xe6\x84\x2c\xf6\x47\xde\x34\xaa\x6a\x59\xe0\ \x9b\xfb\xda\x05\x85\x8e\xed\xac\x88\x74\xf0\xbc\xe5\xf3\x46\xda\ \x23\x26\xaa\xbd\xe7\x28\xaa\xb4\x53\x71\xb6\x25\xa9\x2e\x26\xe3\ \x3a\x38\x4c\x00\x47\x79\xad\xb3\x82\xfe\xd8\xa5\xd7\x8f\x38\xa4\ \x81\x3e\x59\x49\x30\x45\x71\x40\x50\x19\xd0\x6a\xbf\x59\xdb\x75\ \x95\x63\x61\xbb\x80\x13\xce\x58\x0e\x40\xe4\x46\x0f\x9f\x9f\x9e\ \x99\x2e\x76\xac\xd3\x2d\x2f\x5f\xbf\xe1\xed\x3b\xa9\x0d\x9e\xd1\ \x9c\xd9\x4a\x91\xaa\x0d\x4f\x2e\x1e\x33\x7b\xf0\x94\xd1\x2c\x24\ \x7f\x1b\xd1\x79\x27\x39\x74\xdf\xd7\x3b\x9e\x7c\xcf\x62\x24\x60\ \x35\x6d\x2d\x04\xc7\x4b\xc9\x96\x21\x64\x1a\x88\xd7\xfb\x12\x6e\ \x7c\xbe\xbd\x5b\x91\x5c\x0c\xf8\xe1\xcd\xcf\x1d\x40\xcf\x31\x70\ \x13\xcc\xcd\xeb\x3f\xc4\x92\x70\xf9\x96\xcd\x5d\x87\x95\xe8\x13\ \xf7\x2e\x59\x54\xfa\x2c\x2a\xc1\x22\x33\x1d\x29\x99\xcb\x3b\xc7\ \x41\x8f\x4d\xa8\xc9\x68\xc6\x84\x32\x5e\x31\x01\x7c\xae\xf4\x18\ \xab\xc3\x52\x0f\x67\xc9\x72\x73\xb6\xd3\x94\xb7\x59\xc2\x73\x3c\ \x37\x11\x6e\xb8\xf4\x60\x3c\x82\x65\x49\xe7\x51\x55\x47\x52\xdd\ \x11\xae\x66\xe3\xe1\xa2\x03\x9d\xa7\x80\x96\x13\x57\xbd\xb6\xf9\ \x19\x6f\x1e\x34\x18\xbc\x31\xb0\x51\x94\x28\x15\xe8\xb2\xb3\x88\ \x22\xbc\x6d\xd9\x0a\xe8\x34\xcb\xc3\x75\xa5\xad\x6a\xb4\x14\xe9\ \xdb\xce\x0f\x36\x80\x2b\x90\x6c\x81\x81\x99\xf8\x33\x28\x2a\xb2\ \xc0\x73\x85\x0f\x3b\x7f\x4d\x7a\x99\xfe\x0c\x13\x78\x2f\x0c\x80\ \xb7\x48\xfa\xca\x7c\x8a\x01\xef\xa7\x7b\xdd\xda\xee\x84\x12\x11\ \xba\xe6\x56\x72\x6f\xd4\xdb\x71\x35\x4f\x9f\x0e\x2c\x72\xcc\x5a\ \x11\xb3\xb3\xc3\x01\x8d\x26\xd6\x3a\x58\x5b\x6c\x42\x44\x4e\x07\ \x5b\xe0\xef\xd5\x9e\x0f\xef\xaf\xf9\xe3\xbf\x0a\x98\xde\xbf\x61\ \x5e\xcd\x99\xfa\x8a\x1f\x4a\xc1\xd4\x7f\x03\x7f\x03\xcf\x3f\x7f\ \xca\x17\xc5\xd7\xdc\x5c\x96\x78\x79\x07\x5e\xb5\xff\xe4\x89\x1a\ \xb2\x30\xec\xdd\x04\xb3\xf5\x94\xdf\xe5\x39\x95\xfa\xc0\x44\x0d\ \x5b\xc0\xb4\xdb\xc5\x2e\x74\xaf\x59\x88\x35\xdc\x81\xbf\xbb\xe5\ \xde\xec\x1c\x33\xde\x53\xf6\xf4\x2c\xb5\x67\xfb\x88\x6c\x59\xb0\ \x7b\xbb\x64\x79\xb1\xa5\xea\xcc\x49\x3f\xe8\xf7\x19\x8f\xc7\xe6\ \x7b\x89\xdd\xf9\xa8\x75\x37\x5d\x69\xec\xb8\x7b\xb0\x45\x8c\xf8\ \x9e\x74\x65\xf3\x17\xd6\x17\xd6\x79\x8b\x60\xa7\xa0\x17\x39\x97\ \x63\x3d\xae\x18\x2e\x4b\xaa\xe1\x86\x43\x36\xa2\x13\x17\x0e\xc0\ \x3a\xca\x99\x02\x31\x5d\x21\xf4\x74\xa2\xe6\x02\x75\x97\xb7\x80\ \x9c\x0d\x3e\x12\x96\xbf\xd6\x98\x2e\xea\xb9\x4e\x99\xd5\xfa\x4e\ \x0f\xd9\xde\x42\x9d\x0b\x3e\xec\x5a\xb3\x82\x2d\x1b\x47\xad\x13\ \x82\x73\x02\x78\x54\xed\xd5\xf6\x8f\x78\xb6\x5f\xc6\xee\xf5\x11\ \xb8\xe1\x80\x7d\xd3\x7a\x14\x89\x8a\x3e\x7a\x28\x76\xdf\x76\xd4\ \x99\xb3\x7c\x5a\xcb\x2c\xfa\x31\x36\x6e\x9e\x3d\xf4\x4c\x1f\xb5\ \x70\x27\xe5\x3e\x75\x42\x9a\xd5\x3a\x65\xd8\xa1\xc9\xd0\x4d\x00\ \x2b\xe5\xb1\x59\x6a\x16\x5e\xdf\xc2\xb3\xe1\x96\xde\x65\x40\x35\ \xeb\x43\xf5\x88\x72\x5b\x70\xb7\xee\x30\x5f\x49\xfe\x8f\x3f\xff\ \x53\x7e\xef\x5f\xfc\x3e\xdf\xfe\x6f\x7f\x42\xa5\x4e\x75\xde\xed\ \xf2\x96\x19\xef\x5b\x00\x5e\xec\x42\x57\x14\x99\x7e\x78\x0d\xab\ \x5a\xf9\xfa\xbb\x5b\x16\x62\xcd\xed\xf2\x16\x7f\x77\x5b\xdf\xb7\ \x0b\x99\xad\x14\xb7\xcb\x5b\x6e\x24\xb0\x9a\x72\x90\xef\xdd\xe3\ \x00\x3f\xcf\x3b\x5c\xef\x4b\xde\xa7\x1f\xd9\xdc\x7d\x44\xca\x1d\ \x62\xdc\x65\x3c\xee\xba\x93\xa9\x0f\x27\x71\x3b\x58\x7f\x54\x81\ \xb3\xb7\xab\x24\x35\xce\x86\xe4\xcd\xbb\x35\x2b\x33\xde\x3e\x0e\ \x0a\x37\x99\x33\x37\x33\xde\x18\xfb\x78\x8d\x3c\xf1\x69\x97\x78\ \x8d\xb3\x66\x69\xfd\x3c\x51\x95\x4e\x4e\x08\x2a\xe7\x13\x87\x61\ \x04\xc3\x0a\xdf\xe6\x26\xb4\x7e\xd5\xa3\xa8\x2c\x38\x5d\xde\xb7\ \xd1\x91\x71\x0c\xe0\xbe\x95\x00\x46\xd3\x7a\xdb\x86\x5d\xd5\x8f\ \x29\x92\xf4\x44\x40\x44\x46\xe3\x44\x06\x84\x5b\x03\x58\xe9\xca\ \xd3\xf5\x4e\x11\x35\x18\x59\x8a\x7a\x28\x9f\x2e\x8c\xf4\x5c\xce\ \x58\x77\x36\x47\x35\x3b\x37\xec\x35\x7d\x52\x6e\x79\xb6\xdf\xaf\ \x9e\x12\xd4\x5c\xc8\xb5\xf5\x70\x6e\xce\x46\xaa\xa4\xe2\xc3\xc7\ \x90\xbf\xdc\xd4\x3e\xed\xa3\x6e\xc4\x7c\xf6\xcb\x78\xcf\x47\x5c\ \x0c\x1e\xc0\x60\x82\x2f\xfe\x3e\x9b\xad\xe0\xc3\x12\xb6\xff\x77\ \xca\xfb\x7d\xdb\xdb\xee\x44\x8f\xda\x00\x6d\x58\x74\x8b\x5d\xa8\ \x01\x69\x80\x7d\xbb\xbc\xe5\x9e\x47\x1c\x6e\x14\x9d\x4b\xc1\x8d\ \xd4\x92\xa4\xb9\x75\x55\xae\xf9\x37\xda\xf9\x90\x70\x3f\x12\x0e\ \xc8\x5e\xf6\x8e\xf7\x66\xfe\xc7\xa3\xd0\x23\x16\x25\xc3\xde\xb8\ \x35\xe8\xdb\xe9\xda\xc6\x22\x2d\xcd\xf4\x54\xcd\xd5\x5a\xb2\xde\ \xed\xa9\xde\x0e\x59\xef\xf6\xb0\xd9\x13\xc6\xc2\x9d\xfd\x29\x2b\ \x02\x86\x04\x24\xb1\x9e\x32\xf4\xe9\x4b\xbd\xb8\x6b\x4e\xa8\x1f\ \x3e\x3c\xcf\xc2\x1f\x96\x6f\x19\x04\x17\xe4\xfb\xf3\xdd\xe4\x93\ \xe9\x4c\x4f\x00\xa2\x15\x93\xdc\x9c\xd8\x5b\xda\xf6\x92\xad\x06\ \xd1\xe3\x92\x71\xe1\x16\x5c\x7a\x12\x4f\x16\xf8\x66\x52\xbc\x96\ \x17\x52\xaa\x76\x89\xc2\x02\xce\x16\x0f\x84\xce\x58\x34\x83\xe8\ \xf2\x18\xf6\x8d\x94\x5c\x6d\xb3\xed\x1c\x08\x95\x63\x62\xd9\x38\ \x97\x88\x57\x6f\x8f\x00\x9c\x37\x66\xac\x7d\xea\x62\x99\x3a\x37\ \x9f\xbb\xbe\x97\x70\x78\xc3\x78\xa9\x6d\x35\x0b\xc6\xab\xce\xdf\ \xf2\xa8\x1b\x39\x66\xfe\xc9\x8b\x9c\xe7\x83\xc7\x9a\xa5\xcf\x79\ \xa0\x0d\xf0\xdd\x48\x98\xf1\x9e\x83\x7c\x4f\x27\x7a\xe4\x98\xf4\ \x20\xf5\x7d\x97\x11\xf5\x7d\x37\xaa\xf1\x3b\xe8\x1c\xee\xee\xa6\ \x70\x5b\x3f\x7a\x50\x7f\x86\x79\xae\x05\xf2\x68\xb5\xe3\x4d\xea\ \xb1\x54\x5b\x53\x23\x50\xba\x7d\xc9\x53\x0c\x2b\x41\xd6\xf1\xf4\ \x18\xd8\x5c\x32\x5f\xac\xdd\xe2\x2e\x0e\x0a\xe7\x64\x6c\x63\xc9\ \xb0\xd7\x25\x9c\x8c\x18\x4e\x62\x9e\xf4\xea\xef\x74\x4d\x41\x90\ \x05\x84\xc3\x01\x43\x82\xda\x1f\x3e\x26\x8d\x46\xa1\x62\xd3\xd1\ \xad\xfd\xeb\xdb\x1a\xc0\xea\xf5\x77\xad\xc5\x9d\x5b\xd8\x99\x69\ \xf6\xd6\x27\x46\x94\xae\x62\xd7\x3a\x19\x42\xdc\xe9\x59\x5b\xa0\ \x96\x0a\x26\x0b\x61\x2f\x76\x8c\x6b\x33\x3f\x1c\xb4\xc6\x4e\xe9\ \x05\x62\x91\x94\xce\xff\x2d\xa2\xaa\xb5\x23\x1c\x27\x3e\xb7\x4a\ \xd1\x17\xa2\xa5\x7f\x23\x23\x31\x4e\xcb\xcd\xb4\x2a\x7c\xee\xac\ \x49\xcd\x8e\x0e\x57\xe9\x10\x66\xc4\x54\xd5\xaa\xda\xb5\x98\x56\ \x14\xc0\x96\x24\xeb\xb6\xc1\x7d\xec\x94\xd8\xe2\xcd\xad\x66\xc8\ \xc5\x4e\x2f\xe8\x2e\x23\xe8\x5c\x8a\x16\x33\x03\xdc\x4f\xf7\x0e\ \xd8\xf6\xbe\x73\x60\xb6\x40\x6e\xde\x6e\x5e\x9a\x4c\x6b\x19\xbd\ \x94\x1f\xb9\x09\xfa\xad\xfb\x7b\x97\xc1\x09\xe3\xdf\x48\x28\x7b\ \x0f\xd9\x66\x43\xfe\x62\x71\x8d\xc8\x7f\x41\x55\x4d\x11\x87\xc8\ \xb5\x28\x59\x40\xeb\xef\xcc\x1c\x8d\x62\x41\x1c\x14\x3a\xaa\x19\ \x46\xae\x48\x72\x35\xe9\xd6\x7e\x72\x83\xb1\xe3\xa0\xd0\xc5\x8e\ \xd8\x33\x1e\xb3\xe0\x90\x05\x7a\x56\xdb\x27\xba\x43\x40\x37\xa5\ \xde\x2d\x17\x6e\x41\x77\xbd\xcb\x59\x5c\x3e\x6f\xb1\xb1\xb3\xd8\ \xcc\x6f\x6a\x7d\x62\xd7\xd9\xe1\x98\xb8\x59\xac\x50\x52\x83\xb0\ \xb1\xb8\xeb\x9b\xd6\x9b\xe2\xf8\x7c\x1e\xa2\x72\x9a\xb8\x99\x47\ \xab\xfa\x5e\xad\x8f\x1b\x92\x44\x36\xb4\xae\x34\xe0\x75\x5a\xf8\ \xa8\x25\xc8\xb9\x18\x6a\x61\x2a\x72\xf2\x13\xba\xf8\x4c\x19\xda\ \x4a\x04\x25\x99\x05\x5d\xed\x3e\x28\x69\x16\x7f\x38\x76\xdd\x39\ \x9d\xd6\x27\x8d\xf7\x27\x72\xa2\x09\xea\x7b\x29\xf9\xf0\xfe\xda\ \x49\x89\x83\x7c\xcf\xeb\x1f\x16\xbc\x9f\x7f\x6c\x31\x64\x13\xcc\ \x16\x54\x96\x2d\x8f\x41\x66\x6f\x37\xc1\xb9\xbb\x29\x78\xbf\x97\ \x6e\x5b\xca\x8f\x6e\x3b\x9b\x77\xdd\x73\xed\xf5\xe6\x4e\x62\x3f\ \xd3\xb2\xb4\x95\x28\x76\x81\xb7\xbd\xa9\x48\x8b\x1d\xf3\x62\xa7\ \x4f\x24\x49\xe6\x66\x28\x5b\x67\x22\xeb\x78\x9a\x6d\x2d\x78\xe3\ \xd0\x69\xe3\x34\xd3\xe0\xb5\xb7\x8b\x58\x83\xb7\x79\x5e\x11\x9d\ \x5b\x6e\x58\x94\xe5\x4a\x77\xff\x64\x01\x90\x11\x64\xca\x1c\x21\ \x33\x3a\xbd\xcb\xb3\x0b\xba\x0f\x4b\xdd\xb0\xf4\xd9\xf8\x09\x9b\ \xe2\xae\xdd\x63\xd7\xc8\x61\x58\xb9\xe8\xdb\x1f\xdc\x95\x7a\x85\ \x96\x04\xc1\xd1\x02\x6f\x6b\x40\xe9\xce\x9a\x74\xd4\x56\xa4\xdf\ \xa7\x1d\x75\xdf\x1a\x95\xdb\x5c\x00\xda\xfb\x11\x95\x5b\xdc\x6d\ \x1b\x8b\xb4\x02\xc9\x20\xfc\x8e\x87\xe1\x77\x5c\xc9\x3f\xe0\xaa\ \xfa\x23\xbd\x95\x7f\xc0\x17\xf2\x0f\xce\x80\xb6\xbd\x60\xd3\x80\ \xf5\x98\x65\x26\x8c\x53\xec\x48\xb2\xae\xfe\xe2\xcc\xde\x9c\x8b\ \x8a\xb0\xb5\x43\xd4\x4c\x7c\x96\x8d\x8f\x80\x6d\x19\xd3\xbb\xdf\ \x72\x58\x4d\xb9\xbe\xfe\x78\x02\x9e\x26\x2b\xf7\x2e\x83\xd6\x6d\ \x0b\x44\x0b\xba\x47\xdd\x88\xdd\x4d\xc1\x61\x35\x75\x0c\x0e\x70\ \x59\x6c\xf1\xa3\x07\xcc\xe6\x5d\x6e\x82\x3e\x9d\xd1\xdc\x5d\xff\ \x14\xc3\x3f\xea\x46\x2d\x59\x71\x69\x9e\xf2\x43\x57\x7f\xe6\xc7\ \x77\x5b\xd4\x72\x6e\x16\xad\x71\x6b\x01\x1c\x86\x91\x9b\x2c\xe4\ \x16\x79\x59\xee\x0a\x1f\x55\x92\xb6\x16\x7b\x36\xe1\x36\x24\x30\ \x27\x82\x84\xf5\xe6\x70\x32\x4a\x20\xc8\xb4\xbc\x50\x24\x0d\x99\ \x11\xbb\x93\xd6\x58\x26\x6e\x82\xf7\x7a\x97\x13\xa8\x57\xec\xb3\ \x69\x5b\x13\x1f\x9f\x17\x05\x08\x2d\x70\x20\x72\xbe\x6e\x3d\x0c\ \xbb\x06\x68\xdf\x36\x6c\x46\xed\x2f\x4e\xdb\x64\xb5\x08\xd0\x0f\ \x6b\xef\x37\x10\xc2\xcc\x1f\xae\x08\x54\xd4\x38\xac\xdb\x05\x9d\ \xb6\xd9\xfa\x4a\x4b\x87\xad\x52\x7c\x5d\xfd\x11\xdf\x7f\xf7\x03\ \xbf\xc6\x3f\x6f\x7d\xce\xe8\x57\x61\xf5\x6f\xe1\xea\x19\xcc\x57\ \x5f\xb1\x0f\x3f\xd3\x96\x9a\xeb\xb9\x33\x21\x24\xa1\x13\x77\xf3\ \xed\x1c\xdf\x4c\x90\xdf\x99\xf3\x8e\x1e\x33\x71\xcb\xff\x8d\xf7\ \x66\xf4\x95\x70\xe5\x66\xcb\xca\x12\x49\x59\x64\xac\x6f\xe1\x71\ \x18\xf2\xd6\x68\xd7\x6a\xd6\x67\x7e\x3f\x67\xea\x4d\x99\xdf\xcf\ \x39\x78\x53\x3a\x68\x20\xdf\x04\xfd\x13\x90\x59\x0d\xfd\x88\xf7\ \x0e\xcc\xb3\x79\x97\xf7\x53\xc9\xe5\x68\xcb\x4d\xd0\x77\xb7\x67\ \x68\xb0\x5e\xca\x8f\xdc\x4f\xfb\x06\xf0\x30\x6b\xec\x0c\xcd\xf7\ \x3d\x27\x45\xac\xa4\x78\x68\x54\xe2\x7b\x15\xf2\x2b\x71\xce\x78\ \x3c\xd5\xa3\x18\x7a\x42\xcf\x76\x43\xb9\x59\x16\xf1\xa1\x22\x18\ \x95\x78\x69\x52\x4b\x06\x03\xe6\x7e\x95\xd4\x21\xa2\x58\xe7\x62\ \xc8\x20\xcf\xb7\x4c\xb3\xbe\xcb\x2b\xbb\x35\x85\x3f\x72\x92\x42\ \x19\x3d\x6c\x2d\x36\x45\xd2\x38\x93\x93\x61\x62\x03\xde\x0f\xcb\ \xb7\x5c\x8d\x9f\xf0\x76\xf7\x84\x17\xf1\xfc\x14\xc0\x26\x47\xe1\ \x02\x41\x91\xd0\x91\xca\xed\x51\x91\xa3\xa5\x1f\x0d\xe0\xa4\x39\ \x31\xe3\xb1\x47\xdb\x5c\x74\xe9\xbe\xbc\xa8\x15\xce\x29\x8c\x2e\ \x2d\x94\x02\xe5\x11\x08\xd1\xf0\x89\x8d\x3b\x61\x98\x7e\xfe\xb1\ \x38\x01\x30\x68\x00\x03\x24\x3f\xfc\x2e\xcb\xd5\xff\x4e\x37\xfb\ \x43\xae\xaa\x3f\xa2\x77\xfb\xaf\xb8\x92\x7f\xa0\x65\x07\x92\x37\ \xd7\xd7\x2c\xae\xaf\x5d\xa2\xae\xea\x7b\x2e\x5c\x6f\x83\xf1\x16\ \xc0\xa1\x68\x9f\x69\x5e\x34\x0a\x21\xb9\xf2\x50\x4a\x91\x1b\xf6\ \xbe\x5b\xea\x0a\xdd\xbb\x3c\x77\x8b\xba\x47\xdd\x88\xab\xab\x07\ \x6e\x41\xd7\xbb\x0c\x9c\x56\xfd\x14\xd0\xec\x02\xce\x3e\xc7\x32\ \xef\x61\xd5\x2e\x26\x77\x46\x73\x2e\x8b\x1a\xd8\x56\x4e\x58\x56\ \xb7\x2c\xdb\x89\x1e\x69\xbb\xee\x13\x97\xcb\xa8\x5e\xdc\x7d\x36\ \x7e\x42\x34\x11\xf8\xa2\x64\x1a\xf4\x18\xe4\xa9\x1b\x4e\x68\xe7\ \x23\x03\x1a\xc0\x86\x79\x01\x2a\x4f\x03\x71\xeb\xa5\xee\xfe\xe6\ \x49\xd6\xed\xc2\xae\x5e\x8d\xed\x9d\x94\x68\x6e\x15\x89\x91\x13\ \x89\x73\x27\xe6\xe6\x24\xe7\x96\x89\x7d\x79\xe3\x98\x78\x72\xf3\ \xba\xd6\xc4\x67\x2a\xb6\xd8\x28\xa6\x34\x4c\x1c\x34\x67\x12\x5b\ \xa0\xba\xd3\xde\x4a\xe3\xe1\xd2\x6e\xf8\xb4\xaf\x55\xb5\x7b\x10\ \x99\x96\x7f\xf7\x9e\x06\xb4\xf5\xb6\x7d\x98\x8e\x44\xc5\x42\xbe\ \xe7\x4a\xea\x39\x0c\xf3\xee\xbf\xc7\xe8\xcb\x1a\xb4\x2d\xcd\xfe\ \x52\x11\xbf\x10\x7c\xf9\xf2\x7f\x21\x7e\x21\xe0\x07\x13\x50\xf9\ \x01\xbe\xe2\x77\x79\x13\xfd\xb7\x26\xe0\x08\x1f\xd7\x01\xdd\x87\ \xbf\xc9\x58\x3c\xaa\xa7\x55\x9e\xe9\xf0\x68\xc6\x32\xed\x8e\x9b\ \x2b\xcf\x65\x34\x6e\x17\x92\xb7\x77\x8a\x97\x6f\xdb\x83\xfb\x26\ \xbd\xdc\x55\xde\x00\x9e\x9b\xaf\xef\x37\xa2\xf7\xdc\xf3\xa5\x73\ \x16\xee\x47\x82\xd9\x4a\x71\x3f\x9a\xf3\xb0\xf7\x90\x85\x58\x73\ \xb8\x79\xdf\x3a\xfc\xef\x6e\x0a\xee\xa7\x7b\xb7\x20\x9c\xcd\xbb\ \xdc\x4c\xfb\x78\xf7\x5b\x2e\xc7\x5b\x6e\xa6\x7d\xa0\xcf\xcc\xb0\ \xf7\x65\xa1\xff\x96\xf7\x12\x6e\x02\x3d\x69\xbd\x33\x14\x1c\x56\ \x53\x7a\x97\x81\x4b\xd0\xe9\xfc\x59\x0d\xf2\x40\xbd\xc2\xdb\x3e\ \x61\xb7\x93\x94\xbd\xb8\x35\x03\x19\x30\xed\x4c\x0d\x26\xad\x46\ \x3a\xee\x64\x40\xdd\xdc\xda\xa2\x87\x1d\x45\x8b\xe9\x14\xc9\x73\ \x09\x9b\x3d\x6b\x0a\x06\xe8\xb1\xb3\x76\x7e\xb2\x3d\x4f\x88\x6d\ \x2a\x3d\x89\x70\x46\x97\x4e\x13\x5f\x8d\x9f\xf0\x61\xd4\xab\xa3\ \x98\x67\x4a\xd7\xee\x77\x44\x08\x02\x75\x6c\x7f\x09\xe7\x32\x64\ \x52\x21\xa9\x4f\xba\x58\x34\x7c\xe4\xbe\x10\xe6\x40\x6d\x2b\x6b\ \x5a\x46\x38\x96\xc5\x04\x77\x94\x4e\x95\x79\x32\x23\x2a\x04\x15\ \x86\x7d\x8d\x84\x78\xd6\x81\xe4\xbb\xdf\xd5\x9f\xf1\xec\x9f\x38\ \x00\x5b\x09\x61\xc1\x6b\x81\x7c\x0c\x6a\xbb\x7d\x2a\xff\x7b\xf7\ \xf8\xf2\xc5\x7f\xc5\x68\xf7\x15\x8a\x47\xda\xa5\x68\xe9\x66\xdd\ \x8a\xe4\xe6\xa6\x19\x0f\xd9\xc9\x0d\xa5\xe8\x89\x29\xd1\xa3\x29\ \xdd\xf9\x8a\x57\x7f\xfd\x3d\xa3\xfb\x25\xf7\xa6\x3c\xdc\xac\xbc\ \xd1\xcb\x5d\xe5\xed\x20\xdf\xa3\x55\xde\x7b\xae\xaf\x3f\xf2\x6e\ \x5b\xe0\xf7\x03\x0e\x57\x0f\xb8\x44\x11\x4f\x60\xd9\xfd\x8c\xce\ \xe5\x07\x58\x4d\x79\xbd\xfa\xce\xb1\xb1\x5d\xac\x35\x81\xdc\x19\ \xe3\x98\xb8\x33\x9a\x73\x33\xed\xb7\x00\x0e\x50\x6d\x57\xcc\xfb\ \x02\x96\x50\xcd\xf6\xcc\x6e\xba\xf4\x2e\x1f\x38\x16\xbe\x91\xef\ \xb9\xbf\x14\x4e\xfd\xce\xc6\x25\x1d\xff\x0e\x8f\x08\x3d\xc5\x2a\ \x26\x0c\x23\x27\x25\xf4\x64\x7a\x13\x5e\x7f\xd7\x67\xc9\x9a\xe1\ \xa0\x43\x18\x46\x0c\xca\x2d\x8b\x55\xc1\x6a\xb9\xe1\xbb\xa5\xc7\ \x78\x5c\xb1\xac\x0a\xc6\x5e\xe0\xba\xf3\x96\x4b\x8f\x07\x55\xc5\ \x43\x42\x16\x14\x84\xf3\x94\xce\x68\xe8\xf4\x73\x1d\x28\xcb\x5a\ \x79\xe4\xeb\xa3\xa0\xd3\xb1\x3b\x51\xf7\x4c\xc6\x6d\x30\xaf\x3d\ \xfc\x63\x8a\xce\xf0\x35\x90\x27\x3a\x3e\xe9\xca\xcd\x51\xbd\xea\ \xb7\x20\x95\x8d\xa0\x4e\xd4\x00\x30\xc6\x3b\x8e\x1a\xa7\x24\x00\ \x5c\x20\x9e\x46\xd8\xa7\x0f\x6c\xf2\x47\xfc\xe9\xb3\x7f\xca\xe8\ \x57\xe1\xd1\xf0\x77\x4f\x24\x44\x13\xa8\xe7\xc0\xdc\xbc\x6d\x1f\ \xff\x35\xfe\x39\xd3\xd1\xb7\x34\xcf\x34\xda\x3e\x12\x79\x47\xb7\ \xdb\xef\xf7\xd3\xab\x47\xfc\xd2\xc3\x2f\xf8\x8d\x5f\xfa\x75\x7e\ \xe7\x77\xfe\x4b\x56\xb3\x90\x77\x79\x4e\x3f\x5e\xb7\x42\x3f\x00\ \x4f\x7d\x78\xf2\x38\xe2\xdf\xff\xb5\xdf\xe6\xeb\xdf\xfe\x4f\x98\ \x7e\xfe\x9f\xf2\x1f\xfd\xce\xef\xf0\xdb\xff\xdd\x7f\xc3\xb3\x2f\ \x7e\xc6\xdf\xbe\x0c\xf9\xc3\x9f\x87\x7c\xff\x5e\x31\x5e\x4a\x3c\ \xf1\x59\x4b\x72\x58\x66\xb5\x60\x76\x7a\x36\xe8\x73\x59\x6c\x5d\ \x88\xc8\x5e\x9f\xcd\xbb\x54\xb3\x3e\x53\x6f\x8a\xdf\xd7\x00\x9a\ \x7a\xd3\x13\x0f\xf9\x9e\x47\x3c\x1c\x3f\x74\xe5\x6b\xfd\x47\x57\ \xf4\x47\x5f\xe9\xe7\xa9\xbe\x9e\xef\xb6\x5b\x12\xcf\x77\xac\x37\ \x07\x0e\x1f\xef\x79\xfd\xc3\x2d\xab\x37\xf7\xbc\x5c\x7c\xcf\x76\ \x7f\x07\x1b\xed\x1f\x6f\xfc\x3e\x6b\x3c\x96\x4b\x8f\xd2\x68\x7f\ \x7b\x26\xd0\x65\x55\xb0\x5c\x7a\x1c\xe6\x4b\x3e\x7a\xfa\xbb\x9d\ \x8c\xf4\xdf\x76\x58\x79\x14\x71\x61\x1c\x8a\x76\xcf\x9e\x23\x84\ \x9b\xd7\x94\xd1\x25\x65\x74\xc9\xe4\xe6\xb5\xf3\x8a\xad\x4f\x2c\ \x5a\xf6\x5c\xe6\x16\x8c\x7a\x8c\x55\x53\xdb\x02\x3d\x95\x91\x89\ \x18\x5f\x35\xa6\xfb\x98\x98\x64\x60\x9e\x13\x08\x71\x54\xf6\xad\ \x90\xaa\x06\x70\x20\x84\x9b\xa1\x66\x27\xf8\xc4\x45\xd5\x2a\x61\ \x7b\xdb\x0a\xb6\xd2\x55\xf6\x22\x35\xe1\x3d\xff\x84\x47\xc3\xdf\ \x75\x0c\x7c\x8e\x71\xdd\xc2\xf9\x08\xcc\xf6\xf6\xf1\xf5\x41\xfe\ \x3d\x9b\xfc\x57\x8d\x8f\x6c\x22\x97\x94\x27\x76\x9d\x95\x1b\x5b\ \xb5\x60\xb0\x6d\x3f\xf6\x60\x1c\xf0\x54\x5c\xf1\xea\xc3\xcf\xd9\ \xf6\x86\x75\xeb\x51\xfc\x18\xfa\x70\xd9\x1d\x21\xfe\x2e\x7c\xfd\ \xac\x47\x67\xf6\x80\xc7\x0f\xea\x91\xa4\x6f\xff\xf3\xff\x9a\x5f\ \x7c\xf3\xcf\xf8\x97\xbf\xf7\x27\xfc\x3f\x3f\xbf\xe5\x5d\xfe\x97\ \x3c\xfe\xfa\x92\x87\xe3\x87\x2c\x46\x82\xc3\x8d\x72\x8b\x40\x2b\ \x2b\x66\x8b\x3b\xee\xa7\x17\x8e\x75\x67\xf3\x2e\xf7\xd3\x3d\x97\ \x05\xee\xba\x77\xbf\xe5\x7e\xa6\x65\x86\xd6\xce\x7b\xed\x66\x5c\ \x3e\x00\x1e\x98\x00\xcf\x7b\x6e\x96\xf0\x70\xfc\x90\xcf\x86\x07\ \xde\xab\x90\x17\xc5\x1d\xd5\xeb\x19\xde\xf2\x9e\xc5\x66\x06\xa3\ \x1c\x56\x21\x25\x1f\xb9\x9e\xc3\xd5\x14\xa6\xe3\x0b\x18\x78\x3c\ \x0f\xc6\x30\xe8\xba\x12\x6f\x9e\x4b\xa6\x93\x21\x17\x93\x17\x6e\ \x42\xd0\x33\xcb\xf0\xe6\xc4\x8f\xeb\xdd\x03\xe2\x4c\xa2\x26\x5a\ \x72\x0c\x67\x03\x9d\x68\xdb\x6e\x29\xfa\xfd\x86\xab\xd1\xee\x0c\ \x59\x5c\x3e\x67\x7d\x0b\xcf\xcb\xd7\xce\x2b\x56\x37\xbb\xb6\x26\ \x76\x85\x12\x9d\xc3\xe8\xc4\x45\x7d\xf6\x24\x0b\x60\xcb\xb0\xb1\ \xd2\xfe\x6f\xd1\x00\x6c\xa0\xa2\xf3\xb6\x93\xd5\xc2\x8d\x60\x50\ \x64\x16\x82\x36\x47\xe1\x6d\x2b\xb2\xc3\x0e\x2f\xa8\xf0\xb6\xc6\ \x37\x6e\xb4\x2a\x79\xdb\x8c\xbc\x1f\xf1\x0b\xfe\x21\xac\x39\x01\ \xb2\x05\x65\x13\x9c\x4d\xf0\x66\x2f\x55\x4b\x72\xb8\x7d\xfd\x87\ \xdf\x65\xfb\xe5\x3f\x25\x1c\x97\xe4\x4b\x0f\xc4\xe9\x79\x3b\x74\ \xdf\x5d\xec\x5c\x8e\x3e\x11\x1f\x56\xaf\xd8\x7a\xb7\x88\x43\x42\ \xd5\x19\x51\x36\xce\x67\xb1\x10\x6b\x9e\xfa\x75\x4b\xd0\xcd\x34\ \x87\xb9\x8f\xff\x2a\x60\xf9\x17\xff\x8a\xde\xd5\x13\x66\x2f\x4a\ \x61\xbb\xb5\x57\x00\x00\x20\x00\x49\x44\x41\x54\xae\xa2\xa7\x8c\ \x7e\xeb\xa7\x5c\x7c\xf9\x1d\xbf\xfe\xe2\x1f\xf1\xd5\x97\xff\x90\ \x3f\xf9\x9f\xff\x57\xfe\xa7\x7f\xf6\x47\xbc\xfb\xc5\x5b\xf8\xfa\ \xd4\x53\xbe\x1c\x6d\x99\xcd\xa7\x0e\xc0\x96\x99\xf5\x22\xcf\x30\ \xf3\x68\xce\x6c\x3e\xa5\x33\x06\xcc\xc2\xaf\x66\xf5\x48\xeb\x70\ \xf4\x22\xf2\x9e\x47\x5c\x46\xef\x29\x81\x9b\xfc\x73\x7e\x63\xb5\ \xe3\xe3\xea\x5b\xf6\xd9\x94\x0f\xd5\x82\x08\xf8\xdc\x9b\xc2\xb8\ \xc2\x1b\x7f\xc1\x97\x9f\x4f\xd8\xc6\x92\x7e\x16\xb5\x86\x77\x5b\ \x00\xd7\xdb\xfb\x56\xe3\x28\xe8\x89\x43\xd5\x62\x0d\x4c\x58\xa3\ \x98\x02\xfb\xed\x96\x43\xe5\xd1\x5d\x0f\x5c\x34\xd3\xfa\xcb\x82\ \x98\x45\x26\x98\xfa\x35\x61\x0c\x1f\xc2\x4a\xf6\xb4\xac\xe8\x3d\ \x61\x75\xa4\x89\x2d\x1b\x37\xab\x7e\x49\xbf\xa3\xe7\x4e\xf4\x1b\ \x3e\x30\x4a\x9a\x74\x9a\x6e\x51\xda\x2a\xe9\xdc\x04\x17\x8a\x57\ \xb2\x66\xe3\x46\x7a\x8d\x08\xe7\x74\x1c\x07\x81\xe2\x4e\x0f\x0a\ \x5c\x27\x47\x9f\x08\x5b\xc7\x8b\x44\x45\xa0\x3c\x54\xf5\xdd\x59\ \x5b\xed\xac\xd5\xf6\x5f\x88\x13\x90\x1f\x3f\x0f\x20\x5d\x7f\xcf\ \x46\xfd\x8a\x61\x5a\x6b\xb5\x35\xcf\x2b\x12\x21\x54\x66\x66\xbb\ \xd5\xc2\x63\xf1\xcd\x77\x4c\xff\xf1\x18\x8a\x05\xf3\x72\xc4\xcb\ \x6f\xff\x98\xff\x97\xb1\x37\x0b\x92\xe5\xbe\xce\xfc\x7e\xb9\x55\ \x65\x66\x65\xd6\xd6\xdd\xb7\xb7\xdb\xb7\xef\x0a\x10\x0b\x09\x82\ \x94\x48\x88\x04\x29\x8a\xa3\x65\x28\x5b\x33\xf6\x84\x2d\xc6\x48\ \xb2\x3c\x96\x46\xa1\xa7\x79\x72\xf8\xc1\x0f\x8e\x90\xdf\xec\x07\ \xdb\x31\xe1\x07\x4d\x8c\x6c\x86\x56\xca\xb2\x3d\x5a\x47\xa4\x16\ \x8b\x82\x28\x40\x24\x38\x20\x81\x0b\x5c\x2c\xbc\x6b\xef\xcb\xed\ \xee\xda\x32\x2b\x33\xab\x72\xf3\xc3\x3f\xf3\x5f\x59\xdd\x17\xd2\ \x54\x44\x47\xd6\xd2\x6b\xf5\xc9\x93\xdf\xf9\xce\x77\xbe\xe3\x3f\ \xda\x65\xe3\x23\xab\x60\x8f\xc8\xed\x75\x8e\xba\x09\xf9\x91\xca\ \x51\xb0\x4b\xf0\x28\x12\x8d\x8f\x91\x98\xce\x78\xf9\xda\x0a\xcf\ \xbc\xb7\xcf\xb5\xa7\x6f\xd1\xf8\x44\x9d\x1f\x7b\xe1\xa3\x5c\xb9\ \xfc\x4f\x68\xae\x6f\xf0\x6f\x7e\xf5\x77\x99\x1c\x4d\x2e\x74\xd9\ \x54\x6b\x09\x86\xa9\xc8\xac\x5d\x47\x64\xe4\xce\xa2\xe4\x8f\x4b\ \xb6\x62\xa5\xd5\x93\x70\x43\x7e\x5d\xb5\x4b\x17\xde\x46\xb5\x96\ \x04\xed\x56\xfc\x1b\x94\x60\x1f\xea\xab\x2c\xb5\x6e\xf2\xfc\xad\ \x9b\x1c\x6a\x53\x1a\x76\x1d\x2f\xd0\x64\x61\x97\xe1\x63\x43\x61\ \xa2\xf2\x84\x2e\xa3\xad\xa3\x07\xc5\x4e\xbd\x71\x63\xee\xd8\x19\ \x37\xd8\x56\x73\x94\xe8\xf0\x9c\xcd\x17\x4c\x73\x9f\x86\xe3\xc8\ \xa6\x47\x6a\xa7\x44\x04\x58\xb6\x22\xd9\x89\xce\xd1\x36\xc3\x56\ \x9d\x81\xb7\x42\xf3\x92\x28\xee\x5a\xc3\x59\x26\x8e\x0b\xae\xd9\ \xac\x64\xe3\x88\x40\xe8\x89\xb5\x50\xc1\x2f\xf8\x61\xdf\x0a\x71\ \xfd\x1c\x4d\x53\x29\x5d\x1b\x34\x14\x52\x22\xe2\x02\xf5\x36\x8b\ \xc9\x8f\x38\x12\xba\xe2\x18\x4b\x2c\x65\xac\x32\x18\x73\x10\x25\ \xac\x74\xf1\x66\xca\x63\xbf\x38\x6a\x58\xf4\xcb\xd5\x04\xe1\x3c\ \x26\xae\x06\x63\x15\x23\x97\xcf\x3d\x29\xc8\xcf\x7f\xae\x7f\xe3\ \x7a\xa5\x30\xb0\x3e\x24\x13\x2b\x17\x5c\x95\xde\x1b\x9d\x31\x79\ \xf3\xeb\xd4\x59\xe6\xbb\x5b\x31\x7b\xfb\xe1\x1c\xbd\x05\xc0\xc3\ \x43\xc2\x7e\x24\x33\x5f\x3c\xec\x62\xb4\x7a\xc4\xa3\x88\xdf\xfa\ \xee\x5b\xb4\xde\x7a\xc4\x0f\x5c\x49\x78\xf9\xc5\x4f\x30\xfe\xcc\ \xdb\x98\x9f\xfb\x29\x9e\xfb\xe2\x02\x3f\xb3\xff\x32\xaf\xfd\xe5\ \x5f\x31\x39\x4a\x59\x5b\xb1\x24\x5f\x9c\xb5\x04\x27\xac\x9c\xc1\ \x4a\xdb\x27\xce\xd7\x80\xe9\x5c\x26\x5e\xe8\xd5\xa0\x35\xc3\xcb\ \x47\x9a\x23\xdb\xd0\x2b\xa9\x5f\xfc\x0e\x48\x86\xa2\xca\x13\xbf\ \xd9\x3f\xa4\xf1\x7d\x0d\x77\x71\x49\x0e\x8f\xaa\x40\x69\x53\x6c\ \xc6\x16\x91\x51\xe8\x4f\x8a\xd6\x74\xd9\x8d\xd3\x5a\x19\x8c\x93\ \x0b\x2c\x45\x79\x1c\x4d\xa6\x24\x67\x03\x0c\x16\xe9\x2e\xa8\xb8\ \xc5\x82\x1b\x9f\x84\x4e\x4b\x63\xea\xfb\xe0\x38\x73\xf0\xad\xdf\ \x33\xa9\x0d\x4f\x24\x9c\x10\x93\x21\x47\xb4\x8e\x26\x98\x9b\x37\ \x38\x66\x4f\x66\xe2\xb2\x59\x22\x5c\x87\x02\x4c\x02\x89\x89\xd5\ \x52\x2f\x6c\x15\x81\x7c\x5e\x7a\x59\xbe\x1e\x9e\x2b\x8e\xc2\x22\ \x80\x0d\x42\x01\x43\x42\x85\xf3\xdb\x23\x7c\x19\xac\x52\x0d\x21\ \x77\x52\x68\xa6\x39\x73\xdb\xac\x60\xf2\x57\xef\x7c\xe9\x43\x39\ \xcf\x6a\x40\x97\xb7\x77\xf8\xd2\x85\xe7\x5b\xcf\xc3\xf8\xca\x2f\ \x33\xbe\xf2\xcb\xc4\xfa\x73\xe8\xd2\x15\xe8\x09\x05\x5e\xa1\xa8\ \x22\x0a\xa5\xb7\x45\x58\xec\x50\xf6\x92\x35\x72\xb7\xcb\xc9\x83\ \x37\xd9\x1e\x3e\xb8\xd0\x91\xdb\xcd\x90\x6a\xb2\xb9\x6c\x0a\xb4\ \xda\x57\xe9\xb6\x2c\x1e\x0e\x5d\xde\xf9\x46\xca\x5f\xbc\xb6\xcd\ \x5f\xfe\xc5\xd7\x98\xf6\xde\xa7\xfb\x42\x1b\xe7\xda\x06\xdb\x61\ \x9d\x2c\x3c\x91\x05\x5b\xc9\x50\x2c\x17\xac\x44\x2f\xef\xcd\x15\ \x79\x25\x4b\x51\x16\x79\xe5\x73\xc7\x83\x59\xf7\xf0\xac\x3b\xe5\ \x78\x30\xfb\x3d\x56\x2c\x81\xdf\xfd\x60\x56\xdc\x79\xa7\x27\x74\ \xe2\xc2\x6d\xa7\x68\x3b\x97\x41\x0b\xe0\xe4\x5d\x19\xbc\x25\x0f\ \xac\x8c\x05\x7d\x56\xed\xc6\x95\x8f\x47\x93\x01\x83\xc1\x00\x86\ \x3a\x6b\x9d\x84\x8e\x9a\x12\x0f\x15\xfa\xc3\x74\xae\xf1\x51\xe5\ \x93\xcb\x42\x7a\xda\x5a\x92\x9a\x94\xce\xd1\x36\x03\x6f\x85\xfe\ \xca\x26\x87\x93\x84\xd6\x70\x32\x47\xa7\x09\x8e\x79\xe6\xad\x37\ \x8f\x89\x0b\x3c\x6b\x59\x39\xfd\x92\x22\x2b\xe9\xb4\xbe\xe8\x82\ \x35\x11\x6b\xa6\x47\xe7\xa4\x38\x71\xa8\x88\xe5\xe6\x73\x19\x78\ \x9e\x0f\x08\xe2\x09\x16\xb6\x80\x29\xc5\x66\xa4\xb9\x56\x6e\x81\ \xa1\xaf\x18\xf0\xf5\xec\xaf\x78\x99\x7f\xf8\x36\xbc\x23\x82\xb5\ \x6c\x8c\x54\xb3\xf2\x9d\x07\xff\x92\xda\xda\x75\x3c\xbd\xc0\x52\ \x91\x52\x09\xe0\xb0\xe8\x4f\xce\xae\x0a\x22\x13\xe7\x33\x2f\x37\ \x60\x6b\x3f\x00\x8e\xf1\x81\x81\xb7\x22\x03\xb4\x64\x27\xf6\xfc\ \x7d\x16\x86\x11\x47\x15\x46\xc0\x68\xc1\xe4\x68\x86\x69\x8d\xa6\ \x08\xc2\x3b\x1c\xb0\xb6\xbd\xc4\x35\x1e\x72\x7a\x3b\xe1\x7e\x07\ \x94\x65\x03\xf7\xe1\x61\x51\xbd\x77\x61\x8e\x27\x16\x8f\x97\xdb\ \x70\x7c\xe6\x73\xb4\xe0\x54\x20\x46\x54\x14\x76\xb0\xa0\x9e\xd2\ \xcb\x4d\xd1\x31\xcc\x7b\xb2\xe0\x5b\x6e\xcf\x32\xf1\x59\xcb\x24\ \x0b\x9a\xf2\xf7\xbe\x7f\xa4\x70\xed\x69\xe8\x3f\x36\x20\x0c\x51\ \x34\x17\x02\x95\x49\x2a\x7e\x57\x45\x73\x19\xd9\x03\x6c\xad\x2e\ \xdb\xc8\xfe\xd4\xa3\x11\x4c\xc1\x15\xef\xcd\xd8\x50\x69\xf4\xd2\ \x42\x6f\xe2\xd0\xd0\x62\x1a\x41\xce\xb8\xd5\xc1\x01\xe2\x61\xb1\ \x88\xb1\xdb\x90\x0c\xc5\x88\x94\x06\x62\x0f\x75\x56\x19\x44\x2b\ \x33\x71\x89\x87\xdb\x1c\xc9\xe0\x19\xb6\xea\x4f\x16\x4e\x15\x90\ \xc4\x84\x8b\x2a\x36\xc5\xcf\xe5\x3e\x66\x67\x2c\xf4\x13\xb6\x51\ \x87\xa8\xb0\xb2\xc2\x91\x6b\x99\x9a\xb2\x13\x25\x96\x38\x96\x54\ \xdc\x05\xb9\x64\x45\x83\xe1\x14\xd4\x5b\x58\x48\x2f\x4b\x41\x50\ \x58\x60\xd4\x07\xe1\xd6\x1c\x14\xf8\x8f\x09\xe4\x5f\xcf\x6a\x73\ \x30\xe3\x7b\xfc\x32\x93\x4b\x3f\x4c\x9c\x5c\x17\x2e\x99\xf2\xac\ \xb7\x3e\x54\x0b\x21\x56\x25\x08\x58\x64\x12\x72\x96\x8b\x77\xf1\ \x83\x37\xee\xf1\xdd\x3f\xf8\x4d\x6e\x9f\x7c\x5b\x34\x1e\x2c\xf0\ \x83\x26\xbb\x19\xa2\x81\xc1\x9a\x0c\x60\xd5\x5a\x92\xfa\x86\x95\ \xd4\x07\xe5\x60\x4e\x69\x76\x14\x42\xb2\x13\x71\x90\xee\x90\x1f\ \xa9\xb4\x07\x21\xf9\x82\x73\x11\xef\x16\x59\xb9\x7c\x9c\x2f\x08\ \x6c\x7c\x3c\x10\x54\x5c\x2f\xab\x00\x9f\x5c\xfc\xfc\x32\x63\x97\ \xd4\x5b\xb5\xfb\x57\xd2\x6b\x65\x26\xb6\xdb\x1a\x93\xbd\x01\x4a\ \xda\x03\x2f\xa7\xdf\xef\xd3\xef\xf7\x19\x8c\x12\x06\xbb\xd0\xef\ \xf7\x89\x0f\x7c\x74\xdd\x22\x48\x35\xfc\x69\x44\x7c\x10\x33\xc8\ \x53\xf0\x72\xc6\xa9\x41\xa3\x27\xb2\xa9\x53\x5b\xa4\x11\x4c\x69\ \x69\x0e\xe3\xbc\x43\x43\xe9\xe3\x17\x06\xe4\xee\xb5\x26\x9d\x96\ \x86\xa2\xb6\xc8\x2a\x30\xc2\x53\x1d\x49\xb5\x59\x76\x34\x97\x89\ \xa9\x24\x8c\x92\x2b\x2e\x31\xb1\xea\xfb\x92\x67\xae\xca\x3c\xc7\ \x7e\x8c\x9a\x5a\xb9\xd8\x5e\x64\x99\x72\xa6\x4e\xeb\x47\xf8\xd3\ \x33\x88\x74\x31\xed\x61\x76\x65\xb6\x8d\x11\x03\x95\x71\xe1\x0a\ \xa4\x95\xc7\x50\x91\x4a\xb7\x92\x27\x76\xe6\x66\xd4\xc2\xf9\x76\ \x74\xa1\x66\x4b\x09\xb1\x22\xf1\xb5\xee\xc1\x16\xf6\xce\x0f\xf3\ \xeb\x59\xed\x3f\x2a\x88\xcb\xcf\x7b\x07\x01\x41\x0e\x46\xbf\x5c\ \xd1\x1f\x5b\xf2\xb2\x25\x3a\x72\x33\x71\x92\x98\xdf\x8b\x8a\x20\ \xcf\x99\xf8\xe1\xac\x03\x54\x14\xac\xa3\xc7\x62\x60\xf3\x78\x64\ \xcc\x4d\x59\x94\x19\x2d\xab\x5f\x92\x9d\xb0\xd2\x67\x62\xae\xd5\ \x9c\xaf\x49\x01\x4f\x19\xe8\xdb\xb5\x75\x8e\x47\x86\x1c\x08\x2d\ \x1b\x1d\x65\x93\x63\x2e\xdb\x14\x3f\x53\x64\x74\x73\xae\x90\x2b\ \x3f\xbf\x97\xf7\x24\x5f\x5c\x3e\x5e\xe8\x9f\x62\x14\x85\xdf\x8a\ \x35\xe3\xb2\xd5\xc9\x63\x82\xbe\x48\x50\x8f\x3b\x1d\xf2\x62\x51\ \x62\x5b\xd1\xe8\x74\x3a\x74\x3a\x1d\x36\xaf\x3a\x6c\x76\xda\x74\ \xda\x9b\x24\x89\xd0\x0e\x5f\xae\xad\x72\xe3\xc5\x75\xba\xd7\xaf\ \xd1\x69\x6f\x72\xb9\xb6\x8a\xd2\xde\xa4\xd3\xde\x04\x3a\x28\xed\ \x4d\x86\x03\x0f\xa7\x93\xa2\xb4\x9b\x05\x9b\x92\xa3\xa8\xad\x82\ \x57\x2e\xf4\xc8\x85\x29\x84\x9b\xf9\x32\x8b\x7a\x86\xc5\xd1\xe9\ \xd9\x9c\x30\x5e\xc2\xb2\xa2\xf1\x51\xf2\xc4\xb3\x13\xa1\x51\xd4\ \x37\x36\x71\xa0\x89\x4c\xac\x99\x33\x0b\x14\xb9\xaa\xb6\xd3\x01\ \xd3\xc2\x3f\x27\x92\xb7\xca\x9d\x64\x45\x86\x4b\xcb\x59\x8c\x42\ \xbe\xa9\xf8\x02\x57\xeb\xa1\x28\x10\xc3\x7e\x84\xd5\xd7\x84\x25\ \x40\x38\x2b\xf2\x6c\x3f\x28\xd8\x8b\x50\x66\x6a\x13\x13\x6f\xed\ \x2a\x1f\x78\xdf\x62\xe7\xdd\xda\x3f\x98\x8d\x7f\x3d\xab\xb1\xf3\ \xae\xf8\x90\x75\xd6\xce\x0e\xd1\x9a\x5a\x74\xe8\x66\xab\x74\x4b\ \x56\x62\x5e\x64\x6f\x8a\x93\x71\xac\x51\x77\x8a\xe9\x90\x73\x3f\ \x63\x6f\x3f\xe4\xe1\x41\x84\xff\x68\x97\xe5\xf6\x0c\x07\x5f\x76\ \xd6\x65\x70\x9c\xc7\xc2\x17\x5a\xa9\x45\x96\x5e\x75\x14\xa9\x61\ \x38\xaf\x3a\x2b\x71\xec\x4a\xea\xcb\x63\x99\x8d\x7b\x79\x8f\x23\ \x4d\x04\x6a\xd9\xa5\xeb\xe5\x3d\x19\xb8\x0b\xbd\x9a\xcc\xc4\xcb\ \x6d\x64\xa6\x2e\x8b\xba\x4e\xd4\xe4\xf1\xe0\x31\x07\xbd\x13\x8e\ \x42\x21\x8e\xbf\xd4\xef\x33\xb6\xa7\x28\xed\x26\x69\x65\xcf\xc8\ \xa8\xe8\xcc\x96\xf4\x5a\xd2\x1f\xb2\xab\xf6\xd8\x79\x38\xc6\x3b\ \x3e\x62\x57\xed\xb1\x37\x3d\x04\xfa\x0c\xe8\xa3\xdb\x21\xba\x1d\ \x62\xac\x5d\xa2\xe9\x1a\xb4\xe9\xa0\x77\x44\xf0\x96\x7a\x89\x86\ \xcd\x9c\x9f\x5b\xe6\x38\x73\xf4\xdc\x95\xc2\xde\x61\xf4\x58\x64\ \xe1\xb6\x3b\xeb\xda\x55\x31\x71\xc9\x2f\x6b\x41\xb9\x3b\x31\x10\ \xdf\x53\xe8\x89\x43\xd1\x55\x3b\x27\x69\xb4\x2c\x53\x8c\xe0\x9b\ \x16\xb9\x15\x48\xbf\x09\x2a\xd9\x56\x0b\x15\x69\xc4\xcd\x28\x16\ \xc6\x28\x51\x28\x9c\x7e\xe2\x09\x49\xa0\x73\x9c\xf7\xc9\x23\xa1\ \x8c\x3b\xe9\x47\xe8\x61\x48\xa0\xa9\x28\x7e\x40\xd8\x37\xb0\xd3\ \x8c\xb0\x9f\x90\x0f\xb6\xd8\xe8\xc7\x8c\x57\x27\xbc\xf3\x76\xfd\ \x43\xb3\xf1\xf0\x0e\xfc\xeb\xb7\x45\xf0\xde\xc9\xc6\x8c\x57\x67\ \x7f\xe8\xf5\x2b\x57\xb0\x8d\xcf\xcc\x4f\x83\x48\x43\xc1\xf0\x82\ \x88\x24\x8a\x14\x8c\x46\x4a\x3c\xd6\x64\xb3\xa3\xc4\xc4\x67\xe1\ \x2e\x71\x78\x20\x29\xb0\x12\x5f\x6e\xa8\x82\xae\xea\x44\x4d\x09\ \x27\x00\x96\xb5\x53\xb2\xf0\x44\x04\xab\xb5\x24\xb3\xe1\x6a\xa1\ \xad\x56\x6a\x8b\x4f\xfc\x7b\x26\x47\xa9\xec\xd8\x1d\x0f\xb8\x70\ \x5c\x6e\x8b\xa2\xad\x5a\xe4\x55\x03\xb9\xcc\xc6\x00\xf1\x28\x9a\ \x3b\x56\x27\x3b\x0e\xf7\x52\xb2\xf0\x84\x61\xab\x4e\xb8\x7e\x95\ \x89\x1f\x72\x3a\x0d\xd8\x3f\x1c\xd0\xef\xf7\x39\x9d\x06\xf4\xfb\ \x7d\x0e\xa6\xa2\x73\x27\xd2\x66\x8d\x8e\x69\xd1\x5e\x37\x30\xdb\ \x35\x3a\xed\x3a\xed\x95\x26\x7a\xb7\x56\x38\x06\x09\x65\x59\xa9\ \x3f\x56\x3b\xe9\x1c\x6c\x68\xa2\x31\x0e\x98\x19\xb1\x14\x01\xdd\ \xb0\x0b\x53\xc7\x61\xce\x4e\x2c\x10\x6d\xdb\x3d\xa2\xed\x1e\x49\ \x38\x71\xfe\x56\x85\x13\x65\x46\x2e\x23\x56\xad\x96\x38\x98\xf9\ \x6c\x73\x7d\xa9\x03\xb6\x72\x49\xaf\x11\x46\x62\xea\x23\x54\xf0\ \xfb\x7d\xfc\x52\xe9\x66\x5a\xc2\x24\xa5\xea\x3f\x61\x5a\x34\x5b\ \x1a\xcb\xad\x4b\xe2\x44\x70\x14\x1c\xd3\x22\x29\xa4\x9c\xbe\xd6\ \x10\xcb\x6b\x34\x15\xf0\x38\x1d\x2f\xb2\xdb\x31\x78\x66\xe9\x65\ \x94\xe7\x7b\xec\xbc\x5b\xe3\x5f\xbf\xfd\xe4\x8c\x5c\x06\x30\x80\ \x77\xf7\xe7\xe4\xf3\xb7\x13\x95\x38\x3f\x38\x27\x96\xaf\xee\xfc\ \x50\x66\x27\x6b\x41\xeb\xc5\xc5\xd6\xa6\xb2\x5a\x2e\xc7\x9d\x86\ \xc9\x2d\x0c\x6b\x0d\xe5\xcc\x97\x01\x59\x36\x39\x72\x7b\x9d\x41\ \x5b\x78\xaf\x95\x7a\xdd\x43\x3f\x67\xd5\x51\x38\x4e\x17\xc9\xc2\ \x13\x9e\x1f\xac\xc9\x00\x5e\xd6\x4e\x9f\xf8\x8f\x31\xac\x35\xce\ \xba\xd3\x39\xec\x5c\x66\x54\xe5\xcc\x27\x5f\x70\x64\x40\x57\xdb\ \xca\x5d\xb5\x08\x52\x65\xa6\x6b\xee\xaa\x11\xbd\xcc\x64\xb9\x8d\ \x84\x1f\xcb\xda\x29\x47\x61\x31\xba\x94\x8f\x58\xeb\x2e\xb1\xdc\ \xbe\xcc\xc6\x92\x41\x77\xa3\xcd\x62\xcd\x66\x7d\xb5\x8d\xbe\xd0\ \xa6\x6e\x5a\x74\x3a\x1d\xb1\xac\xd1\x36\x09\xd2\x59\x72\x68\xd6\ \x6b\x98\xa6\x49\x33\x17\x1f\x25\xaf\x5c\x15\x0f\x25\x49\x38\xe7\ \x22\x94\x24\x21\xa9\x9d\x4a\xaa\xad\x2a\x92\x97\x57\x29\x7b\x76\ \x7f\xe0\xad\xcc\x65\xe2\x12\x4e\xc8\x02\xd0\x71\x64\x46\x8f\x8b\ \x8c\x1c\x81\x98\x76\x9e\xf7\x98\x9c\x05\x74\x5a\x04\xad\x16\x2a\ \x18\x84\x58\x15\x16\x42\xaa\x87\x8a\x06\x41\x69\xa6\x52\x7e\x84\ \x08\xa3\xc0\xa0\x30\x48\x29\x9d\x35\x2d\x2b\x97\xd3\x1e\xaa\x95\ \x0b\x45\x9c\x65\xe2\x03\xef\xef\xef\xc2\xe3\x1b\xd4\xf2\xa7\x04\ \xce\x7d\xbb\x3e\x87\x7b\xab\x85\xdc\x9d\x6c\x4c\x7e\x47\xfc\x53\ \xdd\xa7\x7e\x7b\x16\x14\xfa\x55\x3a\xd6\xf5\x4a\xf0\x7e\x88\x77\ \xdb\xdc\x88\x53\x5d\x42\x9d\x30\x8a\x20\x8a\x48\x4e\x5d\x5a\xfa\ \x3d\xe2\xf0\x80\xd5\xd5\x19\xa6\xdd\xcd\x40\x29\x6c\x54\x85\x6b\ \x8f\xe8\x8e\x3d\x7b\x68\x08\xfb\x2a\x3f\x97\xd9\xf8\x4e\xfb\x80\ \xc3\xa2\x7d\x7d\x9c\x8a\x2c\x6c\x77\x4c\x59\x18\xaa\x93\xc7\x42\ \xe9\x96\xfa\x12\x26\xcc\x06\x24\x45\xa0\x56\x9f\xaf\x66\x62\x59\ \xdc\xe5\x6b\x17\x9e\x2b\x83\x3e\x0b\x4f\xe4\x09\x75\xea\x9d\xd0\ \x6d\x59\x3c\xff\xe2\x47\xa8\x2f\xd6\x08\xf4\x06\x69\xde\x40\xef\ \xd6\x30\xb1\xe9\x98\x16\x1d\xd3\x42\xe9\xb4\xe5\x68\x12\xd8\x72\ \xca\xa3\x9c\xc3\x4b\x92\x90\x91\x12\x09\xf1\x7c\xbd\x26\xc7\xfc\ \x47\x93\xa9\x18\x1a\x2d\xf4\xc7\x49\x12\xd2\x6a\x5a\x8c\x03\x91\ \x91\xcb\x2c\x5c\xc2\x09\xd5\xf7\x81\x06\x99\x21\x30\x5a\xb9\xc2\ \xa1\x74\xbf\x1f\x78\x2b\x73\x22\xa0\xf3\x90\x22\xb5\x53\x89\xab\ \xc7\xea\x14\x75\x6c\x65\x33\xea\xa9\xf8\x27\xa6\x15\xac\xca\x39\ \x3a\xad\x54\x13\x39\xa6\x25\x82\xba\x90\x66\x6a\x17\x2c\x51\x28\ \x3c\xdd\xaa\xcc\x72\xb9\x70\x3c\xaf\x28\xe6\x20\xd4\xeb\xe8\xab\ \x6d\xe8\x36\x69\xad\xdc\xa2\x3d\xbc\x89\xf2\x7c\x8f\x3f\xfd\x5d\ \x97\x7f\xa1\x4e\x2f\xe0\x60\x00\xe5\x79\xf1\x4f\xfd\x49\xe5\x27\ \x79\xf9\xf9\xaf\x73\x37\xfc\x9f\x41\xb9\x01\x91\x52\xe8\x84\x0b\ \xe1\x4f\x21\xa9\x94\x59\xb8\xa2\x81\x2e\x2d\x60\xc5\x54\x4b\x51\ \x08\x86\x17\x47\x8d\x54\x6b\x09\xd5\x5a\xa2\x7b\xb2\x47\x3e\x5d\ \xe7\xc6\x25\x03\x65\x25\x93\xa6\x25\xef\xad\xc6\x73\x83\x9a\x65\ \xf0\x96\x99\xb9\xcc\xd6\xbb\x99\x28\x0c\x17\x86\x11\x47\x21\x1c\ \x1e\x9e\xc8\xa0\x2b\x9b\xb7\x17\x02\xf5\xef\xb9\x9d\x87\x18\xcb\ \x6d\x24\xb4\x50\xad\x25\x26\x47\x29\x87\x7b\x22\x0b\x3f\xf3\xe2\ \x2d\x96\xdb\x97\x59\x6e\x5d\xa2\xdd\x6e\x63\x4b\x81\x79\x25\x40\ \x26\xe2\x6f\x0f\x52\x8d\xb4\x2e\x32\x6e\x1f\x95\xa6\x25\xbe\xa7\ \xa7\x37\xb0\xe3\x9c\xd1\x64\x4a\xaf\x3f\x62\xe7\xf8\x31\x23\x2f\ \xc6\x09\x2c\x6c\x2d\x95\x1c\xb2\xae\x8b\x00\x2e\xb3\x70\x19\xc0\ \xe5\x63\x4f\x75\x80\x31\x6a\x2c\xfe\xf8\xd2\x3c\x3c\x18\xa4\x4c\ \xb5\x75\xda\xee\x11\x6a\x78\xc4\x61\x3e\xcb\xec\xd3\x02\x4e\x94\ \x90\x42\x0b\x84\x8f\x6b\xc3\x31\x50\x1b\xa1\x2a\x2b\xf5\x52\xd4\ \x5e\x06\xb0\x9d\x66\xd8\x69\x86\x1e\x9e\xb3\xb1\x2a\xb2\x6f\x19\ \xb8\x17\xd6\xe6\x16\x81\x20\x97\x2f\x9a\x22\xdb\x96\x46\x85\x69\ \x71\xa2\x94\x5f\xdb\x75\x15\xae\x2d\x76\xb1\x2d\x8b\x4e\xd6\xe4\ \x0b\x9f\xff\xe2\x5c\xe0\x96\x90\xa2\x84\x11\x6f\xbf\x29\x84\x07\ \x1f\xef\xfc\x02\xfb\x0b\x2b\x1c\x8c\x7e\x19\x4f\xbf\x2e\x5c\x3a\ \x4d\x93\x64\x30\x28\xe8\xb2\x73\x53\xd2\xe7\x94\x6a\xf2\x14\x33\ \x73\x4c\xd3\x14\xac\x85\x25\x0a\xdd\xf1\xa9\xc7\x61\xfc\xd4\xdc\ \x3c\xdc\x5b\x7b\x39\xe3\xe3\x3d\x54\xee\xf1\x63\x2f\x3f\xc5\xad\ \x97\x3e\x8a\xbb\xfc\x31\x39\x82\x54\x06\xf2\xf1\x40\x60\xd0\x9d\ \xfd\x0e\x59\x78\xc2\x19\x6b\xd8\x1d\x81\xa7\xcb\x06\x49\xb5\x71\ \xe2\xf9\x95\x69\x72\x3f\xbd\x10\xd4\xe5\x73\xe2\xd8\xff\xd0\xa0\ \x3e\x1e\xcc\x98\x8b\xc9\x51\x2a\x83\xbc\xdb\xb2\x58\x6e\xc6\xd4\ \x17\x6b\xac\x6c\x26\x42\x4f\x1c\xa9\xc2\xc2\xb5\xd0\xf8\x96\xbe\ \x10\xe5\x73\x79\x7f\xc0\xfe\x78\xca\xc9\xf1\x01\xb7\x1f\xee\xf3\ \xfa\x07\x77\xb9\xfb\xc1\x07\x7c\xf7\xfe\x2e\x0f\x0e\x0f\xd8\x9d\ \x84\x44\x64\x82\x9e\xa3\x7f\xa1\x39\x32\x0b\xd6\x99\x87\x85\xa7\ \x8a\x2c\x5c\xfa\xb8\x95\x16\x5a\x67\xe1\xae\x84\x11\x1f\x76\x53\ \x9b\x22\x70\xcd\x39\x6a\x54\x50\x6c\x7a\x18\xcd\xfb\x12\x6b\x28\ \x85\x07\xb1\x27\xc9\x31\x3f\x56\x70\x4a\xf1\x4c\x91\x79\x4b\x5d\ \xb1\x71\xce\xab\xb8\x2c\x0a\xcb\xc5\xe3\x61\x18\x91\x72\xb1\x19\ \xe2\x54\x2e\xed\x21\x16\x5a\xa7\x58\xb4\x68\xc1\xb5\xe6\x0f\xf0\ \xf1\x4e\xc2\xd6\xc6\x37\xd9\x79\x77\x02\x1f\x9d\xf2\xea\x9d\x2f\ \x71\x27\xfb\x33\x00\x3e\xf6\xe2\x3d\xda\xc3\x9b\x5c\x7d\x41\xe7\ \xd9\xcd\x97\x85\x01\x92\x9c\x30\x89\xf8\xce\x77\x1e\xb1\x5a\xdf\ \x25\x5b\x58\xc2\x6e\xc0\xae\x1f\xb2\xe1\x58\x2c\x75\x8a\x00\x0d\ \x23\x82\x7e\x8f\xb8\x63\x16\x89\x7a\x42\x4c\x9f\x28\x99\x51\x71\ \x83\xb6\x45\xfe\xf8\xb6\xcc\xd0\x0b\xbd\x1a\x3d\xe0\xad\xbd\x1e\ \x8d\xe5\xcb\xfc\xd0\x0b\x2a\x57\x3e\xf5\x0c\x2b\x1b\x47\xfc\xed\ \xff\x73\x83\xbf\x7b\x5f\x83\xfc\x35\xba\x47\x45\x3b\xd7\xd1\xa8\ \xaf\x68\xac\x58\x4b\x64\x85\x41\x8a\x1f\x34\x89\x07\x8f\x99\x1c\ \xef\xd2\xcb\x4c\x32\x3f\x65\xcc\x14\xd7\xb1\xe8\x67\x03\xf4\xc0\ \xc4\x75\x34\xa0\x4f\xe6\x37\x51\x9d\x4e\x11\xb4\x85\x13\x10\x53\ \x5c\x3a\x78\x7e\x88\xeb\x5c\xd4\x36\x2c\xb7\x41\xb5\x34\x0e\xa6\ \x8e\x5c\xed\xad\xe6\x23\x36\xaf\x3e\x45\xa3\x2b\x4e\xfc\x47\x7b\ \x09\x56\x3a\x00\x06\xc5\xea\x62\x70\x6a\xe2\xb8\xaf\x0e\x68\x16\ \x5a\x06\xe1\xe9\x51\x9c\x58\x51\x48\xa7\xd3\xa4\x5e\xd0\x96\x1d\ \xd3\x22\xad\x17\x54\xe4\xb0\x8f\x47\x4e\xb3\x08\xde\x20\xd5\xb0\ \x99\xd9\xc8\xba\x99\x2f\x83\x17\xd5\x21\x73\x1c\x86\xa3\x90\xe5\ \x26\x8c\x6d\x81\xbb\x17\xac\x0d\x06\x1e\xd4\xd8\x97\xc1\x3c\xf0\ \x56\xe4\x4e\x12\x80\x24\x73\xd0\x64\xe7\xae\xd0\x26\x17\x7c\xb3\ \xf4\x27\x0e\xb1\xa4\xbd\x2a\x51\x02\x08\x97\xf4\xf3\x2a\xfa\xf2\ \x72\x6b\x22\x96\xc8\xb4\xc6\x0d\xfc\x62\x75\x58\xc9\x1d\xfb\x85\ \x49\x77\x79\xa4\x32\x2c\x5a\xf5\xa8\x28\x67\xec\xac\x88\xd9\x65\ \x1f\x70\x8d\x3a\xff\xd5\x47\x3f\xc2\xee\xf5\x67\x78\xe5\xe1\xfb\ \xfc\xf4\xed\xaf\xf0\xbc\xfa\xb7\x02\x37\x0d\x6f\xf2\x85\xcf\x7f\ \x91\xd6\xca\x2d\xd6\xeb\xcb\x72\xd4\xdf\x2a\x0b\x52\x33\xa4\x7e\ \xf3\x19\x0e\xef\xbf\x0f\x27\x3a\x6b\xdd\x26\xd7\xcc\x70\x6e\xa8\ \x54\xb5\x72\x74\x4b\x74\x97\xc4\x89\xd9\x21\xf2\x32\xfa\xb1\xc5\ \x52\x57\xe7\x23\x2f\x75\x69\x3f\x7d\x99\x77\x6e\xff\x07\xb6\x5e\ \x7f\x0f\xff\xd1\xee\xec\xd2\xed\xc1\xfb\x6f\xde\xe3\x6b\x03\x8f\ \x1f\xfc\xcf\xee\xf3\xc9\x4f\x7c\x9a\xab\xbf\xf4\x73\xdc\x7a\xe7\ \x36\x6f\xbc\x7a\x1d\x9f\xf7\x71\x8e\x37\x50\x96\x0d\x89\x9b\xc5\ \x7f\x77\x24\xfd\x8b\x7b\x99\x89\xe7\x87\xc4\x4e\x0d\xc3\x17\x99\ \xb8\xe3\xe4\x78\x45\x56\x6e\xd0\x44\x75\x46\x32\x90\xc7\x84\xb8\ \x95\x2c\xd1\xa0\x46\x8f\x94\x2e\x33\x2d\x71\x95\x1b\x06\x0b\x56\ \x80\xbb\x22\x6b\x5f\xbf\x76\x8b\x2b\x37\xaf\x73\xe9\xc6\x66\x31\ \xc2\x50\x38\x3e\x15\xff\x4b\xbd\x48\x4c\x5d\x20\x9d\xb6\xd0\x6a\ \x43\x3a\x99\x22\x18\x08\x33\x93\xc5\x5b\x75\x25\x18\x64\xf4\x51\ \x51\xa2\x09\x4e\xcd\x94\x01\x0c\xa0\x7a\x0e\x74\x52\x19\xc0\x79\ \x63\x8c\x37\x76\xc4\xe3\xc0\x41\xd7\x2d\x22\x1a\xa8\x81\x29\x33\ \xf1\x8d\x4b\x06\x03\x6f\x1d\x06\xfb\xd8\x6d\xad\xc0\xc7\xf3\x58\ \x58\x14\x85\xce\xdc\xf0\xa9\xdc\x63\x27\xc5\xec\x16\x28\xa1\x82\ \x6a\x26\xb3\x82\xc8\x32\x71\xc2\x48\x76\xe4\xe2\x0a\x56\xd6\x42\ \x05\x5f\x0d\xb0\xac\xfc\x82\x2d\xab\x66\x9a\xa4\x51\x24\x8f\x16\ \x33\x75\x5c\x5a\xd1\x50\x94\x41\x1d\x86\x0a\x76\x9a\x0b\x89\x26\ \x26\x53\x7d\x99\xe5\x16\x7c\xe1\x3a\x6c\x7d\xe3\x26\xbf\xf5\x78\ \x99\x17\x6f\xbd\xc6\x8f\x7e\xe1\x5f\xb1\x79\x6b\x1d\x3b\x2a\xf6\ \xdd\x45\x9c\x9b\xc1\x52\x58\x30\x15\xb2\x67\xae\x8a\xb3\xbc\x5b\ \xc7\x2a\xf7\x89\x16\xda\x08\xcb\x34\xcf\x95\x7c\x39\xb0\x80\xdb\ \x1f\x01\x36\x86\xe2\x89\xa5\x8f\x4f\xe2\x7d\x95\x26\xbd\xe1\x88\ \x3f\x7e\x4b\x8c\xee\x7b\x67\x47\x18\xcb\x9f\xe3\xc7\xaf\x2d\xf2\ \x89\x8d\x0e\xdb\x7b\x1d\x8e\x0f\x0e\x51\xc3\x23\x1e\xaa\x22\xd3\ \xe4\x47\x2a\x0f\x0f\x22\x26\xc7\xbb\x9c\x8e\x0c\xc6\x14\x12\x4b\ \x5f\x1c\x5d\x27\xc2\x2b\x24\xaa\xe2\x3e\xb8\x88\xe0\x6d\xf8\xb5\ \x27\x66\xdd\x6e\x65\x4f\x5c\x2f\xef\xb1\x0c\xac\xac\x3e\x87\x6d\ \x8f\xb8\xb6\xbe\xce\xa3\xfb\x0f\xe8\xf5\x15\xbe\xf8\x99\x0e\x37\ \x57\x72\xdc\xee\x0a\x0b\x56\x9d\x34\xb7\x30\xea\x1d\xb4\x49\x84\ \x55\x0c\xd5\x96\x59\x55\x9b\x44\x60\x4e\x49\x8b\xd7\xc5\x7b\xa6\ \x0a\x0b\x40\x2d\x9d\x33\x53\xa1\x92\xe6\x3c\x35\xa7\x59\xb0\x18\ \x49\x12\xe2\xdb\x21\x76\x92\xd2\x47\xa3\xab\x6a\xe4\x5e\x8e\xa7\ \xce\xe0\xc5\xf9\x9b\xcc\xc4\x45\x81\x57\xb2\x14\xab\x4a\x32\x27\ \xdf\xd4\x82\x96\x1c\x46\x4d\xed\x14\x83\x27\x6c\x14\xbd\x70\xb3\ \x4c\x39\xae\x54\xbe\x65\x9a\x55\x32\x17\x8a\x1c\xeb\x11\x2e\x98\ \x79\xa5\xbd\x6c\x49\x09\x67\xd9\x6e\x0e\x0b\xef\x8a\x92\x97\x4e\ \x2b\x30\x26\x2c\x27\xac\xe3\x09\xf6\x48\x63\x94\xa7\xe8\x76\x82\ \x6d\xd4\xd9\xcb\x6a\x74\x9e\xdd\x42\x7b\xa8\x70\x9c\xff\x2c\x97\ \x17\x4d\x16\xc8\xc0\x9c\x59\xbf\x5a\x91\x22\x8a\xd2\xb2\x33\x17\ \x28\xa8\x5a\x83\xfa\xa4\x47\xd4\x1f\x48\x08\x24\x3b\x75\x4f\x5a\ \x8a\x16\xf6\x19\x8d\x43\x9a\x45\x76\x4e\xc7\x27\x6c\x6f\xdd\xe3\ \xdd\xf7\x1e\xe3\x9a\xf3\x05\x54\xb7\x65\xf1\xa8\x77\xc4\x1f\xbf\ \xf5\x88\x3f\x7e\xeb\x11\x1f\x7f\xe6\x11\xef\xdf\x5a\xe6\xe6\xa6\ \x8d\xaa\x7d\x9a\xcb\xf9\x1e\xf7\x07\x0a\x0c\x0e\xd9\xcd\x60\xf2\ \x68\x97\xe3\x01\x78\x7e\x8e\xeb\x8c\xc0\x37\x49\xec\x09\xf9\x28\ \xc7\xd0\x4d\x19\xc0\x02\x1f\x8b\xfb\xfd\x6c\x40\xc7\x69\x8b\x23\ \x6d\x09\x21\x24\x04\xa9\x24\x8c\xae\x1a\xf1\xe9\x85\x15\x8c\xb5\ \x16\x76\xbb\xcb\x83\xc7\x31\x2b\x16\x1c\x76\x72\x1a\xcb\x97\x49\ \xcd\xab\x74\xac\x19\x3c\x88\x27\x3d\xb4\xca\xb8\xbe\x36\x11\xc2\ \x1a\x0d\x5b\x14\xee\x93\xf3\xdb\xa9\x32\xce\x39\x6c\x8b\x91\xa6\ \x89\x38\x09\x95\x68\x02\x8d\x99\x78\x9e\x54\x58\x5d\xe1\xd6\x18\ \x91\x92\xbb\x0a\xc5\x8c\xa9\xcc\xce\x42\xe0\x3e\x9f\x89\xcb\xcc\ \x5b\xf2\xc5\x2d\xb6\x67\xed\xe5\x00\x1a\xc5\x74\x88\x9c\x12\x29\ \x8a\x3c\xdd\x2a\x27\x94\xad\x52\xe7\x10\xce\x63\xe4\x48\xd0\x68\ \x46\x45\x7d\xe6\x44\x96\x5c\x18\x63\xa7\x19\x9e\xa3\x14\x7b\x3f\ \x66\x25\x93\x53\x1d\x5f\x2a\xe6\xed\xca\xad\x19\x56\x14\x51\x6e\ \x75\x88\xc2\x10\x2b\x35\x45\x00\x17\x2e\x3b\x4d\x25\x23\x34\x73\ \xea\x96\xc5\xb3\x5a\xc4\xfd\xad\x9f\x27\xdf\x3c\xe6\x27\xba\x75\ \x0c\xb3\x0f\x74\xa4\x5b\x50\xd5\x2e\x36\x2c\x32\x31\x40\x43\x09\ \xa1\xd3\x91\x85\x80\x45\x58\x08\x93\x8a\x1d\xd1\x61\xb9\xca\x61\ \x16\x0c\x4a\xab\xce\x58\xab\x95\x12\x3c\xf2\xe3\x18\xd7\x3c\x94\ \x4d\x85\xf2\x76\x3a\x32\x68\xb5\x5b\xe0\x41\x2f\x85\xbf\xb9\xf3\ \x88\xb7\xf6\xca\xae\xd9\x43\xd9\x70\xe8\x65\xe1\x5c\x80\xba\xf9\ \x2c\xe3\xea\x41\x5d\x2e\x2c\x8a\x93\x08\xa3\xb0\x53\x4d\xec\x09\ \x7a\x50\xa7\xa3\xb6\x0b\x9c\x5c\x27\x23\x95\xb8\xb9\x85\x5b\x64\ \x66\xf1\x3e\x74\xd5\x08\xa3\x69\xd2\xb0\x2f\x71\x65\x25\x07\x12\ \x82\x9a\xca\xdf\x85\xd0\x6d\xde\xe0\xc5\xce\x2a\x37\x37\x0d\x1c\ \x7d\x4c\x4e\x1d\x3d\x50\xd1\xed\x4c\x14\x74\x72\x99\xa4\x2d\xbb\ \x60\xe7\xe7\xd8\x6c\xad\x4e\x50\xbc\xa7\xd5\x2c\x2c\xda\xd2\x16\ \x03\x90\x70\xa2\xba\x85\xb4\x67\xe7\x98\x05\x3e\xee\x78\x39\xfd\ \x4c\xbc\xe6\xa9\x0e\x49\x12\xa2\x05\xb3\xac\x3c\x3e\xf5\x18\x58\ \xcf\x4a\x0c\x1c\x0c\x52\xda\xed\x23\x0e\x07\x3a\x3f\xa6\x05\x24\ \x99\xf3\x44\x48\x21\xdb\xce\x8a\x1f\x40\xa4\xe3\xfa\x79\xe1\x9f\ \x36\x7f\x4b\x09\x65\x03\x40\x2b\x98\x85\x12\x0a\xd8\x46\x5d\xfa\ \x53\xa4\x17\xa4\x9a\x4f\x30\x9e\xaa\x70\xb4\xae\x9f\xa3\xf8\x39\ \x56\x6a\x12\x6a\x11\x4a\x49\xbb\x35\x0d\x68\x1a\x58\xa9\xc9\xc4\ \x0f\x09\xb1\xb9\x7a\x45\xe7\x85\xee\x9f\x8a\x4b\xb0\xb2\x36\xe7\ \x16\x54\xde\x0f\x2b\x98\x37\x4b\xc7\x60\x89\x25\x07\x96\x69\xd2\ \x31\x4d\x30\x3b\x73\x3c\x38\x96\x39\xa3\x11\x73\xf1\x77\xbb\xae\ \x8d\x6a\x07\x9c\x45\x19\xbd\xdb\x03\x76\x46\xce\x05\x2a\x6b\xe0\ \x88\xa2\xcd\xf3\x4d\x3c\xe3\x59\xba\xed\x0e\x69\x7b\x83\xde\x00\ \x86\x83\x21\x77\xdf\x7a\xc8\xab\x6f\x3d\xe2\xf5\x87\x87\xf4\x06\ \x02\x1e\xc8\x2c\xab\xcc\x02\x35\x4e\x22\xe2\x24\x2a\xf8\x6d\x13\ \x37\x8f\x64\x70\x27\xf6\x44\x64\x60\x35\xc7\x75\x2c\xc6\x4c\xf1\ \xfc\x90\x56\xe0\x56\x58\x8a\x59\x00\x7f\x7a\xa1\xcd\xf2\x52\x01\ \xcf\xcc\xab\x92\x27\xde\xbc\xa6\x61\x6e\xde\x90\xfa\xe1\x34\x6f\ \xa0\xdb\x99\x18\x0e\xb5\x33\xf4\x40\x9d\x9b\x59\x33\x2f\x4c\x14\ \xdb\x04\xe9\x64\xae\xb9\x71\xfe\x96\x9b\x75\xfc\x69\x34\x37\x01\ \x22\xdc\x2b\x6d\xec\x20\x2c\xae\x2a\xb3\xf4\xe6\x66\x42\x5c\x94\ \xda\xb3\x9f\x56\x2e\x65\x2f\xa9\xb6\xea\xed\x30\xb5\xd1\x55\x1f\ \x37\xf3\x19\x91\x4a\x0d\x45\x49\xb5\x8d\xfd\x18\x5d\xec\xd0\x98\ \x10\xc4\x00\x13\xd1\x75\x2b\x60\x82\x53\x66\xd1\xca\xf8\x52\x89\ \x85\xd3\xc2\x38\x5b\xc2\x85\x62\x1c\xdf\x2a\xee\x5b\x55\xc6\xa0\ \xc2\x4c\xa4\x73\x6b\x09\x98\x1b\x22\x0d\xac\xc9\xec\x22\x37\x8a\ \x09\x3b\x29\x9d\xa2\xc3\x77\xd4\xff\x4f\xa1\x53\x4a\x39\x43\xc2\ \xc2\x26\x40\x40\x89\x19\x33\x21\xbc\x36\x8b\x8c\x62\xe6\xf4\xfb\ \x03\xa9\xb6\xd3\x0a\xcd\x44\x29\x3e\xc2\x2a\x1d\x3d\x33\xc6\xa1\ \x45\x03\x11\xf0\x47\xe3\x87\xc2\xae\xea\xf4\x8d\x0f\xc5\xa2\xb1\ \x53\xa3\xcb\x7b\xe2\xf2\xe7\x37\x41\x2f\xd8\x84\x36\xb4\x80\x1e\ \x29\x86\x3f\xc5\xf3\x9f\xf0\x8f\x2f\x60\x44\x35\x0b\x97\x01\x5e\ \xc5\xc7\x5e\x91\x0e\x5c\x27\x2a\x8a\xbc\xb2\xd8\xd3\x8a\x4c\x6c\ \xb1\xd6\x5d\xa2\x61\x77\xa8\xaf\x2e\xc8\xb1\x7c\x50\x58\xeb\x2e\ \xcd\x35\x37\xce\x27\x94\xa4\x08\xe0\xf3\x9b\x57\xab\x33\x6c\x60\ \x4b\x49\xe6\x93\x6e\x65\x61\x57\xcd\xce\xba\x6e\x61\xc7\x62\x0d\ \x46\x99\x8d\xd7\x8d\xa9\xcc\xc0\x9e\xee\xc8\x79\xb9\xb3\x22\x9e\ \xce\xef\xad\xb6\xdb\x1a\xc1\x20\x65\x55\x49\xa4\x8a\xad\x6c\x63\ \xa7\xa4\xa8\xbe\x4f\xe6\x38\x32\x90\xd5\xb2\x55\x2c\x47\xd6\xcb\ \x82\x26\x0a\x45\xa6\x2c\x2d\x58\x4b\x21\xbb\x29\xba\x73\x8e\xa4\ \xd3\x84\xd9\xb6\x2c\xd0\x2a\x19\xb2\x0c\x5a\x2b\x52\xb0\xa2\x08\ \xfb\x34\x94\x43\x98\xaa\xe2\x10\x68\x2a\xb9\x23\xcc\xae\xcb\x6c\ \x1c\xc4\x93\xb9\xe5\x34\x61\x91\x2d\x57\x3a\xff\x9e\xb5\xcd\x87\ \x52\xca\x59\x9e\x24\xe5\xb6\xd1\xb4\x82\x75\xad\x64\x22\x03\x35\ \x26\x60\x74\x16\x72\xb6\x17\xe1\xf7\xfb\x78\xfd\x03\xa2\x28\x62\ \x2f\x88\xe8\x13\x32\xee\x4f\x88\x22\x85\x2c\x1d\x33\x0e\x22\xa2\ \xfe\x80\x47\x7b\x3e\xf9\x71\x7c\xa1\xdd\x5b\x75\xb9\xec\xa2\x91\ \xf9\x4d\xf0\x40\x75\x46\xa8\xf9\x88\xcc\x4f\xf1\xfc\x50\x06\x70\ \x99\x5d\x65\x51\x98\x1c\x3f\x59\x1f\x9b\x44\x17\x30\xb1\xeb\x44\ \x73\x59\xbc\x2c\x06\xcb\xf0\xe9\xaa\x16\x57\xd6\x2c\x36\x94\x58\ \x66\xe1\xd5\x8a\x66\xe2\xfa\x35\xd1\xdc\xb8\xb4\xbe\x8c\x65\xd5\ \x45\x16\x0e\xc4\xba\x86\x24\x88\xd0\x6d\x93\xa4\x92\x8d\xa3\x39\ \x18\x81\x84\x0f\x65\xfb\x39\x48\x27\x04\x86\x72\xa1\x39\x92\x9b\ \x75\x9c\xda\xac\x4d\x5d\xe5\x89\xf5\x40\xc5\xd6\x52\x19\xc0\xe5\ \xd8\x7f\xc9\xb1\x2c\xcc\xef\xdf\x9a\x5d\x07\x06\x22\x38\x0f\x73\ \x7d\xe6\x8a\x59\xb4\xac\xcb\x2e\xa0\x9c\x76\x06\xd4\xb2\xf5\x8b\ \x65\x8a\x0e\xdc\x39\x0b\xd4\x28\x0c\xa5\xc8\xa7\x0c\xd4\xb2\x79\ \x51\xbe\x5e\x85\x1e\x56\xa4\x10\xa0\x16\xde\x6b\xa2\x71\xa2\xf8\ \x81\xcc\xbe\x0b\xb9\xd8\xa3\x91\x36\xb2\x62\x0b\xa9\x60\x40\x72\ \x6c\x49\xfd\xc8\x5f\xba\x02\x3f\x9e\x57\x1b\x1c\x6c\x5f\x97\xc1\ \x29\x57\xe5\x56\x27\xb0\xab\xcd\x8c\x02\x22\xd8\x96\x45\x73\xbd\ \xc7\x71\xfa\x06\xdf\xf7\xbe\x0a\xfa\x9b\x8c\x03\x85\x86\x2d\x4c\ \x62\xfa\x39\x78\x9e\x90\x03\xb6\xfa\x23\x46\x67\x21\xc9\xde\x23\ \xe2\xf0\x00\x2f\x5a\xc5\x68\xf5\x58\x5d\x5d\x92\xed\xe7\xd5\xd5\ \xa5\x59\x57\xcc\xd1\xc0\xed\xe0\x45\xcf\x92\x29\x4d\x09\x15\x0c\ \x7f\x2a\x03\x30\x4e\x22\x19\xbc\xaa\xbe\x4c\x9c\x44\x68\x0c\xe7\ \x82\xb7\xcc\xca\x25\x6e\x4e\xec\x09\x78\x22\xa0\xdd\x3c\x9a\x73\ \xdc\x15\xc1\xdc\xc1\x68\x9a\x28\xb5\x45\x1a\xf6\x25\xea\xab\x97\ \x59\x1d\x45\x1c\x36\x4d\xc6\xc7\x29\x76\x5b\xc3\x5c\x5d\x67\xe9\ \xa9\x45\xec\x92\x7a\x8c\x14\x92\xca\x25\x3c\x2a\x82\xcc\x53\xf3\ \xb9\xbd\xd7\x65\x20\x27\x81\x3a\x17\xc0\xb6\x56\x97\xef\x6f\x55\ \x57\x01\xe0\x4f\xa3\xbf\x37\x63\x97\x81\x5d\x16\x75\xe5\xe3\xb3\ \xa2\x71\x33\x3e\xf5\x64\x16\xae\x76\xf0\xec\xb6\xc6\xaa\x16\xc8\ \xef\xe1\xa9\x0e\x0d\x5b\x7c\x9f\xaa\x12\x4e\x8f\x8a\x0e\x9b\x9c\ \xce\xb0\x2a\xc6\x29\x9a\x0a\x56\x77\xbe\x0d\x1d\x4e\x24\x37\x25\ \x16\xd3\x98\x78\xc5\xc4\x47\xc7\x34\xf1\xa3\x90\x7a\xd1\xcc\xa8\ \x0f\x8e\x50\x8a\x3d\x64\x81\x95\xa1\x98\x39\x5b\x96\x85\x43\x26\ \xa8\xae\x28\x92\xd8\x59\x29\xb7\x29\x99\x39\xa3\xde\x08\xa5\xdb\ \x04\x84\xcb\xbc\xae\x3e\xc7\x78\x75\xc2\x33\x4b\x0f\x81\x2f\x14\ \xdb\x94\x94\x73\xeb\xc1\x22\x89\xc6\x75\xd3\x82\xa8\x47\xdf\xdc\ \xe7\xdd\xdd\x3f\x83\xf4\x35\x00\xde\xef\x89\xbf\xf1\xb9\xa5\xcf\ \x22\xfc\xf5\x2c\x3a\xb6\x49\x98\x5b\xdc\xed\x8f\x21\xab\x73\x7c\ \xf8\x16\xc3\xe4\x16\xf0\x80\x9b\x2b\x87\xb2\x95\x6c\x58\x6b\xac\ \x71\x20\x0d\x00\x0f\x8a\x6e\x82\x72\xe6\xd3\x48\xf6\x64\xa6\x2c\ \x31\x6d\x6f\x00\xdd\x36\x68\x83\x21\x29\x2d\xd2\x4a\xf1\x56\x3e\ \x2e\x03\xb8\x84\x14\x71\x12\x41\x1b\x0a\xef\x6b\x12\x7b\x82\x17\ \x08\x26\xa3\x15\xd4\xc8\xfc\x1a\x6e\x3e\xa2\xab\x2a\xac\x3a\x16\ \xd7\x36\x35\x16\xb4\x36\x93\xc3\x3d\x0e\x57\x2f\xcb\x69\x88\x35\ \x33\xc1\x59\xde\xc7\xb4\xae\x91\xb2\xc0\x70\xd8\xc2\x69\x0e\xd0\ \xbc\x13\x52\x77\xe6\xdd\x90\xd8\xe0\x06\x2a\x04\xc5\xff\xd6\x36\ \x99\xd9\xbb\x22\x03\x53\xf0\xbf\xa9\x74\xcd\xbc\xe4\x19\xf8\xae\ \xc8\xd4\x83\x82\x27\x16\x81\x6d\xcb\xe2\x2f\x09\x22\x9a\xe4\xc2\ \x80\xbb\xd0\x58\xf4\x93\x10\x5d\x9d\xf1\xcd\x79\xbf\x28\xc2\x17\ \x5d\xa6\xda\x3a\x67\xe1\x2e\xab\x35\x75\x2e\xa0\x0f\x53\x9b\x85\ \x51\xb1\x6a\xb7\xe0\x99\x1b\x8e\x03\xc1\x0c\x17\xab\x06\xa1\x98\ \xce\xc0\x22\x0e\x15\xfa\x05\x4e\x09\x34\x55\x72\xc3\xe5\xe4\x72\ \x75\x49\xa2\x16\x2a\xf2\xd2\xaf\x87\x82\x9a\xb2\xa2\x08\xd7\xcf\ \xd1\xc3\x10\xe5\x60\xca\xe9\x78\x91\xbc\xf7\x50\x16\x81\x66\xa7\ \x23\x9c\x30\x9f\xd0\x02\x2e\x0b\x44\xd3\xb2\xb8\xb4\x7e\x95\xc4\ \xb2\xa4\xa6\xe1\xda\xe5\x90\x56\xf0\xf3\x1c\x6c\x5f\x17\x2a\xb5\ \x48\xe1\x71\xd8\xe3\x9d\xed\xbf\xe4\xfb\x93\x2d\xfc\xa8\x3f\xd7\ \x8a\xf4\x92\x8c\x1d\xf5\x88\x77\xb7\xfe\x07\xde\x3f\x79\x55\x06\ \xaf\xbc\x64\x27\x19\x53\x42\x82\xa8\x47\x18\xf6\xa1\xd0\x8f\x1c\ \x9d\x9e\x31\x7a\x0c\xde\xf1\xdb\x73\x1a\x61\x63\xc5\x94\x73\x74\ \x6b\x35\x4b\xb6\x8c\x95\x33\x5f\x52\x5e\x73\xf4\x53\x50\xa7\xab\ \x41\x6f\x20\x02\xf6\x49\xb0\x41\x14\xca\xc3\x39\x66\x42\x69\x2a\ \xf4\x33\x05\x75\x34\x00\xb7\x60\x30\x98\x1d\xc7\x4c\xe9\xb6\x2c\ \x8c\xa6\xc9\x95\x7a\x8b\xfa\x69\x93\x83\x74\x47\x66\xe2\xea\x6d\ \xa9\x75\x93\xd5\x85\x18\x27\xf6\x69\xeb\x23\xb9\xba\xa1\x84\x0f\ \x26\xd0\x0d\xce\xd9\xd8\x06\x62\x61\xa2\x5d\x3e\xef\x09\x61\x8f\ \x1d\x84\x22\x48\xbd\x29\x76\x6f\x82\x4f\x82\x3a\x39\x12\xc1\x3d\ \x6e\x90\xa7\x9e\xc4\xd8\xd5\xa6\xc7\x79\x46\x63\x3e\x33\x8f\x59\ \xec\xb4\x65\x26\x06\x61\x81\xf0\x24\x58\xa1\x36\x05\x84\x28\x33\ \xf1\x38\x10\x22\x7b\xd5\xf7\x05\x3b\x11\x63\xc9\x81\x4f\x2c\x93\ \xe6\x13\xd8\x89\xaa\x07\x9b\x55\xc2\x0f\xc1\x42\x91\x04\x3a\x56\ \x2a\x2a\xfd\xb0\x1f\x31\x1a\xa6\x58\x7d\x8d\xe3\xbc\x4f\x53\xc9\ \x88\x6e\x6c\xca\xc5\x8c\x73\xad\x67\x33\x2f\x4c\xb4\xc5\xd1\xb2\ \x04\xcd\x56\x62\xe0\x52\x34\x5f\x42\x99\xa1\xfd\x9b\x22\x10\xa2\ \x0e\x29\x21\x5b\x8f\xbf\xcb\x1f\xde\xfe\xb7\x7c\xf3\xce\x7f\xcf\ \x7b\xdb\xaf\xe2\x85\x33\x06\x21\x1f\x4e\x38\x39\xfe\xd3\xb9\xe0\ \xad\xde\x37\xf5\x08\xb3\xd3\xc6\xe9\x74\xb0\x3a\xe2\x32\xd9\x31\ \x42\x76\xa3\x43\xb1\x5e\xab\xd5\x9b\x5b\x49\x50\xfa\x0f\x67\xe1\ \x89\x14\xed\x94\x01\x3c\xb4\x3d\xdc\x7c\xc6\x34\x94\xc7\x5e\x3a\ \x1f\xac\x4f\xba\x95\x01\x5e\x32\x15\xf9\x28\xa7\xa3\xe6\xa8\xfa\ \xf2\x1c\x35\x57\xb6\x8f\xdd\x5c\xb0\x11\x6b\xdd\x25\xce\xda\x2e\ \x93\xc5\x11\x6b\xda\x15\xc6\xc7\x29\x87\x85\xfc\x32\x18\xa4\xdc\ \x3b\x78\xc4\x64\x6f\xc0\xe5\xf6\x0d\x6a\xed\x53\xc8\x66\x7c\x6b\ \x9e\x7a\x12\x2e\x8c\x2a\x7b\x33\x66\xcf\x47\x8c\x50\x64\x20\x27\ \x41\xc4\x70\xe0\x11\x1f\xf8\x0c\x07\x1e\xc3\x81\xc7\xe8\x6c\x9b\ \xfe\x63\x83\x24\x88\x38\x53\x4f\x18\x8c\x12\xf2\xc1\xa8\x08\x76\ \x4d\xb2\x12\x81\x9d\xcf\x69\x2a\x3a\x6a\x3a\x87\x99\x8f\xb3\xf9\ \x93\x48\xee\xa8\xae\xdc\xaa\x70\xa2\x84\x11\x25\x53\xe1\xa9\x8e\ \xb0\xb1\x32\x08\xe5\xe8\xbd\xc1\x6c\x4c\x47\x21\x90\x10\x22\xaa\ \xd0\x66\xe5\x06\x24\x2c\x13\xc7\xb4\xd0\xed\x44\x70\xbc\xe9\xfc\ \x2f\xe0\xda\x2d\xd4\x56\x87\xdc\x12\x70\x22\xd4\x22\x29\x34\xaa\ \x1a\x4b\x95\x38\xdb\x27\xc4\x2a\xb4\x0d\x61\x18\x11\x86\x82\x4b\ \xb6\x2c\x93\x38\x9a\x15\x00\x86\xd9\xe7\xbd\xed\x57\xb9\x7d\xfa\ \x15\xa1\x05\xd8\x4f\xb8\x7d\xfa\x15\xee\x9e\xfc\x2e\x3b\x93\xad\ \x42\xfa\xf8\x06\xef\x9f\xbc\xfa\xa1\x18\xcd\x30\xfb\x95\x6a\xdd\ \x22\xc2\xe2\x74\x30\x60\xc3\x5c\x2d\x34\x9f\x5d\x28\xda\xb8\x07\ \xd3\x90\x83\x69\xc8\xfe\xbd\x23\xee\xef\x85\x73\xc5\xd5\x98\x29\ \x7a\x50\xc7\x53\xcc\x19\x1c\x28\x82\x52\x63\x38\x07\x1f\x3e\x2c\ \x90\x65\xa1\xa8\x21\xb3\x77\x19\xd4\x55\x1a\xae\x6c\xb2\xac\x3a\ \x0a\x1f\x69\x74\x58\x6e\xc6\xac\x69\x57\xd0\x33\x31\x6c\x3a\x39\ \xdc\x93\x9f\xf7\x68\x3b\xe5\x7f\xfc\x3f\xfe\x6f\xfe\xe8\xab\xbf\ \xc3\x5a\x57\x5c\xa5\x9c\xe4\x54\x0c\x85\x7a\x39\x79\xea\x89\x8f\ \xc1\x48\x7c\xa4\x9e\x78\xbe\x7c\x3c\x18\x31\x4c\x7d\x46\x28\x34\ \xc9\xe5\xd8\x51\xab\xed\x16\xc5\xee\xa2\xc4\xc2\x6a\x14\x63\xb0\ \x28\x5f\x8b\xbd\x93\x4a\x16\xae\xcf\x4d\x48\x97\x54\x5b\x19\xd8\ \xba\x3a\xdf\x44\x3a\x9f\x89\xed\xb6\xc6\x59\xc7\x44\x2f\x78\xe2\ \xb2\xa0\x2b\x27\xa7\xdd\xcc\x17\x23\xfb\xf1\x39\xf2\x45\x0b\x15\ \xcc\x62\x3a\xa3\x1c\x10\x35\x08\xe9\x17\xa3\xf9\x17\x6e\xc5\x42\ \xc6\xc0\xb1\xc5\x0a\xad\xae\x41\xb0\xd6\x82\x4e\x07\xbf\x58\x38\ \x5e\x2e\x61\xec\x17\xcd\x94\xf4\x1c\xe3\x21\x99\x0d\x98\xe3\xaa\ \xa5\x9a\xce\xb2\x68\x05\x3f\xcf\xd0\xfe\x4d\x3c\x7f\x55\x06\x6f\ \x79\x7b\x6f\x38\xe6\xfd\x93\x57\x19\x1e\xdd\x63\x67\xb2\xc5\xd6\ \x4e\x32\xf7\xfa\x05\x36\x20\xea\xcc\xf1\xca\x7a\xa7\x49\x72\xea\ \x32\xda\x9f\x59\xb7\x32\xec\x4a\xfb\x56\xe5\xcc\x67\xe0\x88\xe0\ \xea\x0d\xfa\x92\xa7\x6d\x30\x6b\x09\x97\x4c\x44\x57\x9b\x65\xd9\ \x38\x89\x18\x28\xf9\x85\x40\x2e\x9f\xab\x06\x70\x2f\x85\x61\x3a\ \x9c\x2b\xf4\xca\xa3\x9b\x47\x74\x5b\x16\xd7\x5b\x1e\x57\xea\x2d\ \x26\x8b\x23\x09\x25\x76\x72\xc1\xa2\xd4\x57\x2f\xcf\x7d\xcf\xfb\ \x5b\x11\xaf\xff\xc6\x9f\xf1\x27\xbf\xfd\x7d\x8c\x56\x46\x9e\x77\ \xc9\x07\x23\xc6\x76\x0d\xbc\x5c\x7c\x80\x98\x60\xf6\xf2\xd9\x24\ \xb3\x5d\x34\x7b\x8a\xd7\xcb\x40\x6e\xb5\x5d\x70\x6b\xb4\x36\x16\ \x38\x53\x33\x5a\x6d\x17\xa7\xb6\x8a\xd5\x71\x49\xdc\x06\x7a\x4f\ \xb4\xe4\x5a\x9a\x43\x60\x5b\xb3\xc9\x8f\x0f\x29\xf4\xb4\x40\x23\ \xc9\xba\x12\x13\x97\x38\xb8\x9a\x8d\x83\x41\x4a\xbd\x7f\x89\x44\ \xf5\xe7\x98\x8d\x5e\x52\xe1\x2d\x47\x0a\xba\x59\x76\xa3\xc3\x88\ \x18\x05\x2d\x0a\x49\x02\x5d\xb4\x7d\x43\x55\x58\x3f\x15\x7b\xe8\ \x64\xfe\x54\x02\xc1\x2f\x16\x63\xfd\x3d\xec\x02\x8e\x88\xa0\xec\ \x17\xcb\x5c\x3a\x45\x9f\x3b\x04\x52\xcb\x22\xe9\x0b\xa1\x91\x63\ \xe5\x85\x6e\x19\xe9\x3e\x24\x79\x64\xb2\x42\x46\x54\x6a\x76\xcc\ \xd9\x04\x09\xc2\x27\x78\x6b\x67\x3e\x40\x9f\x6d\x35\x78\x6f\x38\ \x06\xbe\xc2\x0b\xfc\x02\x5b\x5b\xdf\x84\x96\x08\xf4\x6b\xeb\x17\ \x3b\xeb\x7b\xa7\x11\x8b\x49\x0f\x55\x6b\xd0\x98\x4c\x79\xe4\x3f\ \xe4\xd1\xfd\x77\x8a\xe5\x8a\xd0\x67\xb6\xf5\xb3\xf9\xa1\xce\xa2\ \x00\x00\x20\x00\x49\x44\x41\x54\xcf\x1a\x9b\x3f\xb4\xc9\x95\xe3\ \x98\x38\x3c\xe0\xee\x23\x9d\x31\xe0\x72\x28\xcd\xfc\x44\x37\x6d\ \x02\xa3\x7c\x0e\x46\x9c\xc7\xbf\x29\x2d\x06\x4a\x4e\x3b\x9f\xbf\ \x8c\xf6\xd2\xd9\xeb\x55\x48\x12\x27\x11\x5d\x8d\x82\xf9\x88\x49\ \x1a\x62\x9a\xf2\x78\x64\xb0\x10\x3c\x46\xc7\xa4\x7e\xda\x84\x65\ \x18\x1f\xa7\x34\x96\x35\x29\xd4\x87\x7b\xfc\xd1\xde\x19\xfe\xd7\ \xfe\x98\x6b\x4f\xdf\xc2\x5d\x54\xa1\x09\x8d\x51\x07\x5c\x05\x45\ \x73\xc9\x53\x4f\x64\xe7\x36\xa2\x08\x5b\xcb\x59\x0b\x14\x46\x45\ \x07\xae\xcc\xd0\x07\x76\x8d\x86\x16\xe3\x8f\x1d\xdc\x4c\xa1\xd5\ \x76\x19\xa6\x3e\x8a\xa6\x30\x0e\x23\x16\xac\xc7\x64\xdd\x0d\xa0\ \xf7\xa1\x38\xb8\xda\xae\x2e\xa7\x3e\xf4\xa0\x27\x31\xf1\x74\xe3\ \x59\x59\xd8\x55\x6f\x0e\x3b\xc0\x75\x92\x24\x44\xd1\x5b\x24\xc9\ \x2c\xa0\x3d\xd5\x99\x37\x4f\x31\x81\xa4\xd8\xf3\xac\xdb\x89\x64\ \x14\x88\xc2\x79\x5f\x89\x73\x78\x19\x20\x33\x67\xff\x94\x7e\x14\ \x51\x37\x33\xea\xa5\x1d\x7d\x81\x7b\x35\x2c\xb9\x0f\x3a\xec\x47\ \x72\xa8\xb4\xc4\xbf\x5a\xa8\x08\x0e\x38\x8c\x24\xa4\x98\x1b\xa8\ \xdc\x7c\x88\x77\xf7\xe7\x48\xb2\x77\x49\x86\xbf\x07\x20\x03\xf4\ \xd1\x7e\x22\x03\x79\x6b\x27\x61\xd0\xba\x3f\xbb\xb4\x3e\x21\x23\ \x5f\x5e\x34\x51\xb5\x06\x1d\x05\x46\x63\xbf\x22\xfa\x3f\x60\x7b\ \xf8\x00\xff\xd1\x2e\xdb\xc3\x07\xbc\xf5\x78\x9b\x38\x3c\x60\x5d\ \xd7\xf9\xdc\x67\x9e\xe2\xd6\x17\x7e\x94\x9f\xf8\xb1\x4d\x9e\x7b\ \xf6\xd2\x1c\xd5\x56\x16\x5f\x55\xaa\x4c\x63\xc8\x40\xc9\x59\xc8\ \x47\x0c\x94\x5c\x06\xe8\xf9\x00\xae\x06\xf8\x93\x20\x47\xa6\x34\ \x59\x6c\xc6\x5c\x59\x13\x19\x7f\x67\x32\xfb\x9c\xe3\x91\xc1\x64\ \x71\x84\x9e\x1d\x62\x5f\x3e\x65\x7c\x3c\x0b\x9e\x9b\x9b\xd7\x71\ \x17\x37\x79\x63\x47\xe7\x95\x3f\xfa\x6d\xe8\x17\xfc\x7d\x77\x8a\ \xa2\xb9\x24\x76\x86\xa2\xb9\x45\x07\x4f\x64\xdc\x24\x50\x8b\x2c\ \x9a\xa1\x17\xaf\x1b\x6b\x0e\x4e\xcd\x44\xd1\x5c\x94\x68\x82\x3f\ \x15\x18\xb9\xa5\x39\x78\x6a\x8e\x1a\xc5\xe4\x66\x9d\x8c\x1e\x81\ \x9d\x4b\x03\x42\x89\xe5\x3d\xe7\x89\x74\x1b\x34\xe6\xd8\x89\x5a\ \xba\x7f\x21\x80\x57\x95\x04\xbf\xb3\x39\xd3\x6a\x90\x0a\x96\xa2\ \x80\x16\x49\x12\x8a\x4c\x5c\x95\x81\x39\x66\xb1\xe3\xc8\x2c\x3a\ \x5c\x85\xc8\x47\xc3\x22\x0e\x23\x34\xcb\x9a\x2b\xf6\xca\x72\x6d\ \x12\x05\xa5\x4e\x4c\x14\x86\x51\x50\x74\xc7\x66\x66\x24\x32\x53\ \x47\xb3\x8e\x1c\x56\x86\x92\xd6\x09\xe2\x44\xb6\x8d\xe4\xe2\x46\ \x39\x6d\x91\xe3\x14\x13\xd9\x49\xf2\x2a\xf0\x45\xf4\xd6\x97\x09\ \xe3\x5f\xe5\x51\xc1\xc4\x5c\x5b\xd7\x79\x6f\x38\xe6\xd9\x56\x83\ \xb7\xf6\xbf\xc2\xdb\x6f\xde\xe2\x63\x2f\xde\x9b\x0b\x74\x39\xab\ \x95\x3f\x85\xdb\xe9\x60\x91\x11\x46\x0a\x9b\x37\xdb\x6c\xd2\xe6\ \xf2\xa2\xc9\x4b\x67\x9f\xe2\x2c\x0f\x49\x0e\x07\x72\xed\xed\xf6\ \xf0\x01\x93\x57\xef\xf2\xe8\xfe\x03\xae\xdd\xbc\xc1\xb5\x4f\xa9\ \x2c\xbc\xf3\x14\xb7\x4f\x7a\xb0\x53\x71\xc3\x29\x34\x0f\xe5\xed\ \x4c\x69\xa2\xa4\x1e\x67\x5a\x93\x85\x7c\x34\xc7\x52\x68\x0c\xe9\ \x65\x0a\x2d\xb5\xf9\xa1\x01\x5c\xc2\x92\x6e\x33\x96\x33\x73\x92\ \x2b\x3e\xde\x23\xa8\x2d\x62\x03\xb5\xd1\x63\x76\x9a\x97\xb8\xb2\ \x03\x8d\x55\x0d\x8e\xc4\xc9\x78\xea\x9d\xb0\xe8\x2e\xd1\x1b\x8d\ \x38\x7a\xbd\xcf\xdb\x1f\xf9\x16\x9f\xfc\xc9\x97\x60\x0c\x89\x9d\ \x11\x45\x21\x4e\x31\xfe\x1e\x16\xa6\x7e\x4a\x34\xc1\x2c\x82\xda\ \x84\x4a\x8b\x5a\x50\x72\x6b\xd4\x19\xa1\x90\x07\x53\x86\xa9\x8f\ \x65\x37\xe8\x99\x06\x6e\xa6\x10\x14\x63\x4d\xea\xe4\x88\xac\x58\ \x28\xa3\xeb\x16\x49\x31\x39\x5d\x35\xe3\x2e\x19\x6f\xa5\xa3\x5e\ \xc8\xc4\x55\x6c\x5c\x4e\x76\x64\x23\x31\x0d\x9a\x24\x21\xa5\x53\ \x4a\x13\x4d\xe4\xfd\x66\x5e\xf0\xc4\x72\x70\x31\x87\x50\x21\xb4\ \x72\x0c\x59\xd0\x39\x18\x84\x84\x16\x72\x71\xf9\x6c\x1a\x4f\x3c\ \x6e\x9e\xc3\xca\xa5\xdc\x32\x2e\x9c\x34\x4d\x29\xd5\x01\x8a\xac\ \x1d\x10\x02\x2e\x81\x96\x60\x39\x3a\x61\x98\x14\x5d\xc0\x59\x6b\ \x58\x37\x33\x32\x9a\xd4\x8a\xe0\x1b\xb4\x5e\x01\xbe\x48\x32\xfc\ \x3d\xac\xac\xce\xb5\x75\x9d\x47\xfb\x02\xff\x3e\xbb\x2e\x32\xb1\ \x45\x5d\x06\xf0\xf9\xdb\x33\x5d\x85\xd6\xca\x2d\x08\x1b\xf4\x95\ \x00\xc2\x08\x6f\xff\xa8\x70\xfb\x11\x96\xfb\xc9\x24\x81\xe5\x7d\ \x7e\x64\xfd\x69\xec\x8f\x76\xc9\xc6\xbf\xc4\x07\xdf\x7e\xc8\xdf\ \xfe\xcd\x5f\xb1\xb7\x1f\xf2\x77\xbf\xe1\xb0\x6a\xbc\x22\xe9\xb6\ \x83\x05\xc1\x54\xe8\x41\x1d\x37\x8f\x28\x4b\x15\x25\xf5\xc8\x35\ \xf7\x42\x00\x0b\x38\xd1\xa2\xa5\xc2\x30\x1b\xa1\x07\x36\x0d\xe7\ \x43\x8a\x3f\xb7\x03\x44\xc4\xa3\x88\xc3\x0a\xc4\x5a\x75\x14\xf2\ \xe9\x29\x41\x7f\x91\x40\x69\xa2\x37\xcb\xe0\x4e\x4b\x89\xb8\xa0\ \xfd\xbc\x13\x16\x9b\x37\x78\x5b\x39\xa0\x7b\xf0\x88\x6b\x0f\x6e\ \xe1\x5c\x5b\x64\x1c\x8a\x55\xc0\x5e\x34\x9b\x7a\x51\x08\xc8\x4d\ \x9b\x28\x0a\x30\x4d\x8b\x24\x50\x49\xec\x0c\x93\xa0\xa0\xcf\x54\ \x02\xdb\xa4\x1d\x58\xf4\x19\xd1\xd2\x1c\x46\x41\x97\x66\x31\xf8\ \x59\x76\xf7\xec\x69\x97\x32\xa3\xc9\xac\xeb\x4d\xb1\xcf\x65\xe8\ \x71\x00\x49\xd6\x65\xb4\xbf\x3b\x87\x89\xab\xd9\xb8\x2a\xc5\xac\ \x4e\x8b\xb8\x99\x4f\x2f\xd3\x68\x35\xad\xc2\x64\xbb\x12\xc0\x31\ \x16\xe1\x79\xdd\xb0\x99\x12\x87\x0a\x56\xa8\x30\x31\x85\x54\x4f\ \xc3\xfa\x7b\x2b\xed\xf2\xc4\xc8\x4c\x45\x32\x1e\x73\xf2\x4e\x20\ \xed\x98\x44\x1d\xbd\xe8\xda\x95\x8d\x13\xf1\x7d\xc7\x56\x46\xcd\ \x74\x51\x69\x52\x37\x67\x99\xb4\x3d\xbc\xc9\xee\xc1\x26\x7a\xeb\ \xcb\x73\x50\xa1\xcc\xb6\x96\x2f\xde\xbd\xb7\xdf\xbc\x45\xe8\x4c\ \x2e\xfc\x5e\x35\xf5\xbf\xc1\x9a\x5e\xe2\xc4\x3f\x65\xb4\xd7\x67\ \x74\x16\xb2\xb5\x1f\xf0\x68\x7b\x97\xec\xf6\x6d\x1e\x6d\x6d\x13\ \xee\xff\x2d\xea\x96\xc6\xde\xfd\x3f\x67\xe1\x83\xbf\xe3\x73\x37\ \x1e\xf3\x33\xff\xf2\x13\xfc\xea\x6f\xfd\x77\xfc\x4f\xff\xe6\x7f\ \xe7\x67\x7f\xea\xd3\x18\xd6\x1a\x77\x1f\xe9\xdc\x7d\xa4\xe3\x6f\ \x9f\x48\xa1\xba\xa7\x98\x73\x81\xd8\xce\x67\xae\x8f\xe7\xe1\x03\ \x40\x4b\x6d\x5e\xa0\xdc\x4a\x96\x02\xb7\x33\x9b\x6a\xfe\x30\xf1\ \xcd\xf4\x94\xb3\xb6\x2b\x70\xf1\x13\x6e\xca\x66\x4b\x4c\x44\xe7\ \x6b\xd4\x4f\x9b\xec\xe5\x6d\xc2\xa2\x59\x55\xf2\xc6\x4a\x34\x41\ \x21\xc0\xc9\x1a\x58\xa6\x58\x38\x5f\x72\xc9\x7a\xa0\x4a\xfe\xb7\ \xec\xf6\x0d\xe8\xa3\xb4\x9b\x45\x21\xd7\xc7\x60\x71\xd6\xd5\x2b\ \x68\xb9\xf3\x1d\xbd\xf3\x10\x23\x48\xc5\xd8\xbe\x36\xec\xd3\x5c\ \xdf\x98\xe3\x89\xab\x85\x5d\x75\xc6\xae\x4a\xd1\x8d\x5c\x85\x8e\ \x2a\x6c\x00\xc6\xea\x14\xed\x17\xff\xeb\x2f\xff\x8a\x0e\xa8\x89\ \x82\x9e\x24\xd4\x0c\x71\x22\xd5\x12\x05\x3d\x0a\xd1\x93\x04\xc5\ \xd5\xd1\x0c\xd0\x93\x18\x8d\x84\x29\x86\xa4\xe5\x94\x22\x1b\xab\ \x18\xe4\x24\x92\xaa\x8b\xb1\xa8\x25\xb3\xcf\x51\x99\x71\xc5\x96\ \xa1\x93\x62\x54\x8c\xe0\x22\x62\x55\xc1\x30\x74\x30\x4d\x6c\x1d\ \x14\xea\xd4\x4d\x9d\x20\xb3\xc8\xb5\x3a\x5e\x36\xe2\x71\xfe\xef\ \xb8\xba\x92\xe0\x0d\x3b\x1c\xbe\xb1\x8d\x72\xa9\x18\x25\xf2\x32\ \x3a\x4d\x95\xc3\x3c\xc4\x98\xea\x2c\xaf\xf6\x30\xa6\xfa\x1c\x66\ \xfe\xcc\x8d\xcf\xd3\x5d\x79\x89\xae\xbd\x44\xbd\x6e\x50\x37\x14\ \xb2\x85\x36\x76\xb6\xc6\x7e\xf2\x01\x77\xb6\x15\x26\x83\x6d\xa6\ \x6a\x9d\xfe\x60\x80\x91\x65\xec\xbd\x99\xf3\xc6\x5f\xff\x21\x6a\ \xf8\x3a\x6b\xa9\x4f\x67\xc1\xe3\xb3\x3f\xb4\xc6\x17\xfe\xe9\x97\ \x59\x79\xee\x29\x06\x93\x6d\x1e\xef\xe8\x4c\xa3\x13\xe2\x72\xb7\ \x71\x26\x7e\x66\x3a\x56\x09\xf5\x31\x2d\xb5\xc9\xd8\x8f\xa9\xd5\ \x04\x3e\x48\xfd\x84\x7a\x2d\xc6\xf7\x35\xac\x9a\x2f\x77\xb4\x69\ \x0c\xd1\xf5\x36\x75\x37\xa1\x6b\x59\x84\xb9\x8e\x55\xc9\x44\xd9\ \x24\x91\x1f\x43\x2f\xa1\x55\xac\x9f\x5d\x4d\x14\x8c\xc6\x21\x8e\ \xd9\x64\xd8\xee\xa3\x9b\x8b\xf8\x9e\x4a\xcf\x88\x51\xce\x7c\x2c\ \x25\xe1\x99\x4f\xac\xb0\x70\xe3\x32\x2d\xd7\x66\xd5\x5d\xa6\x96\ \xe5\xc4\x9a\x82\x12\x65\xc5\x32\x4a\xa8\xe5\x35\xd4\x58\xa1\x5e\ \xc1\xec\xbe\x3a\xa6\x96\x8b\x00\xcc\x8c\x29\x09\x31\x6a\xdc\x25\ \x1f\x3c\xa6\xd6\x71\x38\xeb\xeb\x9c\xa9\x27\xb4\x8c\x04\xd7\x76\ \x19\x4d\x5b\x44\xe9\x09\x79\x6a\x52\xaf\x6b\x04\xe9\x04\x63\x9c\ \x41\x79\x5f\x15\xef\x8d\xa1\xe6\xa4\xa9\x81\x5f\x5f\xe0\xcd\x6f\ \x7e\x93\xe1\xe8\x84\x49\xbd\xc6\xc2\xd9\x19\x43\xd3\xc2\xd5\x14\ \xf2\xec\x21\x6b\xaa\xcb\xc6\x33\x9b\xb4\xad\x0e\x51\xae\x12\xe5\ \x85\x47\x45\x9c\xc9\x8c\xfc\x6b\xff\xe7\x1f\xa1\x0b\x6b\x53\x87\ \x04\x5f\x98\xc1\x61\x61\x11\xcc\x74\x0b\xa6\x45\x1c\xce\xb2\x68\ \x35\xb3\x96\xc1\x1a\x57\x38\xd7\x27\x57\xe6\xd6\xdc\x72\x9b\xb0\ \x92\xad\x6b\xa1\x32\x6f\x08\x57\xb9\x1d\x4c\x32\xd6\xcc\x33\x0e\ \x22\x91\x05\x1a\x87\x75\x0e\x82\xeb\x5c\xbd\xa2\xf3\xe7\xcf\x7d\ \x89\x65\x7e\x67\xae\x80\x7b\x76\xbd\xc1\x23\x3f\x99\x7b\xee\xda\ \xba\xce\x4f\x7e\xfc\x0b\x2c\x2d\xff\x27\x5c\xaa\x5f\x2d\x76\x74\ \x44\xf2\x0a\xd0\x6f\x4c\x66\x45\xdd\x51\x4a\xef\xf6\xdb\x2c\x6f\ \x74\x08\xba\x4b\x40\x1f\xbb\xb6\xce\x07\xbf\xb7\xc7\xdf\xd5\xff\ \x3f\xae\x6f\xbe\x0e\xc0\x47\x3e\xb3\xc6\x27\xd7\x6e\xb1\xf1\x8f\ \x3f\xc3\x6b\xee\x21\xb7\x4f\x74\xde\x7a\x73\x0b\xc3\x9f\xce\xb1\ \x0f\x25\xe6\x05\x9b\xb1\x1f\x93\xd8\x21\x2d\xa7\x49\x4a\x8b\xa6\ \x33\x94\x99\x57\x64\xab\x56\xf1\xae\x74\x8a\x63\xff\x43\xdf\xcf\ \x72\xa2\xba\xf4\xb5\x98\x36\x2f\x09\xaa\xad\x07\x70\x0f\x75\x22\ \x0c\x59\x0e\xfd\x14\x9a\xb0\xdc\x8c\x59\x6e\x5f\xe6\xc6\x66\xca\ \x38\x99\x5c\xd0\xc7\x34\xe2\x0c\xb4\xf3\x97\xed\x1c\x37\x6b\xe0\ \xa9\xb9\x94\xbd\x8a\x0c\xdd\x07\x57\x11\x8d\x92\xc6\x18\xb5\x1f\ \x33\xb6\x6c\x8c\x54\xa3\x49\x0f\x34\x87\x51\x01\x21\x12\x54\x90\ \xf3\x95\x36\x78\xa1\xc8\xca\xde\x94\xc6\xba\x45\x6f\x5f\x70\xd8\ \x49\xfb\x13\xac\xd6\x1e\xb0\xdd\xee\x4a\x38\xa1\xa8\xd7\x39\xcc\ \x61\xc2\x31\x70\x4d\xb2\x1a\x1d\x35\x95\x7c\x71\x3f\x2b\xd6\x1d\ \xa4\x1d\x13\xc2\x14\xbd\xf0\xee\x4d\xa2\x10\xaf\xd2\xc9\xd1\x41\ \x42\x0c\x2b\x8c\x88\x2d\xeb\x42\x73\xc4\xac\x48\xfa\xce\x5f\x00\ \x8d\x8a\xb2\x38\x0b\x15\x72\x2b\x90\x01\x3f\xb3\x69\x61\x7e\x2b\ \x53\xc9\x48\x98\x11\x07\x91\xc9\x42\x9e\x31\x6d\x5d\x63\xaf\xbf\ \xca\x20\xfb\x0a\xbb\xf7\xbf\xc4\xf2\xc2\xd7\xe7\x0a\xb8\xf2\x76\ \x6d\x5d\xa7\x15\xfc\xfc\x5c\x97\xaf\x96\x3f\xc5\x7a\x7d\x79\x26\ \x12\x2a\x30\x77\x33\xea\x73\x82\xc9\x60\xef\x69\xe0\x51\x65\x6a\ \xb8\x4f\x3c\x8a\x88\x2e\xf5\x78\x6a\xba\xce\x71\xba\xc8\x71\x00\ \x3b\x77\xf7\x50\x6a\x8b\xfc\x7e\xff\x80\x1f\x68\x6f\xd3\xe8\xde\ \xa2\xd7\x9a\x70\x39\x5c\x27\x5e\x8d\x78\xf7\xf0\x08\x86\xa2\x62\ \x6e\x34\x0d\x81\xd7\xba\xcb\x6c\x5c\xb6\x8a\x89\x66\x97\x2c\x39\ \xa6\xa5\xb5\x80\xd6\x6c\xbe\xc7\x2d\x27\x34\x2c\x7a\x59\x9f\x5e\ \x56\xdc\x1f\x86\xe0\x96\xcf\x9b\x52\xbd\x56\x8a\xee\x71\x2c\x76\ \x26\x43\xae\xec\xc0\x6e\x6e\x90\x4f\x4f\x39\xf4\x73\x8e\x07\x42\ \x73\xac\x3a\x1a\xbd\x6c\x84\xa2\x5e\xe7\xd9\x4f\x6a\xb8\x8b\x9f\ \x20\x88\x54\xc2\x48\xc1\xcd\x14\xbc\x22\x38\x7d\x03\xdc\xac\x0c\ \xdc\x2e\xd0\x17\x81\x1b\x08\xad\x76\x29\xa4\x8f\x0a\xd5\x9b\xa2\ \xb9\x15\xe8\x98\x57\xc4\x43\x8a\xa4\xe6\x02\xb7\x81\x4e\x4e\x80\ \x8d\x4d\x3a\x5f\xd4\xb9\x35\xe1\x0c\xd4\x12\x05\x7b\x4b\xbf\xc7\ \xe1\x14\x36\x07\x3d\xb6\xdb\x5d\x09\x2d\x56\x95\x84\x3a\xcb\x73\ \xf8\xba\xaa\x88\x93\x3c\xb1\xc4\xc3\x61\xb9\xdb\xcd\x22\x26\xc0\ \x28\xd4\xfe\xfd\x0a\xbd\x16\x5a\x79\x91\x27\xac\x8b\x58\xf7\x5c\ \xe6\x45\x1a\x70\xcf\xa8\x38\xd5\xca\x49\x8b\x6c\x3f\x1b\x37\x14\ \x5b\x4a\xcb\x5d\xce\x16\x30\x54\x72\x3a\x39\x1c\x44\x26\x6d\xa3\ \x41\x3f\xde\x23\xed\x9f\xd1\x79\x76\x8b\x6f\xfe\xfb\x5b\xc0\x7d\ \xd8\xb9\xf5\xa1\x3f\xff\x6a\x7d\x13\x96\xf7\x99\x2a\x2f\x73\xb0\ \x7d\x9d\xcb\x9b\x2f\x17\xeb\xc8\x84\x6b\x8c\x19\xaa\x58\x56\x46\ \x88\x45\x3b\xe8\xd3\xd2\xef\xd1\x2b\xc4\xef\xdd\xd6\xec\x77\x0b\ \x8e\x2c\x76\xd4\x90\x5e\x76\x57\x9c\x14\x2b\x21\xad\x74\x91\xe5\ \xe9\x1e\xaf\xeb\x21\xda\xc0\xe0\x8a\xb9\xcf\x6e\xb4\x3e\x87\x83\ \xc7\xea\x94\x06\x06\x5a\x73\x80\x9b\xb7\x00\x4b\x4e\x63\x64\xfe\ \x06\xe4\x23\x32\xa5\x89\x8a\x06\x6e\x5f\x06\xf0\xe9\xc8\x60\xb1\ \x09\xbd\x61\x48\xcf\x35\xc1\x0d\x81\x0e\xbd\x61\xbf\xb8\x2f\xfc\ \x28\x4a\xac\xbc\x73\x10\x62\x34\x4d\x0e\xfd\x81\xb4\xae\x3a\x1d\ \x19\xa8\xce\xa8\xe0\x89\xfa\xe0\xc1\x83\xef\x7f\x8b\xef\xbf\x96\ \xb3\xfe\xdc\x2a\xa1\x16\xe1\x45\x0a\x0e\x2e\x69\x60\x11\xdb\x01\ \x35\xb3\x26\x0b\xd2\x5e\x69\x09\x30\x84\x86\x65\x62\x4e\x8b\xeb\ \xa4\x9a\x42\xa4\xc9\x29\x0e\x80\x78\x1c\xa2\x07\x11\x8d\xc5\x18\ \xa8\x31\xa2\x4b\x93\x1e\x8a\xe6\x62\x07\x82\x6e\x0b\x52\xe4\x5e\ \xbb\x32\x0b\xe3\xd6\x04\xbb\x30\xec\x33\x5c\xd0\x61\x4f\x04\x6d\ \x99\x89\x6b\x8f\x4f\x99\x5e\x5a\x64\xd8\xaa\xcb\x4c\x0c\x42\x04\ \xe4\x5d\x18\x58\x05\x3d\x2e\x38\x62\x2a\x05\x9d\x4b\xe1\xda\x13\ \x2a\xd2\x97\xb8\xea\x00\x64\x86\x11\x69\x31\xce\x54\xce\xdc\x95\ \xa3\x97\xd5\xcc\x6b\x5e\x10\xd2\x17\x99\xbb\x42\xbd\x95\x59\x58\ \x2c\x83\x34\x2f\x64\xe2\x49\x98\xd1\xa1\xc5\x59\x32\xa0\x71\x78\ \x51\xee\x57\x7a\x50\x7c\xec\xc5\x7b\xb3\xe6\xc6\xf2\x3e\xba\xfa\ \x1c\x64\x70\xf5\x0a\xe8\xfb\xc7\xec\x2c\x42\x27\x6b\x62\x60\x13\ \x11\x11\x45\x30\x3a\x13\xfb\x9a\xcb\xc2\x62\xb9\x0d\xc7\x03\x53\ \x8e\xfe\xe0\x85\xf4\xdc\x70\x2e\xa8\x03\xee\x32\x5c\x09\x79\xf6\ \xbe\xc1\x6e\xbe\x8b\xb8\x0e\xec\x72\xa4\x39\x28\x99\x37\x33\x27\ \x18\x29\x33\xff\x5b\x99\x41\x2d\x7a\x4e\xa9\x81\x1d\x81\x27\x5a\ \xc9\xbd\x61\x48\x8f\x10\xd5\x0d\x39\x1d\x35\x51\xdd\x10\xbc\x7e\ \x91\xa9\xfb\x32\x53\x0b\xa8\xd1\xa7\x97\xcd\x8a\xbe\xe3\x81\x08\ \xd4\x4c\x69\x16\xe3\xff\x5a\x45\x38\xdf\xa1\xdb\x8a\xd8\x39\x08\ \xf9\xf3\xbf\xf9\x36\x3f\x6a\x5e\xe5\xfa\x3f\x5a\x27\x39\x55\x21\ \x4c\x50\xcc\x84\x1a\x35\x99\x60\xb2\x50\x41\x35\x2d\xb2\x28\xa4\ \x99\x29\xa4\xc0\x59\x18\xd0\xb0\x4c\xb4\xb3\x29\x69\x23\x23\xee\ \x87\x0c\x06\x43\x74\xdb\x22\x09\x42\x74\x3b\x11\x41\xab\x19\x40\ \x4f\x76\xf8\x02\x3b\xc7\xf6\xa6\x42\x5e\x6f\xe7\xd8\x81\x22\x8a\ \x3f\xb7\x2e\xf6\xdc\xad\x2b\x0c\x4e\x12\x5a\x67\x09\x3b\xa7\x1e\ \x87\x8b\xae\xcc\xc4\xab\x97\x16\x39\x9c\x66\x7c\x62\x28\x32\x71\ \xd9\xae\xee\x67\x1a\x64\x33\x83\x96\x8e\x9a\x8a\x41\x51\xbd\x17\ \x93\x48\x6d\xc4\x19\x16\x0b\xf8\x76\x42\xde\x13\x15\xb4\x62\xb7\ \x30\x80\x04\xd0\x7b\x3a\xd8\x7d\x30\xad\x8a\x34\x33\x42\x43\x41\ \xa1\x47\x8e\x2d\x7c\x2b\xe4\x88\x87\x78\x2d\xaa\x9c\x24\x5a\xa8\ \x88\x0d\x9e\xf9\x03\x31\xbb\x67\xad\x41\xa8\x14\x1c\x74\x3e\x6f\ \xce\x9d\x2e\xa0\xe1\x61\x53\xc3\xd4\x23\xf4\xd6\x97\xf9\xa8\xf1\ \x87\xbc\xfb\x5e\x4c\x76\x6b\x85\x5b\x9f\xbb\x83\xe5\xd7\x65\x20\ \x03\x12\x4a\x04\xf9\x1f\xf0\xb5\xdb\xaf\x70\x6d\x5d\xe7\x36\xd0\ \x7a\xf8\xf3\x5c\xbd\xa2\x73\xeb\xca\x75\xe2\xa8\x83\x12\x29\x1c\ \x1f\x1c\xb2\x35\xd9\xa6\x3f\xd1\x67\x01\x51\x09\x96\x7e\x43\x81\ \x0c\xd4\xd1\x80\x56\xbb\x45\x3f\x53\xe8\xa8\x39\xc1\x3d\x8b\xbf\ \x56\x4c\x5c\x67\xa6\x9e\xf3\xfd\x90\x3c\xc9\x19\xfb\x31\x8d\xac\ \x86\xd6\x14\x13\x25\xc3\x74\x48\xcb\x6b\x51\xb2\x6c\xc2\x33\xad\ \xf4\x93\x80\x5e\x16\x16\x41\xda\x11\x01\xab\xcc\x9a\x1c\xaa\x37\ \x2a\x68\xb6\xd2\x87\xa2\x2f\x7f\xb7\xed\x91\xd0\x1a\x7b\x8a\x09\ \x0a\xb8\x8e\x46\x5c\x06\xa4\x53\x99\x84\x2e\x9d\x84\x0e\x42\xee\ \xbe\xf2\x75\x5e\xfc\xe4\x2f\xf2\xec\xb3\x26\x7b\x87\x42\x28\x5f\ \x62\x5d\x5f\x1d\x93\x9b\xf6\x1c\xb4\xd3\x81\xba\x69\x15\xd0\xc3\ \x42\x07\x14\x26\xb4\x25\xdd\x53\xa3\xd3\xe9\x08\x3e\xd9\x9b\xca\ \x00\x1e\xa1\x08\x28\x61\xe7\x42\xce\x99\x4e\x44\x16\x4e\x27\x82\ \xb9\xb0\x61\x95\x7a\x11\x55\xf3\x98\x18\xa0\xf6\xf8\x14\xda\x5d\ \x69\xb2\xdd\x51\x53\x19\xc8\xe5\xfd\xea\x94\x88\xf6\x5f\xfc\xf4\ \x8f\xfc\x4a\x42\x88\x81\x4d\x42\x48\x42\x08\xf1\x04\x8b\x05\x01\ \x29\x8c\x0c\x35\xd0\x89\xe3\x3e\x06\x36\xaa\x91\xe1\x27\x09\xd3\ \x24\xa1\x96\x24\x78\x7a\x4c\x8e\x41\x14\x25\x4c\xf4\x98\x29\x31\ \x71\x94\x00\x06\x89\xfc\x35\x21\x4b\x14\xb2\x44\x41\xb1\x72\x32\ \x0c\xe2\xe4\x4d\x3e\xd8\xff\x36\x0b\xcd\x65\x74\xe3\x92\x1c\x63\ \xb2\x30\x88\x8d\x9c\x3a\x53\xb4\x54\xc1\xa6\x46\x6a\x66\x4c\x26\ \x3e\x63\xe5\x1b\xdc\x7b\xfb\x98\x93\x93\x4c\xec\x55\xde\xb9\x44\ \xf3\xd6\x21\x9f\xfb\xd8\x98\xab\xfa\xbf\xe0\xa5\xa7\x7f\x90\xcd\ \xa7\x9f\x26\x0d\x56\x89\xf9\x80\x7b\x47\x5b\x0c\xbc\x8c\xc3\x3c\ \x64\x2f\x7b\x83\x3b\xfd\xef\xb0\xa8\x83\x37\x9e\xd2\x4e\x1b\x0c\ \xec\x2d\xfa\xdf\x07\x6d\x1a\x31\x6d\xa7\xc4\x6c\x31\xad\x5f\x47\ \x09\x85\x88\x3d\x19\x9b\xb4\xea\x09\x66\x6c\xc2\x14\xa6\xd1\x90\ \x49\x34\x21\x74\x2d\xd2\x30\x91\x8f\x83\xc8\x44\x53\x75\xb2\x2c\ \x21\x9e\x66\xc4\x4a\x4a\xbd\x36\x2b\x77\x4d\xd5\x24\xac\x25\x58\ \x8a\x81\xd1\x34\x71\x4c\xa8\x4f\x15\xc2\x5a\x42\x57\xb5\x08\x73\ \xb7\xc8\xb8\x1d\x16\xcc\x29\xe1\x28\x41\x71\x6d\xb2\xb8\x86\x52\ \x1b\x02\x1d\xfc\xe9\x84\xfa\x24\xa1\x6f\x4c\x48\xc6\x85\xb6\x42\ \xb1\xa9\xa1\x11\xda\x01\xc9\x38\x27\xd7\x03\x42\xc5\xc0\x3a\x57\ \x2a\x8b\xe9\x14\x97\xb7\xb6\x1f\x92\x3c\x7a\xc4\xf2\xd3\x4b\x58\ \x96\x42\x10\x66\xc4\x7e\xc8\xd4\xc8\x69\xc4\x19\x5a\xc3\xc0\x0c\ \xc7\xd4\x95\x3a\x53\x45\x4c\x87\x5b\x53\xc1\x17\x5b\x53\x15\xcd\ \xca\x31\xb3\x4b\x58\x16\x58\x96\x85\x65\x59\x34\xc9\x31\x62\x85\ \xc0\xce\x71\xe2\x99\xd6\xc2\x88\x15\x62\x03\x8c\x71\x46\x6c\x40\ \x9c\xa7\xd8\x81\x78\x0e\x6c\x54\x4b\x25\x1f\x2b\xdc\x79\xff\xfb\ \x78\x8f\xdf\x66\x52\xaf\xb1\x39\xe8\x31\x34\x2d\x86\xa6\xc5\x8a\ \xbe\xc5\xd2\xd4\x61\xe3\x99\x4d\x14\x12\xf2\x22\x60\xa3\x5c\xa5\ \xa3\xa6\x44\xb9\x4a\x96\x25\xfc\xd6\x57\xfe\x10\xd5\x62\x01\xd7\ \x6e\x11\xd9\x09\xae\xdd\x62\x59\xe9\xe0\xda\x2d\x74\x3b\x41\xb7\ \x13\xc1\x5c\x74\x0d\xc2\x5c\x7c\x0e\xa6\x45\x6e\xe6\x58\x1d\x13\ \xc5\xcc\x31\x8a\x49\x00\xdd\xb4\x30\xb0\x31\xb0\xd1\xcd\x99\xfa\ \x21\x89\x42\x4c\xc0\x8c\x42\xcc\x28\x44\x09\xed\x19\x9e\x4e\x5f\ \xe3\xde\xce\xc3\x62\x0a\x44\x29\x67\x92\x69\x84\x2a\x2a\x4d\x6c\ \x12\xd2\xa2\x7d\xed\x98\x1d\xf6\x5f\xbf\xc9\xfe\xc1\x4c\x20\x74\ \xeb\x73\x77\x24\x0b\xf1\xc2\xa7\x9e\xe1\xd6\xe6\x3f\xe1\x52\xfd\ \x2a\x97\xd5\x29\x07\xdb\xd7\xe7\xba\x75\x96\x5f\xc7\xf2\xeb\x7c\ \xed\xad\x57\xf8\xc3\xdb\xff\x96\xbb\xe9\x9f\xb2\xb5\x93\x30\x3e\ \xf5\x78\x3c\x78\xcc\xe9\xe1\xeb\xb4\x94\x17\x58\xab\x59\x2c\xb7\ \x3b\xe4\x0b\x1b\x73\xe3\x45\xa5\x26\x42\xd5\x97\xe9\x8c\x73\x94\ \xa6\x42\x4b\x6b\x15\x45\x1a\x9c\xa4\x21\x03\x25\x27\x76\x75\x9a\ \xce\x6c\xec\xa0\x7c\xfd\x82\x92\xae\x69\xce\x15\x6c\x42\x1f\xd1\ \xa7\x37\x0c\xe5\x7d\x31\xf2\xd4\x14\xe3\xfa\x45\xd6\xed\x8c\x73\ \xc9\x4b\xcf\xae\x3e\xae\x3c\xb6\xfd\xf3\x56\x58\x45\x07\xb1\x3b\ \xa5\xdb\xbc\xc1\xab\x8f\x8e\xf8\xcb\x5f\xfd\x0e\x4d\x7f\x97\x56\ \xc3\x43\x35\x81\x48\xc3\x37\x1c\xa2\xc1\x94\xb1\xa1\x12\xa8\xa7\ \xb8\x99\x82\xe6\x09\x51\x8f\xe6\x8d\x69\x92\x17\x8f\xfb\x52\xe9\ \x56\xc2\x06\x79\xe5\xb4\x73\x9a\xe4\x0c\x0b\xab\x5a\x5b\xab\xcb\ \x6c\x6c\x07\x8a\xe4\x8b\xed\x20\x84\x20\x61\x90\xcc\xff\x9e\xdb\ \xed\x2e\x4a\x20\xda\xcf\x47\x89\x18\x78\x9d\x70\x4c\xab\xf4\x7e\ \xf6\xa6\xe8\xba\x45\x3f\xd3\xe6\x70\xb1\xaa\xdb\x09\x3e\x60\x06\ \xe2\x1f\xde\xb3\xc4\x6e\x0d\x1f\xc4\x0a\x00\x53\x00\x7a\xbb\x31\ \x73\xc1\xb4\x2d\x21\xa0\x4f\x2c\x6b\x0e\xc5\x1a\x56\x8e\x61\xe5\ \x98\xc5\xe5\xc8\xb4\x4c\x9c\x4e\x47\xf8\xfe\x9a\x16\xe0\xa2\x12\ \x12\x84\x21\x77\xf3\xff\x55\xd0\x43\xca\x5d\xe2\xfc\xa0\x70\xf0\ \x11\x05\x9e\x6e\xe6\x4c\xa3\x79\x83\xef\x99\xf1\x21\x64\xb7\x56\ \xf8\xd8\x8b\xf7\x64\x60\x86\xce\x84\xdb\xdf\x79\x9f\xa4\x7f\x80\ \xe7\x05\x6c\xed\x07\x24\xc3\xdf\xbb\x80\xa1\xab\x0d\x90\xaf\xbd\ \xf5\x0a\xca\xde\x1b\x38\xcf\x37\xb8\xfe\xf2\x35\x3e\x7e\xeb\x9f\ \x61\xac\xcc\x3b\xb2\x8b\x4b\x79\x87\x7e\x43\xa1\xad\x37\x51\xf5\ \x65\x31\xc8\xa9\x98\x74\xd4\x1c\x4f\x99\x0d\x78\xb6\x73\x45\x52\ \x6b\x23\xdf\x96\xcd\x8b\x52\x99\x86\x27\xa0\x83\xf4\x10\x2e\x9c\ \xe0\x05\xb6\xed\xc8\x21\xd0\x4c\x69\xa2\xe6\x23\x7a\x03\x71\xe2\ \xa8\xf9\x88\x38\x11\x3f\xb3\x2a\xcb\x1c\x33\x65\xcc\x14\x35\x1f\ \x49\x51\x7e\xf5\xb9\x6a\x20\x1b\xad\xde\x9c\x1b\xfd\x9f\xbf\xfb\ \x36\xbf\xf3\x17\xc7\x4c\xb3\x45\xda\xed\x36\x0d\x2d\x46\x89\x26\ \xe4\x66\x9d\x1c\x1b\x3b\x5b\xc4\x57\xc7\x28\x9a\x2b\x8f\x23\x14\ \x52\xb7\x41\x93\x99\xfa\x6d\x54\x42\xc5\x73\xc3\xa7\x33\x9e\x6e\ \x3a\xd7\xfc\x28\x1b\x22\x81\x7d\x8e\xe2\x5b\x9c\xb1\x1d\x57\xa6\ \x16\x87\xd3\x4c\x52\x6d\x25\x3b\x51\x16\x86\x25\x4b\x51\x1e\xc7\ \xea\x14\xd5\x9f\xfb\x25\x74\x12\x7c\x72\x33\x27\xd4\x45\x00\xf8\ \x51\x48\x82\x2f\x46\x7e\x0a\x86\x22\x0e\x15\x6a\x85\x68\xc7\x8f\ \x42\x92\xa2\xfb\x53\x32\x1c\x51\x18\x11\x59\xa6\x38\x16\x18\xcb\ \x04\x22\x33\x11\x8f\xf5\x37\x61\xbf\x25\xb3\x71\x9c\x6c\x31\xee\ \x4f\xe4\x40\x7d\x52\x14\x7d\x7e\xb9\xfe\xd4\x6e\xa0\x16\x93\xd5\ \xed\xa5\xcb\x7c\xfe\x7a\x3e\x17\x94\x65\xa7\xee\xfb\xde\x57\x85\ \xca\x6d\xb2\xcd\x9d\x6c\xcc\x9d\x6c\x4c\xe8\x4c\xe4\xeb\xe5\xb1\ \xfc\xba\x37\x1b\x62\x82\xe3\xea\x15\x9d\x5b\x2f\x7d\x94\xab\x1f\ \x79\x99\xeb\x2f\x5f\x63\xf3\x4a\x87\xfe\xd9\x90\x87\xc3\x1e\xbb\ \x7b\x8f\xd1\x83\x3a\x63\xa6\x85\x7d\x54\x73\x6e\xa0\xb3\x1a\x58\ \x4f\x52\xa8\xa5\xb4\x64\xa0\xe3\x09\xe6\xe1\x78\xd0\xe7\xd4\x3b\ \xe1\x74\x64\x14\xde\x14\x21\x78\x30\x48\x46\x0c\x92\x11\x0f\xb3\ \xfc\xc2\x15\xa0\xbc\x2a\x9c\x0f\xe6\xf3\x8f\xdd\x3c\x92\xc1\x5f\ \x1a\x15\x1e\x0f\x90\x8b\x69\xc8\xd7\x20\x5f\xe3\x4f\xff\xe0\x2f\ \xf9\xf6\x6f\xfc\x11\xb6\x3f\xa4\xbe\x64\xe1\xe8\xc7\x4c\x10\xb3\ \x86\x83\xa4\x89\x93\x35\xf0\xd5\x31\x4e\xd6\x98\x1b\xfc\x2c\xb3\ \xac\xd0\x2f\xcc\xe4\x9a\xe5\xe3\x11\x0a\x0b\x43\x45\x66\x66\x91\ \x79\x95\x0b\x5d\xbb\xb9\x04\x55\x14\xd6\xe3\x53\x4f\x66\xe3\xa3\ \xc1\xae\x7c\x7d\x58\x9a\x2f\x16\x27\x85\xcc\xc2\xde\x54\x2c\x63\ \x0c\xc6\x88\x2c\x6b\x27\x24\x81\x4e\x30\x86\xa6\x69\x63\x14\x57\ \xe2\x50\xaf\xe3\xea\x2a\x5e\x92\x15\x60\xdf\x2d\xce\x79\x11\xbc\ \x66\xa0\x13\xd9\x09\x49\x14\xe2\x98\x56\x31\x32\x1f\xcd\xfc\xa5\ \x8a\x63\x64\x99\x85\xdc\x33\xb8\xf0\x47\x6c\x1d\x64\x3c\xbb\x19\ \x10\x16\xd6\x54\x94\x36\x01\x66\x0e\x4a\x80\xe7\x5b\x50\x04\xf1\ \xe6\x95\x0e\x3f\xf2\x85\x7f\x0e\xc0\x77\x1f\xff\xb7\xf4\xf7\xaf\ \xd2\x79\x76\x0b\x02\x38\xd8\xbe\xce\xd5\xba\x28\xa8\xfc\x37\x5f\ \xc2\x79\xf1\xdb\x32\x70\xcb\xe0\x2d\xb3\x77\xf9\x58\xd9\x7b\x03\ \xae\xbc\xc4\xfd\xad\xdb\x5c\xcf\xea\xa8\xd7\x5f\xe0\xea\x15\x9d\ \x1f\xf9\xd1\x7f\xcc\x2b\xaf\xbe\xc9\xd6\xdd\x0f\xe8\x9f\x0d\x45\ \x23\x23\x19\x61\xf8\x17\xf9\xec\xb1\x1f\xd3\x70\x0c\x19\xc0\x0d\ \xc7\x28\xda\xcd\x23\x5a\x6a\x53\xe8\x90\x2b\x6a\x35\x06\x14\x9c\ \x0f\xc5\xfd\x99\xe6\xe2\xc3\x4e\x88\x32\x98\xcf\x4f\x90\x9c\x1f\ \x7d\xea\x8d\x14\x68\x0a\x49\xa8\xa1\x97\xde\x6e\xa5\x21\xcc\x10\ \x9a\x33\xac\xfe\xd5\x6f\x7c\x93\xb3\xe3\x01\x3f\xfc\x4f\x3b\x74\ \x9f\xf9\x0c\xab\x78\x0c\xc7\xa0\xd5\xce\xf0\x58\x40\x89\x34\xa8\ \x95\xfc\xb1\x22\x8e\xb8\xe4\xc5\xef\x2e\x82\x37\x9f\x0d\x96\xda\ \x19\xcd\x00\xce\x5a\xb9\x54\x8b\x88\x39\xbd\x69\x25\x0b\xe7\xd8\ \x41\x48\xa2\xa5\xe8\x5e\xc6\x43\xcf\x94\x9d\x5b\xc7\x1e\x41\x30\ \x62\xa5\xbd\x51\xb4\x9f\x45\xcc\x65\xf5\x15\x49\xcd\x05\xa9\x26\ \x1c\x86\x0a\x0f\xa3\xb1\x1f\xa3\xdb\x0d\x70\xcd\x9c\xb8\x67\x10\ \x72\x46\x57\x59\x90\xdf\x34\x02\x5c\xbd\xe8\xa3\xbb\xe5\x1b\xea\ \x4b\x52\x7b\xd6\x53\xf7\x67\x9a\x89\x32\x78\x2d\xb3\xb0\x29\x2c\ \xec\x0a\x8b\xe7\x13\xcb\xe2\xe1\xce\x07\x73\x63\x43\xcf\x2c\xdd\ \x25\x08\x3f\xc9\x25\x6b\x26\xfe\x91\xbb\xed\x2c\x18\x26\x6f\xb1\ \x3f\xed\xb1\xe7\xef\x73\xd9\x59\xe7\xda\x62\x39\x46\xff\xbf\xc0\ \x25\x48\xb2\x77\x79\xe5\x9b\xdf\xe0\x70\xfd\x5d\x86\x76\x03\x6f\ \xef\xe7\xd8\xbc\xd2\xe1\xf4\x4e\x97\xe8\xa5\x43\x09\x39\x9e\x14\ \xd0\xb1\xfb\x00\x78\x89\x9b\x57\x5f\x20\xc9\xde\x25\xcb\xde\x85\ \xe3\x75\x92\xe5\x77\x79\xf9\xc6\x35\x2e\x5f\x56\xd9\xbd\x7f\x48\ \x7c\x24\x9a\x19\x49\xe6\x49\xdf\x88\x93\x34\x04\x05\xda\xce\xfc\ \xf8\xd5\x30\x1b\xc9\x8e\x9d\x10\xf9\x58\x45\x70\xb7\x24\x7b\x41\ \xa1\xc0\x2a\x4f\x80\xea\x11\x57\xa7\x9d\x2b\x4f\xcc\xec\xd5\x00\ \xd7\x18\x72\xa6\x34\xe7\x3f\xa7\x99\xc3\x48\x41\x6b\x0e\x88\x93\ \x52\x70\x2f\xe6\xf8\x1a\xd4\x0a\x1e\x59\xa3\xab\x46\xdc\xdf\x8a\ \xe8\x0d\x5f\xe7\xde\x5e\xc2\x33\x5f\xac\xf1\x23\xff\x68\x93\x56\ \x0b\x86\x63\x17\x8d\x33\x2c\xad\x4e\x62\xd7\xc4\x30\x69\xa1\xb3\ \xa0\x36\x7f\x12\x6b\xca\x18\xdd\x6e\x08\xc1\x50\xa0\x32\x2c\x34\ \xc8\xb4\xcb\xc0\x16\x6c\x84\x1d\x08\xf8\xd1\x0c\x20\xb0\x2d\x6c\ \x52\x12\xb7\xc1\x75\x37\x62\x67\x20\x78\xe2\xfb\xa7\x4d\x21\x06\ \x7a\x7c\x8a\x52\x0b\x19\x5e\xba\x4a\xdb\x74\x60\x72\x44\xe6\xae\ \xcc\x0d\xa3\x06\xe9\x84\xc0\xb6\x05\x13\xf4\x4b\x3f\xfb\xcf\x7e\ \xc5\x1b\x8d\x04\x2b\x01\x18\xd8\x04\xca\x94\x2c\x31\x41\xcf\x25\ \x84\xb0\x42\x85\x28\xca\x69\x64\x6a\x05\x50\x1b\x98\x7a\x4e\x4d\ \x37\x98\x26\x09\x59\x92\xa0\xea\x86\x50\xc1\x85\x29\x86\x21\x9a\ \x22\x13\x1c\x8c\x24\x2e\x06\x46\xa1\x37\x18\x93\xe6\x6f\x89\x81\ \x46\x4b\x01\xf5\x0a\x0b\x8d\x8f\xa2\x1a\x16\x49\x92\x60\xe8\x3a\ \x09\x70\x12\xbe\xcb\x69\xff\x5b\xbc\x7b\xff\x1b\x7c\xf0\xad\xaf\ \xd2\x7f\xb8\x4c\xf7\xd9\x36\x37\x6e\x3c\x83\xe9\x3a\x2c\x2d\x98\ \xb8\x8d\x26\x23\xcf\xe2\x7b\xfd\xaf\x62\x4c\x75\x06\x5e\x46\x50\ \x7b\x0b\x3b\xbc\x45\xbd\x13\xe2\x7a\x97\x88\xcc\x99\x96\xa2\xd3\ \x54\xe9\x34\x55\x96\xcc\x1a\x9d\xa6\xca\xdd\xd1\x84\xa3\xbb\x43\ \xf2\xbd\x3b\x74\xd3\x4d\x9e\x6e\xe7\x9c\x3a\x1e\x5b\x3b\x09\xc3\ \xed\xbf\x62\xab\x77\x9f\xcd\xeb\xcf\xd3\x55\x1f\x60\x2d\x5d\xa1\ \x33\x99\x72\x96\x4d\x38\x8b\x62\xda\xb9\x82\x89\x08\xb6\xd4\x4f\ \xa4\x3e\xc2\x54\xea\x4c\xf2\x09\x93\x7c\x82\x1e\x58\x24\x76\x88\ \x1a\x1b\xc4\x85\xb8\x25\x6c\xf8\xa4\x89\x3a\x7b\xac\x8f\x51\x63\ \x83\x5a\xa4\x13\x34\x0b\x48\xa6\x5c\xd4\x1e\x0f\xb3\x11\xa6\x52\ \xc7\x44\x61\x98\x8d\xa8\x29\x2d\xf9\xf3\x4d\x14\xc1\x4d\xd7\x41\ \xab\x0f\x49\x47\x6d\xa8\x43\x98\x8b\x40\x9e\x2a\x3a\x35\x34\xd4\ \x7c\x04\x75\x8b\x4b\x2f\xbd\xc4\xca\xd2\x06\x7b\x3d\x9b\x93\x41\ \xcc\x3b\x6f\xbd\xcd\x69\x3f\xc2\xe8\x8f\x68\x99\x1a\x8e\x69\xa0\ \x28\x21\xea\x74\x04\xf9\x90\x3c\xd3\xa8\xa9\x19\xe4\x53\x5a\xb6\ \xcb\x24\x9f\x42\x3e\x45\x49\x5c\xb2\x58\x21\x4f\x3d\x0c\xc7\xc0\ \x4d\xeb\x4c\xa2\x29\x13\x23\x46\x51\xeb\xa8\x46\x2e\x33\xb0\x13\ \x97\x9c\x71\x82\xde\x70\xe8\x07\xf0\x17\x6f\xec\xa2\x46\x87\x4c\ \xea\x35\xe2\x60\x4a\x9d\x53\x06\xee\x32\x18\x4d\xae\x25\x09\x4b\ \xb7\x56\xc9\xda\x4b\xe8\xc3\x9c\xd8\x00\x3b\x48\x08\xf4\x1a\xb6\ \xa6\x62\xa8\x39\x5f\xf9\x77\xff\x2f\xba\x17\x0c\x99\x9c\x4e\xa5\ \x97\x6f\x54\x92\x62\x66\x4a\x68\xe5\x24\x5e\x8e\x8e\x82\x97\x64\ \xb8\xba\x2a\xf1\x6f\x5e\x30\x13\x11\x08\x88\x50\x39\x41\xad\x0a\ \x87\x1c\xa3\x80\xe5\x63\x58\x14\x13\xd5\x17\x95\x59\xef\x9f\xbc\ \xca\xd3\xee\xcf\x90\x5a\x42\x5f\x11\x02\x51\xf8\xee\xdc\xb8\xfd\ \x9d\x2c\xc6\x9f\x86\xdc\xd2\x6f\x48\xfd\x43\x84\x82\x69\x9a\x34\ \x2e\x4d\xf9\x78\xe7\x17\xf8\x56\xfc\xab\x32\xdb\xa6\xfa\x3d\xb4\ \xe4\x16\xa9\x2e\xbc\x8c\x3b\xcf\x6e\xc9\x51\xa6\x6a\x46\x6e\x0f\ \x6f\x72\xe9\x6c\x83\xef\x05\xb7\xf9\x93\xd7\xfe\x84\xf5\xb5\x80\ \xc5\xd5\x4f\xf3\x03\xed\x98\x23\xfd\x53\x90\xbc\x22\x26\x45\x10\ \xf2\x82\xfa\xb5\x0d\x9e\xbf\x15\xb1\xf7\x70\x91\xc1\xc9\x9e\xc8\ \xca\x5e\x42\xec\xea\x0c\xd3\xd1\xb9\xa9\x67\x6b\xee\x98\xd8\x21\ \x7a\x60\xc9\xc0\xae\xbe\x06\x30\x74\x86\x18\x9e\x55\x29\xde\x90\ \x5f\xd7\x52\x9b\xe8\x81\xc5\xc0\x15\x42\xfb\x96\x2a\xb2\x3a\x88\ \x2b\xc1\xd8\x8f\x69\x34\xcb\x8c\xde\x82\x66\x8e\x36\xe8\xd3\x5a\ \xe8\xe0\x29\xa6\xf0\xc1\xf0\x22\x70\xe1\xb3\x9f\xdc\xe0\xa7\xff\ \xf9\x17\x59\x59\xb9\xce\xeb\x6f\xbc\xc7\xb7\xbf\xf5\x1d\xd9\xe6\ \x3d\x8a\x1e\xb1\xb6\xb7\x44\x6d\x51\x9c\x60\xf5\xfe\x25\xbc\xf4\ \x14\xb7\xd8\x9b\x93\xe7\x5d\x89\x8b\xe7\xa6\x43\x4a\xec\x5b\x8e\ \x3c\x15\x18\x39\x28\x47\x9c\x02\x24\x7f\xfc\x61\x37\xa7\xd8\x99\ \xbd\x39\xe8\xb1\x53\x0b\x69\x5c\x11\x23\x57\xb6\x3f\xc4\xb7\x3b\ \x12\x9a\x88\x4c\x2c\x06\x52\xc7\x7e\x8c\x6e\xb1\x00\x8b\x67\x34\ \xbb\x39\x61\x41\x97\xc5\x04\x8c\x73\x0b\x95\x00\xdd\x55\xc8\x02\ \x1b\x57\x9f\x15\x70\x12\x87\x15\xf8\xb6\xa4\xd9\xb0\x4c\xe2\xb0\ \x87\x81\x2d\xb3\x77\x39\x64\x12\x87\x63\xa9\xac\xb8\xba\xa6\x72\ \x77\x6f\x5e\xe7\xfb\x68\xf4\x06\xcf\x76\x5e\x16\xd6\x53\x51\x9f\ \xbd\x9d\x87\x90\xbd\x26\xa7\x94\xf3\x3b\x5d\x1a\xc6\x5d\x36\xb4\ \x44\x2e\x89\x29\x27\x4a\x26\xd6\x75\xae\x5e\xb9\xc7\x5b\xb7\x67\ \xc1\x39\x68\xdd\xa7\x3d\x84\x6c\x6f\x83\x61\x7e\x1b\x10\x94\xcd\ \x0f\x76\x0e\x41\x05\xbd\xf5\x65\x76\xef\x1f\xb2\xbd\xd3\x67\xff\ \xec\x84\x7c\xe1\x29\xda\x4b\x00\x77\x39\x3d\x7c\x9d\xdf\x7f\xd3\ \xc2\x5e\xf9\x1e\x4f\xdb\x2f\xf0\x78\x61\x97\x6b\xba\xcd\x23\x66\ \x3a\x8d\x95\xd4\x47\x51\x73\xfa\x4d\x85\x58\xd1\x31\xbc\x84\xc4\ \x9e\x0f\xe0\x32\x68\xcf\x07\x75\xf9\x7c\x62\x87\x44\xc9\x18\x33\ \x98\x15\x4f\xcd\xc4\x67\x54\x70\xa2\x0d\xc7\x60\x98\x8d\xe8\xaa\ \x39\xbd\x6c\x44\xcb\x69\x42\x2e\xd8\x8f\xc4\x1e\xd1\x75\x72\xc9\ \x86\x94\x9f\xab\x63\x49\xec\xad\x2e\xae\x42\x51\x10\xf6\x06\x70\ \xb3\x6b\xb1\x79\x75\x83\x9b\x57\x63\x56\xf3\x57\xb9\xd4\x35\xf9\ \xe9\xff\xfc\x26\x2f\xbd\x20\xae\x20\x4d\x7f\x97\x83\xf4\x29\x9c\ \xf8\x21\xf5\x7e\x8d\xc3\xd4\x66\x3a\x7d\x8d\xc9\xe3\x65\x98\x7e\ \x1f\xd7\xfa\x2c\x63\x77\x42\x23\x10\x70\x28\x77\xbd\xb9\x40\x3e\ \x98\x9e\xd2\xd0\xea\x2c\x0c\x15\xce\x5a\xa2\xc8\x23\x50\xd0\xed\ \x8c\x51\xa0\x8a\xc2\x2f\x50\x19\x21\xbc\x90\x75\x6f\x3c\x6f\xc2\ \x12\x34\x71\xd8\x67\xbb\xbd\x8e\x12\xec\x73\x10\xe9\x7c\xec\x43\ \x02\xbe\xd4\x62\x34\x1c\x03\x35\xb2\x13\x8c\xee\x0a\x8f\x13\x93\ \x98\x00\x2f\xc9\x48\x2c\x0b\xd5\x2e\x46\xa5\xbd\x9c\x2c\x1d\x13\ \x13\x10\xea\x75\xf2\x8a\xb7\x5a\xc9\x0b\xcf\x04\xf5\x91\xdc\x8e\ \x94\x05\x76\x25\x33\x8f\xe7\xf5\xc4\x8f\x6f\x80\xf6\xd9\x0b\xe3\ \xf4\x23\x80\xfe\x84\xbd\xca\x34\x73\xa9\x5e\x7b\x27\x5e\x60\x1c\ \x3f\xc5\xd6\x64\x1b\xf2\x07\x98\xa6\x89\x1a\x99\xc4\xb9\x4b\xbb\ \xa3\xa3\xab\xcf\xf1\xf1\xce\x2f\xcc\xd1\x68\x83\xd6\x7d\x86\xf9\ \x6d\xc6\xf1\x53\xf4\x77\x7b\xf4\x77\x7b\xec\xbc\xf3\x29\xf4\xb3\ \xcf\x03\xf0\xb9\x2f\x6e\xf0\xc3\x3f\xfe\x53\xac\xff\x60\x84\x7f\ \x75\x11\x7f\xfb\x84\xbd\xa3\x65\xf6\x8e\x96\xc9\x17\x36\x04\xe3\ \x11\xdc\x26\xb9\x67\xf2\x60\x4b\xb8\xa5\x2c\x1d\x5a\x64\x7b\x1b\ \xe8\xb7\x4a\xc5\xd9\xec\xb2\x9f\x6b\xae\xcc\xb4\xd5\xa0\x8d\x92\ \xf1\xdc\xb1\xfa\xba\xa9\x37\xe4\x6b\x7a\x60\xd1\x6b\x6a\x73\x05\ \x63\xae\xb9\xa4\xb4\xe4\xd7\x48\x35\x9c\xda\x94\x54\x5e\x62\x87\ \x0c\x33\x51\x44\x36\x1c\x43\xaa\xe3\x4a\xe7\x21\xd7\x89\xf8\xe2\ \xf3\x5d\xbe\xf0\xc3\x57\xf9\xf1\x1f\xba\xc9\x0f\x3d\xb3\x49\xef\ \x24\x25\x7a\xf0\x1e\x83\xb7\xbf\x49\xd3\xdf\xa5\xe9\xef\x32\x8a\ \x0e\x58\x2b\x46\x6f\xce\x3a\x26\xdd\xd6\x7d\xa8\x3d\x4d\xfd\xd2\ \x31\xd4\x9e\xc6\x4b\x4f\x31\xf4\x87\x28\x69\x4f\x7c\x28\x3d\xf2\ \xc1\x48\x4e\x4a\x37\x02\x31\x84\x7a\xd6\xca\x65\x26\x16\x0e\x9c\ \x42\x40\x34\x42\x11\xd6\x59\xc5\xf4\x48\xe2\x36\x68\xe9\x22\x31\ \x6c\x0e\x7a\x17\x02\xb5\x35\x9c\x08\x4c\x5c\x72\xce\x55\x9d\x72\ \x51\xe8\x8d\xfd\x18\xbd\x0c\x4a\xc1\x40\x98\xa2\x90\xab\x24\x5c\ \x8f\x1c\xdd\x55\x30\x42\x9b\x88\x8c\x28\x31\x71\x4d\x55\x36\x32\ \xf4\x62\x01\x4d\x49\xaf\x59\xc5\x64\x48\x23\x0c\x67\xc5\xdd\xb9\ \x25\x36\xc9\xfa\x32\xec\xcc\x67\xe2\xa9\x72\x17\x3d\xfc\x24\x5e\ \x6f\xc4\x54\xb9\x3b\x17\xdc\x7b\xfd\x55\x3e\x6a\x9c\xb1\x7f\x10\ \xa2\xec\x05\xa0\x7c\x89\x96\xe9\xd2\x32\x61\xdc\x6d\xc0\x3e\x1c\ \x65\xef\x4a\x1a\xad\x9c\xf8\x00\xe8\x6c\x74\x19\x3f\x2c\xde\x14\ \xe5\x05\xb2\xf0\x84\x37\xf7\x0f\x60\x1f\x94\x6b\x97\xd9\xfc\x0c\ \x5c\xbb\xfc\xaf\xf8\x51\xe0\xfe\xf5\x4b\xec\xde\x3f\x64\xe7\xcd\ \xb7\xe1\x6c\xc4\x78\xa1\xd8\xd9\x61\xde\xc5\x0d\x61\xb8\x2b\xe4\ \x31\xe3\xb8\x41\x63\xb7\x07\x95\x3d\x76\x73\x7f\x9f\x1d\xd2\x55\ \xf3\x22\x63\x86\x5c\x1a\xe5\xf4\xec\x10\x33\x68\xcc\x65\xda\xc4\ \x0e\xe9\x8e\x52\x1e\xa3\xc8\x60\x3e\xff\x7d\x16\xf2\x9c\x5e\xa6\ \xa0\x33\x9f\xd1\x35\x47\x48\x3c\x7b\x99\x42\xae\xb9\xf2\x44\xea\ \x6a\x85\xfb\x66\x1e\xd1\x6a\xb7\x58\x6e\x77\xf8\xec\x8b\x2b\x34\ \xba\xb7\x78\xea\x6a\xca\x92\x95\xb2\x6a\x6d\x30\x71\x84\x19\xcc\ \x28\x3a\xa0\x69\x8a\xbf\xa3\x3c\xd6\xfd\x35\x70\x1e\x52\xf7\xd7\ \x84\xef\x83\xb5\x21\x9d\x81\x0e\x0f\x76\x61\x4d\xc0\x0c\x3f\x69\ \xd0\x70\x15\x5a\x9a\x23\xe6\xee\xda\xae\xec\xd8\x55\xa9\xb8\x79\ \x88\xa5\x82\x2d\x5c\xe6\xf3\xbd\x5d\x86\xc9\x2d\x74\xbe\x27\x5a\ \xce\x15\xaa\xcd\xb1\x91\x83\xaf\x92\x9d\xb0\x2b\x22\xa2\x0a\xc5\ \xa6\x8a\x3d\x15\x02\x1a\xcc\x18\x08\xe1\x92\x13\x13\xa0\x6a\x0d\ \x12\x2f\x97\xd0\xc1\xd5\x55\x99\xb1\xcb\x13\x20\x0e\x95\x39\xea\ \xac\x8a\x89\xcf\x07\x30\x61\x84\x85\xc5\xd3\xee\xcf\xcc\x65\x63\ \xd2\xd7\xe8\xab\x23\xb6\x92\x7b\x17\x3c\x23\x2e\x77\x0e\x19\xc7\ \x4f\xd1\x51\x73\x6e\xbc\xfc\x8b\xfc\xc0\x0f\x76\x68\x2d\x6f\x62\ \x77\x5b\x58\xbd\x43\xa2\xc1\xf7\xd9\x3d\xd8\x64\xf7\xfe\x21\xed\ \xe1\xcd\x0b\x6f\x5c\xb9\xec\xf0\x60\x1a\xe2\x99\x07\xb8\xd1\x1a\ \x2d\xe5\x05\xee\xbd\x9f\xf1\xf5\xff\xed\x1b\xfc\xd9\xaf\xfd\x1a\ \xde\x1b\x7f\xc2\xd5\x2b\x3a\x9f\x7b\xee\x25\x3e\xfb\x5f\xfe\x04\ \xf9\xc2\x06\xca\xd9\x2e\xca\xd9\x2e\xe3\xf8\x29\xa9\xab\x08\x8e\ \xd6\x68\x18\x77\x09\x8e\xd6\xe8\x67\x83\xf9\x2e\x5c\x81\x8d\xf5\ \xc0\x92\x59\x12\x90\x41\x0b\xf0\xb8\xca\xec\x8c\x32\x46\xba\x83\ \xde\x54\x2f\x40\x8e\xf2\x7e\x2f\x53\xe6\xb2\x70\xa3\x60\x42\xce\ \x14\x91\x75\x5b\x6a\xf3\x42\x01\x58\x8e\xf8\xbf\x78\xfd\x29\x3e\ \xfb\xe2\x0a\xb7\xd6\xae\xf1\xd9\x67\xa6\x2c\x59\x29\xdd\x25\x4d\ \x06\xb0\x0c\xd8\x22\x98\xcb\xdb\xc4\x99\x05\x76\xf9\xb9\x87\xe1\ \x2e\x87\xe1\x2e\xab\xd6\x06\x0b\xfd\x08\x2f\x3d\xc5\xd1\xc7\x84\ \xc6\x84\x7d\x75\xd6\xfc\x10\x7a\x11\x5f\x36\x48\x12\xe9\x87\x5c\ \xb0\x5c\xc5\xfd\x0e\x19\xca\xe5\xf5\x0b\x5c\x71\xb5\xf9\x31\x3e\ \x4e\x19\x44\x3e\xea\xe4\x68\x46\xd7\x79\x53\x02\x7b\xd6\x29\x1c\ \xfb\xf1\x6c\xb8\xc2\xc0\xc6\x08\x91\x7c\xb0\xa0\x54\x14\x32\x5d\ \x5c\x02\xa7\xf9\x02\xa6\x7e\x86\x97\x98\x72\x6a\x2e\x4a\x4c\xa6\ \x9a\x25\x0c\xad\x8b\x13\xc1\xc0\xe6\x1f\xbc\x85\x11\x56\xc7\xa4\ \x36\x7a\x8a\xa9\x86\x2c\xde\x3e\xd4\xec\xc4\xbb\xc1\xe6\x95\x0e\ \x5c\xe9\x70\x79\xd1\x64\xf7\x9e\xce\xc3\x83\xef\x72\xf4\x1f\xfe\ \x8a\x07\x8f\x63\xf6\xfc\x7d\x36\x54\xb1\xae\x76\x3b\xba\x47\xe3\ \xb0\xce\xb5\xf5\xd9\xf8\x92\x6a\x2d\x41\x3e\xfb\x27\xa9\xd6\x12\ \xc3\xfc\x36\x2e\x6b\x44\x97\x7a\x18\xd1\x1a\xbf\xff\xd7\xef\x63\ \xbf\xff\x3d\x99\xbd\xd7\x6a\x1b\x1c\x54\x02\xb9\x0c\x60\xe8\x13\ \x1c\x95\x26\xd7\x0a\xf9\x28\x97\xd8\x6c\xec\xc7\x18\x9e\xf8\x99\ \x4d\x27\x98\x0b\x40\x3d\xb0\x04\xfe\xd5\x1b\x02\x3a\x34\x55\x49\ \x15\x57\x03\xb7\x84\x16\xd5\xcc\xdc\x74\x82\xb9\x93\x22\x76\x05\ \x06\xa7\x08\xe8\xaa\x3f\x45\xa9\x3f\x7e\xe6\xc5\x5b\xdc\xbc\x1a\ \xb3\x62\x5e\x43\xff\x84\x06\xfd\x6c\x2e\x70\x27\xce\x81\xc8\xc2\ \x8b\x6b\x73\xd9\xb8\x7a\xbf\xbe\x08\x9c\x8a\xcf\xbd\xba\xb8\x21\ \x02\xdd\x87\xe1\x60\x93\xd5\xf6\x36\x67\x1c\x63\x27\xcb\x88\x66\ \x6f\x5d\x62\xe3\xb2\xd0\x2b\x1f\x57\x03\xb9\x0c\xe6\x91\x12\x31\ \xd8\x3d\x45\x1f\x7c\x4f\x06\xee\xf8\xd4\x13\x8b\xd4\x03\x91\x89\ \xcb\xb6\xb3\xaf\x6f\x80\x2e\x54\x71\x12\x13\x17\x8c\x87\xa0\x7f\ \x8b\x46\x46\x99\x61\xc1\xc4\x4a\x26\xb2\x63\x27\x05\x4b\xca\x19\ \x06\x36\x53\x4d\xe0\xe5\xc4\xcb\x31\xf5\x08\x88\xf0\x12\x13\x53\ \x17\x27\x42\x4c\x80\x11\xb9\xc4\xa6\xf7\xa1\x01\x6d\x58\x82\x2e\ \xbf\xbc\xf9\x32\xde\xe4\x16\x27\x85\xe3\x69\x47\x7d\x30\x37\x2a\ \xf9\x4c\x57\x61\xe7\xdd\x1a\x37\xd6\x2e\x91\x6f\xc1\xc3\x83\x88\ \x0f\xfe\xe2\xbb\x7c\xe5\xbd\xff\x8b\xc3\xc3\x13\xb1\xbc\x25\x89\ \xb8\xd9\xb9\xc1\xee\xc7\x1b\x6c\x04\xfb\x5c\xbd\xfe\x79\x39\xd2\ \x2f\xab\xfe\x02\x17\x5f\xbe\x7e\xca\xde\xc3\xa7\x68\x15\x34\xed\ \x91\xe6\x70\x79\xe3\xff\xe7\xec\x4d\x63\x24\x49\xef\x33\xbf\x5f\ \x44\x46\x1e\x91\x77\x66\xdd\xdd\x55\xdd\x5d\xd5\xdd\xc3\x69\x0e\ \x39\x33\xa4\x48\x91\xa2\xa4\x15\xe1\x7e\xba\x07\x00\x00\x20\x00\ \x49\x44\x41\x54\xb5\xdc\x5d\xd0\xdc\xc5\x7a\xd7\xd2\xae\xbd\x6b\ \x08\x82\x05\x08\x86\x77\x05\xfb\xc3\x2e\x20\xd8\x1f\x6c\xd9\x30\ \x60\xaf\xe1\x05\x0c\xfb\x83\xf5\xc1\xb2\x56\xb0\x21\xcb\xd6\xb5\ \xb2\x6e\xea\xe0\x50\x9a\xa1\x66\x28\x72\x86\x33\x54\x4f\xcf\x74\ \x75\xd7\xdd\x75\x57\x9e\x11\x19\x79\xc4\xe1\x0f\x6f\xbc\x6f\xbe\ \x11\x99\xd5\x43\x39\x1b\x8d\xc8\x23\x32\x2b\x33\xe2\x79\x9f\x78\ \xfe\x77\x93\xa3\x9d\x32\xa5\xd5\x63\x06\xa7\x36\xc5\x55\x0f\x7f\ \xbb\x00\x5c\x50\x2a\x1c\x53\x5b\x7b\x45\xbd\x5f\x82\xb9\x45\x15\ \x23\xec\x63\xf6\x3a\xaa\xc0\x53\x1a\x57\x92\x1d\x74\x00\x2b\x2d\ \x5c\x35\x19\xf6\x04\x80\xfd\x5e\x48\xc1\x2a\x31\xa9\x58\x04\xed\ \x2e\x05\xab\xa4\x0c\xbe\x82\x25\x64\x47\xab\x9a\x11\x6c\x5c\xf4\ \xb0\xe2\x85\x22\x19\xbf\x54\xce\xce\x74\xd3\x14\xe9\xa4\x0d\x7e\ \xf4\xae\xc9\xb8\x3a\x61\xa5\x52\xa4\xbc\x60\xb0\xd4\x8e\xdb\xd4\ \x2e\x65\x68\x5d\x04\x34\x97\x8e\x15\x98\x7b\x1c\x0b\x50\x3b\x24\ \x18\x5a\x82\x39\xbf\x08\xce\xe5\xe7\xd9\xeb\x5e\x02\xf7\x58\xcb\ \x0c\xa8\xd5\xf7\xb5\x90\x76\x48\x8d\x3e\x93\xae\x8b\x63\x2d\x02\ \xd3\x28\x9f\x9e\x3c\xaf\x87\xa4\x1d\xd3\xe5\x56\x54\x25\x73\x23\ \x8b\x5f\xff\x34\x56\xe7\x6d\xc5\xc4\x72\x00\xbc\x5a\x70\xac\x50\ \xf6\xdb\x74\xc6\x0b\x74\x03\xd1\x2a\x40\x06\x56\x40\x4c\x14\xb5\ \x26\x0c\xa8\x58\x45\xc5\xc6\x43\x62\x99\xe0\x8b\x68\x5d\xc1\x1a\ \x32\xf4\x0b\x62\x3c\x96\x35\xc0\x2c\x46\x0a\xc0\xe3\x68\x81\x9c\ \x71\xa5\x34\xb3\x64\x6f\x09\xe0\x34\x33\x67\xed\x88\x81\xe7\xb1\ \xbd\xff\x6d\x95\x37\x91\x8b\x5e\x20\xc7\x0b\x31\xa3\xdc\x01\x76\ \x78\xd0\x34\x78\xd4\x8a\x78\xd4\x8a\x28\x01\x2b\x95\x22\x4f\x98\ \x30\x3a\x3b\xe4\x1b\xc0\xc3\xb7\xb6\xa1\x1a\x51\xb7\xaa\x74\x18\ \xb2\xdf\x7f\x46\xf8\xb5\x33\x0e\xea\x35\xa2\xbd\x36\xeb\x5b\x6b\ \xd0\x86\xcd\x8f\xef\xd1\xee\x0a\x66\xe5\xf0\x31\x47\x3b\x2f\x50\ \xca\x3e\xa6\x1b\x09\x7d\x4c\xf6\x5d\xf5\x9c\x3b\x79\x81\xd5\xba\ \xc3\xe9\x64\x43\x68\xe0\xe1\x0d\xb5\x00\x2a\xc3\x1b\x50\x78\x0c\ \xab\x82\x8d\x9b\xb4\x69\xf5\xa6\xbd\xd4\x64\xb9\x91\xce\x96\xba\ \x77\xc2\xaa\x9a\xe2\x31\x9e\x00\x6b\xbc\x95\x80\xcc\x5a\xa5\x19\ \x46\xee\x59\x65\x2c\x2d\xb8\x29\xd9\xb8\x54\xce\x2a\x30\x27\x00\ \x5c\x81\x57\xd7\x9b\x94\x56\xd6\xc9\xdf\x99\x70\xab\x52\xa4\xb9\ \x30\xa6\x6e\x4f\x73\x28\x5a\x17\x81\x02\xef\x89\x77\x48\x73\xe9\ \x58\xb1\xf2\x0c\x43\xc7\x6c\x5c\xb8\xfb\x71\x88\xee\xb3\xff\xf6\ \xb7\x79\xfc\xf4\x9b\x9c\x76\x0e\x19\xb4\x87\x7c\xac\x71\xc5\x6a\ \xed\x26\x0b\x9f\xda\xe0\xb3\x2f\xdc\x60\x52\xfb\x12\x74\x9f\x10\ \x45\x4d\x9c\xac\x4b\x69\x12\x2a\xcf\x45\x2d\x53\x4e\xf4\x7d\x2b\ \x87\x25\x7a\xa3\x31\xe1\xd0\x53\x4c\x3c\xe3\xa5\x28\xf6\x54\x2a\ \xa6\x72\xd7\x55\x4a\xaa\x89\xfd\x90\xb8\x21\x62\x35\xc2\x32\x86\ \x06\x7d\x2b\xc9\xc4\x12\xcc\xd2\xd8\x93\xcc\x3c\xf4\x45\x88\xd0\ \xaa\x18\xe0\xc5\x63\x05\x2c\x12\xba\x57\x56\x86\x48\x00\x2b\x57\ \x9b\x5d\x60\xe2\x0d\xd9\x3b\xff\x36\xe3\xf0\x17\xb5\x06\x7f\xaf\ \xf3\xa0\x69\x40\xe6\x07\x79\x78\xf8\x98\x17\x6e\xbc\xc8\x6f\xbd\ \x97\xf4\x25\x1a\x93\x15\x16\x3a\x8f\xc8\xaf\x6c\xc4\x8d\xfe\xb6\ \xc9\x16\x3e\x8e\xeb\xef\x28\x36\x32\xad\x15\xba\x9d\x33\xc2\xd0\ \xa0\x73\x01\x0d\x33\xa2\x7d\x58\xa5\x66\x08\x2f\xc3\x0b\x96\xcd\ \x99\x61\x63\xae\x37\x09\x8f\x36\xe2\x16\xad\xaf\x50\x09\x2e\x98\ \xb4\x9b\xb0\xfc\x98\x53\xa6\xc3\x17\xa5\x76\x3e\xcd\x94\xa1\xf0\ \x98\xc1\xa9\x2d\x74\x32\x87\xb4\x43\x03\xa3\x2a\x3a\xbe\x4f\x23\ \x72\xc5\x84\xac\xd0\xdd\x6b\x7e\x2f\xc4\x7a\xce\x88\x1f\x25\x0f\ \x9e\x63\x24\xea\x75\x79\x69\xf6\xd5\x01\x7c\xef\x4e\x72\x42\x4c\ \xc7\x7b\x46\xdd\x4e\x8e\x11\x10\x00\x16\xac\xbc\x66\x13\x6f\x37\ \x12\x60\xa6\x20\x00\x5c\x28\x2d\x72\xef\xd3\x5b\x6c\x6d\xdd\xe1\ \xbd\x6f\xdf\xe7\x7f\xfe\x7f\xdf\xe4\xcd\xf7\xff\x98\x3f\x63\x85\ \xdb\xb6\xcb\xcb\x5f\xfd\x7d\xde\xff\xd4\x67\xf9\x7b\xff\xc9\x6d\ \x6e\x37\x36\xd9\x6f\xef\x62\x52\x42\xd5\xed\x6b\xb9\x15\x51\xd0\ \x27\x5b\x29\x31\xe9\xbb\x50\xc8\xa9\x5c\x62\x1d\xc8\x12\xc0\xd2\ \x3b\x91\xf8\x8c\x81\x41\x2f\xd6\xd5\xd5\x38\x02\xa8\x34\xb1\x94\ \x14\xb2\x3a\x5e\xea\x62\x09\x6a\x29\x2d\x0a\xd6\x90\xf1\x60\x21\ \xd6\xc0\x02\xe8\x82\x79\xa7\x80\xb5\x3c\x4f\xb1\xb0\xa7\x97\x36\ \x69\x33\xed\x66\x82\x1d\xad\x08\x78\x5d\x19\x78\x0f\x9a\x86\x7a\ \x7e\xf3\xea\x2e\x23\xff\x28\xae\xd1\xbb\x10\x45\xa9\xd5\x08\xfc\ \x1d\x35\x81\xc8\xa8\x1a\x58\x83\x3c\xa6\xb5\x42\xcd\x14\xe3\x02\ \xfa\x40\xeb\x03\x78\x56\xdd\xa6\x61\x46\x84\xf5\x06\xf7\x1f\x5c\ \x11\xad\xff\x0d\xb8\x03\xd9\xd8\x47\x4c\xa6\x4c\x69\x59\x48\x89\ \xd2\xaa\xf0\x8a\x48\xe9\x50\xa9\x83\x71\x75\xc8\x20\xfe\xe2\xa5\ \xec\x63\x06\xd8\x58\x83\xbc\xea\xb3\x56\x37\xab\x74\x2a\x11\x46\ \xd0\x9f\x31\xca\x54\x40\x03\x21\x23\x0a\x83\x52\x02\xdc\xa5\x30\ \x87\x6b\x8e\xe7\x02\x58\x0f\x8c\xb4\x8a\x1e\xd6\x60\x42\xb5\x3c\ \x6d\xac\x22\x73\x29\x9a\x35\xd1\x31\xbe\xbc\x61\xb0\x5c\x10\x12\ \x02\xa0\xb2\xb0\x4a\xeb\xea\x94\xca\xc2\x2a\x10\x70\xe1\x65\x58\ \x9a\xc3\xca\x12\xd0\x27\x17\x87\xca\x2b\xd5\xf1\xde\xa4\xb5\x9d\ \xe3\x07\x2f\xa1\xf0\x37\xff\x46\x9c\x45\x18\xf1\xf2\xf7\xbd\xcc\ \xff\xd0\xa8\xf2\xcb\x2f\x2e\xf1\xf3\xff\xeb\xff\xc5\xbe\x97\xe7\ \xd2\x2f\xb3\xf8\xf0\x3d\xdc\x7f\x7d\xce\x57\x7e\xf2\xef\x73\xeb\ \xd3\x9f\x63\x70\x7c\x86\x1b\x64\x21\x18\x52\xce\x25\x03\x22\x7e\ \x5c\xa3\x57\x8d\x0a\x5c\x5d\x66\xe7\x06\x3c\x9c\x41\x15\x73\x74\ \x4e\xe9\xc5\x64\xf5\x6a\x14\xf4\x45\x7f\x65\x2d\x4f\xa3\x54\xce\ \x92\xf9\x07\x3f\xf9\x4f\x7e\x6e\x1c\x46\xd8\xfe\x88\x61\x6c\xb0\ \x15\xac\x21\x7e\x68\xe1\x87\x96\xba\x0f\x60\x99\x3e\x93\x20\xc2\ \x34\x3d\x32\x64\x19\x87\x11\x56\xce\xc7\x18\x1a\x04\xd6\x04\xd3\ \xf7\x15\x98\xf3\x7e\x0e\x3f\x0b\x96\xe7\x31\xb6\x2d\xe5\xb5\xa8\ \xd6\x8e\xb8\xea\xbd\xc3\xe5\x35\x25\x7a\x97\x9e\x08\x45\x9f\xbc\ \xf9\x80\xc2\xd5\x12\xd6\x55\x95\x76\x77\xcc\x5b\x57\x1d\x1e\xef\ \xed\x91\x5d\xbc\x64\xbf\x56\x63\x6b\xa9\x45\xbf\x9f\x05\x31\x72\ \x84\x30\xf4\xc9\x98\x16\xe3\xf1\x94\xf2\xc2\xd0\x87\x91\x48\x66\ \x3f\xef\x44\x5c\x5c\x7a\x8c\x8f\x5b\x2c\xe4\x4f\xa8\xde\xf9\x18\ \xb7\x22\x1f\x7f\x60\x30\xe2\x8c\x71\x7e\x8b\x5c\xe6\x4a\x80\xb9\ \x26\x1e\x47\xf9\x3d\x26\xce\x32\xd1\xc2\x12\x86\xd7\x63\xe2\x64\ \x69\x87\x06\x61\x36\x10\xe3\x4d\x62\x26\x68\xe4\x1c\x26\xee\x34\ \xe0\x60\x8a\xcc\x6f\xc2\xac\x8f\x35\xb0\x19\x7b\x63\xac\xaa\xa9\ \x1e\x97\xc2\x1c\x13\x23\x60\x62\xcc\xe6\xfd\x56\x7d\x07\xb7\x1c\ \xf7\xe5\x9d\x64\xa9\x96\x07\x78\x91\x81\x39\xc9\xaa\xf2\x7e\xaf\ \x6b\xd0\x2c\x4e\x01\xbc\x75\x7f\x85\x92\x55\xe2\xde\xed\xa9\x9c\ \x19\x7b\x4e\x0c\x60\x38\x3b\x3b\x67\x7d\xc1\xe6\xc2\xcb\x50\xca\ \x4e\x89\x65\xcd\xde\xc0\xf1\x7b\x78\x83\xe9\x73\x17\x5e\x86\xde\ \x69\x95\x0f\xbe\x71\xc8\xd7\x7f\xe5\x6b\x5c\xee\x3f\xe1\x85\x4f\ \xbe\x82\x5d\x76\x70\x4b\x36\x8d\xb5\x25\xb6\xee\x7f\x8c\xbf\xf3\ \xf2\x8b\x7c\xf5\xe1\x11\x8e\x13\x50\xb7\x8a\xbc\x7d\x70\x89\xfb\ \xf5\xd7\x29\xdc\xf4\x78\x61\xf5\x2e\x41\xc9\x20\x37\x09\x31\xcc\ \x3c\xc8\x10\x75\x2c\x2f\x5c\xcb\xc7\xb0\xb3\xf4\x7a\x97\xbc\xf5\ \xc6\xeb\xd8\xd6\xd4\xe8\x1c\x4f\xf2\x71\xf3\x19\x97\xd5\x5c\x8d\ \xad\xcf\x6f\x60\x79\x6b\x8c\x30\xc8\x96\xb3\x54\x07\x06\x79\xc0\ \x9b\x98\xe4\x81\xff\xe5\xdf\xfc\x3f\x64\x7e\xfc\x27\xfe\xf1\xcf\ \x01\xf8\x71\x4f\x80\x8a\x9f\x25\xf2\x27\x64\xc3\x80\x6c\x18\x30\ \xa4\x30\x03\xea\xa1\x5f\xc0\x34\x3d\xfc\xd0\x22\x34\x6a\x64\xb2\ \x82\x89\x87\x51\x15\xc3\xe8\xe1\x4f\x6a\xe4\x0c\x1f\x7c\x8f\x71\ \xb4\x40\xd6\xef\x91\xf7\x73\xb8\x91\xcd\x64\xb2\x42\x77\x74\xc5\ \x52\xe1\x90\x25\xdb\x98\x01\xf3\x83\xa6\xc1\x37\x5e\xbf\x4d\xdd\ \xbf\x03\x41\x95\xcb\xee\x05\xdf\xba\xff\x2d\x46\x2d\x9f\x83\xf3\ \x90\x8b\x8b\x90\x4f\xfe\xad\x13\x38\xb7\xa9\x56\x26\xf4\x2e\x85\ \x81\x13\x95\x03\xc2\x6c\x80\x39\x99\x82\xb8\x15\x4d\x28\x60\xe0\ \x38\x19\x72\xb9\x0c\x97\x97\x13\xba\x83\x31\x4f\x9e\x9c\x72\xbe\ \x73\x44\xb8\xde\xc3\xa8\xf6\xa8\x2c\xfc\x6d\xca\xb5\x0f\xb8\xba\ \xda\x80\x62\x8d\x5c\xe6\x8a\x49\xb8\xc0\x24\x5c\xa0\x54\xdb\xc3\ \xbf\x18\x08\x29\xe1\xf5\xb0\x0d\x18\x46\x06\x5c\x88\x3c\x85\x41\ \xde\xa4\xc8\x08\xd7\xf2\x29\x18\x79\x02\xd7\xc4\x2f\x7a\x54\x46\ \x25\x02\x5f\xdc\xcf\x05\x45\xcc\x49\x16\x73\x92\x55\xec\x7b\xdd\ \x2d\x5f\xf5\x99\xb8\x62\x7f\xbf\xe8\xe1\xc5\xee\xb3\x4a\xbe\xa8\ \x6a\xf7\x9a\x8d\x88\x95\x8d\x06\xeb\x0b\x59\xb6\xee\xaf\x50\x69\ \x42\xde\x86\x72\x7e\xca\x6c\x95\x85\x55\x9c\xd3\x88\x5c\xd9\x20\ \x5f\x2c\x33\xf0\xcd\x04\x13\x03\x38\x7e\x0f\x72\x1f\x83\xe0\x8a\ \x0b\x2f\xc3\xf9\x91\x41\xfb\x69\xc0\x37\x8f\x8e\x79\xfb\xd1\x01\ \x6f\x1c\xfa\xbc\xbb\x7f\xc6\xc1\xaf\x7f\x97\x85\xdb\x11\x77\x6e\ \x3f\x80\x4c\x01\xdf\xce\x71\xab\xb1\xc8\xf7\xdf\x59\xe6\xd9\x38\ \xc7\xc3\xed\x03\x26\x66\x95\x67\xe3\x21\xce\xce\x77\xa8\xad\x67\ \x59\xb9\xd1\x24\x18\x16\x71\xfd\x88\xa5\x6c\x71\x9a\x6b\x91\xa9\ \x90\xf5\x47\x50\x5c\x64\x6f\xcf\xe3\xfd\x47\x0f\x13\x20\x2e\x17\ \x7b\x8c\x27\x79\x8c\xc0\xe5\xc1\x8b\x8b\x2c\x2d\xdf\xc2\xce\x07\ \xe4\x02\x9b\xec\xc4\x50\xd2\x42\x26\xe4\xff\xca\x2f\xfe\xb6\x90\ \x13\x51\x77\x84\x11\x8b\xe8\xbe\x35\x01\xf2\x6a\x78\x8b\x74\xa5\ \x29\x39\x11\xbb\xda\x86\x7e\x41\x79\x27\x94\x7f\xcf\xf0\x70\x23\ \x21\x37\xa4\x26\xce\x1a\x9e\xea\x4b\x11\x06\x2e\x05\x6b\x48\x2e\ \x12\xae\xb5\x79\x3d\x84\xbf\xf1\xfa\x6d\xc2\xa3\x0d\x06\xf6\x90\ \x62\xa3\xc0\xc5\x5a\x12\xe5\xe1\xfd\x55\xa0\xcf\x77\x27\x0b\x34\ \x2f\x3c\x8c\xaa\xf2\xc3\x27\x7a\xa1\x4d\xfc\xa1\x9e\x6c\xa7\xf4\ \xaa\x0c\xd3\xb6\xc2\x1e\xbb\x7f\xd8\xa3\x5e\xaf\xf1\x62\xf3\x5b\ \x98\xf6\x06\xeb\x5b\x87\x71\x98\x3a\x96\x0e\xa7\x36\x03\x6c\xe5\ \x33\x16\xc5\x8a\xb1\x5b\xad\x2a\x00\x95\x35\x27\xf4\x28\xd2\x2c\ \x0f\x68\xc5\x61\x5f\x6b\x60\xcf\x00\x55\xc9\x88\x6a\xa4\xb5\x01\ \x4d\xbe\x56\xf5\x45\x7b\x26\xb9\x0c\x65\x16\x5c\xcd\xac\xaa\xcc\ \xb4\x5a\xa3\xc6\xab\x0f\x9a\xb1\x7c\x58\xa6\x12\x27\xf4\x49\x19\ \x21\x6d\x08\x80\xc6\xea\x21\x76\xff\xd3\xf4\x2a\xd3\xe1\x2d\xa3\ \xf3\x15\x11\x81\x53\xd4\xf7\x21\x17\x5e\x06\xe7\x34\x62\xfb\x78\ \x97\x9d\xed\x33\x0e\x8e\x3d\x2e\x7b\x59\xee\xdd\xbe\x01\xc6\x31\ \xbf\xb1\xf3\x3a\xc1\x7f\xf1\x88\x27\xff\xf1\x84\x1f\xfb\xf7\xff\ \x19\xf5\xd2\x15\xbd\x46\x9e\x57\xbf\xf4\x2a\x3f\x7b\xe7\x36\xff\ \x0a\x78\xf3\x6b\x7f\xcc\x62\x65\x89\x6f\x1e\xc2\x8d\x7f\xfb\x3e\ \x4b\xb5\x7b\x34\xef\x82\xe7\x56\x38\x26\xa0\xcc\xd4\xed\xf6\xbc\ \x9b\x33\x98\xed\x66\xd4\xce\xe6\x30\xc6\x86\x32\x12\x25\x80\xfd\ \x81\x29\x3a\x00\xfd\xf8\x4f\xfc\xe3\x9f\x33\x62\x31\x1c\x75\x47\ \xc8\xfb\xbe\x69\x29\x76\x96\x00\x1e\xfa\x05\xa2\x68\x02\xa5\x2c\ \xe1\x18\xc5\xce\x7e\x68\x91\x37\xe3\x9e\x5e\x46\x8f\x0c\x59\x06\ \x7e\x06\xd3\xf4\x18\xf8\x19\x6c\x33\x27\xf4\x75\x29\x4b\xde\xcf\ \x51\x2d\x2d\xd1\x77\xc7\x34\x4b\x25\x96\x0a\x87\x5c\x7a\x22\x31\ \xe7\x62\x34\x21\x30\x7b\xd8\x79\x8b\xe5\xaa\x8f\x91\xe9\x53\xae\ \x1d\x70\x1e\x4d\x30\x96\x3d\xce\x1f\xe6\x31\x5a\x0e\xcb\x2f\x8d\ \x59\xbe\x82\x9e\xdb\x24\xeb\x1a\x62\x1c\x97\x33\x62\x6c\x58\x62\ \xd0\x4b\xe8\xc7\xd5\xd6\x86\x0a\x10\x74\x8c\x88\x8a\x65\x13\x86\ \x22\xdb\xac\x64\x0c\xc9\x19\x35\x32\xa3\x2e\xdb\xad\x2e\xee\xd5\ \x33\xce\x2e\x2d\x7c\xf7\x8a\x6c\xd9\xc7\x9d\xbc\x40\xa9\x76\xc6\ \xc4\xc9\xaa\xad\x04\xb0\xcc\x26\x23\x0f\x93\x71\xa8\x3c\x07\x92\ \x3d\xf5\x6d\x98\xf5\x15\x0b\x03\x2a\x73\x4d\xbf\xc9\xfd\x27\x41\ \x49\xed\x27\xf7\xad\xe4\x8b\x8a\x7d\x0b\xb5\x02\xaf\xde\x9d\x05\ \x30\x40\xc5\x5c\x87\x4c\x1c\xde\xcf\xb8\x8c\x3d\x07\xab\x78\x93\ \x30\xff\x01\x21\x35\xaa\xfd\x45\xda\xe6\x90\x6a\xbd\x9f\x90\x0e\ \x03\xdf\xe4\xc9\xde\x0e\xad\xf7\x43\x5e\x3f\x18\xd0\x3a\xbd\xa2\ \xd5\xf5\x58\xa8\xae\xab\x16\x58\x3f\x52\x1e\xf1\xa7\xc3\x32\x7f\ \xf0\xbb\xbf\x4d\xdd\x3b\xe6\xe3\x4b\x2f\x61\xaf\x2e\xc7\x95\x29\ \x79\xbe\xf8\xea\x5d\x1e\x9e\x79\x3c\xdc\x3e\xe0\x46\x29\xcf\xdb\ \x07\x97\x64\x4e\x0f\xd9\xfa\xf4\x3a\xd5\x8a\xc5\xb0\x6f\x32\xca\ \xda\x4c\x46\x23\xf2\xd9\x12\xae\x1f\x51\xcc\x5a\x3c\x3b\x1f\xcc\ \x30\xb1\x39\x3a\x27\xb2\x4a\x18\x81\x8b\xbd\xb4\xcc\xbd\xad\x9b\ \x64\x73\x8b\x94\x27\x50\x30\x73\x74\x03\x87\xb1\x99\x27\x18\x3a\ \xd4\xcc\x1c\x3f\xff\xcb\xbf\x4e\xe6\x27\xfe\xc9\xbf\xfb\x73\x12\ \xac\x45\x2b\xc0\x37\x2d\xda\x13\x1b\x3b\x93\x34\x36\xa4\x2e\x2e\ \x58\x43\xc2\xac\x00\x71\xc1\x1a\x62\x99\x3e\x7e\x68\x61\x9a\x1e\ \xc3\xa8\x4a\xc1\x98\x66\xbc\x49\xdd\x6c\x9a\x53\x59\x91\x21\x4b\ \x86\x2c\xc5\xc5\x5b\x58\x85\x1b\x94\x2a\x5f\xa2\x18\x8d\xd8\x3b\ \x38\x22\x1b\xeb\xd9\xf6\xe2\x09\x95\x9b\x5d\x0a\x57\x4b\x84\xf9\ \x36\xa5\x1b\x11\xed\xbf\xa8\x13\x3c\x9d\xe0\xe5\x4d\x4e\xc7\xb7\ \x39\x0f\x8b\x94\x4f\x9e\x61\x98\x65\xaa\xe3\x0c\x8e\x61\x4c\x75\ \xb0\x96\x77\x5b\x8d\xd3\x23\x87\x06\xe4\xc2\x80\x8e\x11\x31\x34\ \xc0\x8b\x53\x1a\x23\x0a\x14\x8c\x3c\x8e\x93\x61\xdc\x17\xc3\x4d\ \xba\x97\x65\x8a\x91\xd0\xc0\xd0\x60\xe2\xf8\xb4\xa8\xd2\x34\x46\ \x78\x43\x18\x45\x23\x02\xd7\x24\x37\xb4\xf0\x4a\x42\x0f\x57\xcb\ \x03\x5c\xcb\x57\x46\x9b\x04\xa3\xdc\x4a\x50\xa7\xf5\xef\xc8\xcc\ \x4d\xf5\x6f\xac\x87\xa5\xec\x98\x18\x01\xb9\x5c\x46\xe9\xdf\x8f\ \xdd\xac\xf2\xe2\x8a\x41\xa1\x94\x04\xf0\x4a\xa5\x38\x05\xb0\x26\ \x27\x44\x5f\x0f\x01\x60\xaf\xf2\x36\x0b\x76\x59\x01\x77\xe0\x9b\ \x38\xa7\x11\xfd\xed\x23\xbe\xf9\xc1\x84\x6f\x6f\x6f\x73\x76\xe2\ \x31\x18\x65\x58\xa8\xae\xd3\x8a\x5a\x78\x91\x85\x87\x47\x2f\x73\ \x83\x62\xbe\x44\x60\x65\xf9\xe3\xd7\xdf\xa0\x7f\xf2\x2e\x9f\xa8\ \xaf\x53\xdc\x68\x60\xe6\xc6\x14\x16\x1a\x7c\xe1\x07\x3e\xc5\x07\ \x7b\x1d\x25\x2d\xee\xf6\x73\x9c\x1d\x5c\xf0\xb9\x57\x6d\xfc\xea\ \x3a\x13\xa7\x4f\x29\x63\xe0\xfa\x11\xa5\xcc\x84\x28\x58\xe4\xb8\ \xf3\x98\xf7\xdf\xdf\x57\x20\x6e\x8f\x2c\x8a\xf4\x15\x88\xef\x17\ \x2b\x6c\x7d\x7e\x83\x49\x2f\xcb\xd8\xcc\x33\x0c\x1c\x6a\x99\xb2\ \xda\xf6\x30\xf8\xc5\x5f\xfe\x35\x61\xd8\x29\xa0\xc6\x60\x96\x00\ \xd6\x99\x39\x01\xe6\xa0\x44\x3e\xd3\x17\x2e\xb7\x18\xc4\x96\xe9\ \x13\x50\x24\x67\xf8\xca\xf0\x9b\x30\xc0\x36\x73\x84\x4c\x98\x04\ \x11\x94\xb2\x0c\x87\x11\x79\x53\xe4\x26\x67\x83\x12\x76\x71\x15\ \xb7\xd3\x66\x64\xbd\xcb\x49\xe4\xf1\xc2\x52\x01\xe7\x4a\xe4\xfc\ \x0e\x17\x2e\xd8\x6c\xff\x30\xc1\x59\x91\x61\xc5\xa2\x91\x5b\x22\ \x6b\x44\xac\xd7\x7a\xdc\x9b\x34\x58\xa8\xd7\x69\x56\xb3\x9c\xf5\ \xc4\x84\x4e\x59\x71\xac\xae\x1e\x31\x13\x0f\xf2\x26\x0b\x51\x8f\ \x88\x82\xca\xd3\xd5\xf3\x6f\xe9\x19\xe4\x2a\x22\xbf\xd7\xca\x89\ \x96\x53\x41\x98\xc1\xf7\x0b\xe4\xd6\x1a\x18\x5e\x06\x9b\x2e\xed\ \xd0\xa0\x33\x8e\xa8\x1b\x05\x26\xe3\x90\x5c\xc5\xa4\x60\xe4\xf1\ \x2c\x97\x9c\x51\x23\x70\x67\x1b\x72\x55\xcb\x03\x46\xe3\xec\x5c\ \x30\x4b\x00\xab\x4b\xbd\x99\x13\x00\x2e\x8b\x86\x78\xb9\x5c\x46\ \x34\x18\xd4\x3c\x10\x3a\x80\x1b\xed\x2c\xb5\xe5\xd9\x4a\x13\x63\ \xb2\x42\xa9\x7c\x48\x18\xbb\xe3\xc2\xfc\x07\xd4\xed\x9b\x5c\x78\ \x62\x41\xf7\xaf\x4e\x19\x7b\x0e\x4f\x8e\x2e\xf8\x83\x0f\x26\x5c\ \x3d\x3b\x54\xc9\xf2\x46\xce\xc4\x75\x1c\x0c\xad\x3b\xa5\x17\xff\ \x5b\xc8\x2f\x12\x65\x3c\x3e\x3c\xed\x70\xfa\xfa\x1e\x2f\xdd\xbd\ \xa4\x72\xe7\x53\x90\x29\x50\x2a\x98\xfc\xc8\x8b\x5b\x3c\x3c\xf3\ \x38\xda\xdb\xe1\x70\x78\xc4\xc3\xc3\x1d\x16\x7d\x9f\x97\x3f\x96\ \x21\x30\x8a\xb8\x81\x09\x85\x0c\xb9\x30\xc2\x30\x43\x4e\x5b\x59\ \xde\x7f\xf4\x90\x61\x60\x62\x5b\x21\xc3\xc0\x64\xb1\x31\x51\x9a\ \xb8\x76\x67\x95\xad\x1b\xeb\x80\x4d\xcd\xcc\x31\xea\x8d\x18\x65\ \x27\x22\x57\x23\x70\xc8\x96\xb3\xfc\xc2\x2f\xfd\x7a\x72\x40\xb9\ \x94\x0c\xea\x60\xd4\xe6\xcf\x26\x0b\x03\x57\x19\x7c\x52\x1b\x0f\ \xfd\x02\x56\x65\x40\xbf\x2f\x06\x9a\xfb\x95\x08\xbf\x5f\x60\x48\ \xa8\xc2\xd4\xd3\x28\x5f\xec\x53\x5d\x2a\xe1\x5e\xf4\x55\xc6\xda\ \xc7\x6b\xa5\x44\x97\xcb\xfa\xe3\x8f\x93\x77\xaa\x2c\x2f\xc2\x32\ \x90\xdf\xa8\x72\x70\xd7\xe3\xd6\xd8\xe6\x20\xe7\x69\x61\xe4\x21\ \x27\x8f\x1f\xd3\xd2\x0b\x29\xe3\x5c\x5b\xbf\xe8\xb1\x94\x59\x66\ \xe2\x0b\x40\xd7\xf5\x2a\x0a\x73\x2c\xf4\xa9\x09\xa5\x5e\x4e\xf4\ \xbe\x95\x2d\xa8\xa4\x5b\x67\xbf\x8b\x51\x16\x85\x9b\xdd\xb0\x8b\ \x21\x9a\xe3\xa8\x84\x1c\xd7\x99\x40\x11\xd5\x73\x4d\x0f\x4c\xf8\ \x45\x2f\xf6\xeb\x4e\x34\x1f\x32\x73\xc3\xc9\x7a\x30\x43\xef\x9e\ \xd9\xac\xad\x6a\x2e\xb4\x24\x03\xe7\xd7\xd6\x39\xed\xef\x26\xf4\ \x30\x40\x79\xd5\x60\xc2\xad\xb8\xe8\x20\xa0\xe3\x91\x00\xf0\x59\ \x7f\xc0\x93\xbd\x2c\x8f\xde\xd9\xe3\xb2\x97\x05\xb2\xaa\x57\x85\ \x6c\x7f\x95\xbe\xb5\x08\x20\x6a\xd1\xac\xde\x05\xe0\x4f\x7a\x0f\ \x09\x7e\xf6\x11\x3f\xf5\x9f\xdf\xe6\x85\x7f\xef\xd3\x98\x61\x83\ \xfa\x66\x93\x7f\xf5\x5f\xff\x34\x3f\x1b\x6b\x64\x80\xff\xe9\xb7\ \xde\xc3\x37\xd7\xf8\x77\xfe\xe9\x4b\x0c\xfc\x88\xc1\xb0\x4d\x29\ \xae\x00\x3f\xbd\x14\x35\x7d\x8d\xbc\x20\x9e\x05\x8e\x19\xb4\x81\ \xfc\xac\x2e\xee\x76\x66\xb5\xb4\x3f\x30\x29\x85\x39\xd1\xa0\xa0\ \x10\x77\x29\xd6\x01\xac\x1b\x76\xe9\x9b\x7c\x4d\xdf\x5f\x82\x74\ \x26\x6b\x29\x4e\x2a\xd2\xff\x46\xdf\x0f\xb1\x2a\x06\xa3\xa1\xc9\ \xe9\xa3\xbd\xb9\x9d\x7d\x00\x96\x0b\xcb\xac\x2c\x79\xdc\xc8\xdc\ \xe2\x96\x91\x65\x61\xa5\xce\xa7\x1a\x6b\x2c\xac\xd4\xd9\xba\x73\ \x87\xd5\xfa\x06\xab\xf5\x0d\xbe\xf0\xf1\xfb\xdc\x7a\xe5\x8b\x82\ \x59\x35\x00\xcb\x04\x99\xce\x9c\x03\x40\xcf\x10\xd1\x2f\xad\x54\ \x48\x2f\xef\x71\x9d\x89\xf0\x05\xb7\xfa\xb4\x3a\x72\x86\xb0\xad\ \x52\x2e\xf5\x84\x9c\x74\xee\x43\x2b\x34\xd4\xf3\xf2\xbb\xc8\xfd\ \xf5\x72\x7e\x3d\xc2\x17\x50\x53\x00\xce\xd0\xa5\x99\x81\x17\xee\ \xdc\xe1\xf6\x9d\x8d\xb9\x00\x06\x88\xb2\x67\x73\x25\x84\x88\xbe\ \x8a\x34\xc1\x9d\xa3\x0b\x26\xdc\x22\xcb\x01\xce\x69\xc4\xd3\xc3\ \x55\xde\x7b\x27\xe0\xd1\xdb\xae\x62\x5f\x09\xda\x16\x02\xc0\xb2\ \x52\x5a\xaf\x98\x96\xe3\x80\xf7\xfb\xcf\x44\xbb\xaf\xea\x5d\x7e\ \xe3\x38\xe2\x7f\xff\xef\xfe\x4b\xce\xfe\xf4\x37\x09\xcd\x76\x0c\ \x44\x83\xff\xf4\xef\x7f\x9e\xca\xfa\x16\x93\xf3\x47\xb4\xda\x06\ \x6f\x7e\xfb\x77\x79\xfb\xe1\x1f\x51\x2b\x89\xf3\x70\x15\x64\x54\ \x3a\xa6\x32\xde\x46\x56\x3c\xa6\x41\xef\x00\x15\x5f\x55\x75\x5c\ \xf5\xa7\x19\x72\x55\x22\xd1\x01\x48\x02\x4b\x67\x61\x19\xa1\x93\ \xcf\xe9\x85\xa2\x05\x6b\x88\x17\xb3\x70\xdb\xec\x61\x8f\x97\x13\ \xde\x0b\xc1\xc8\x86\xa8\x08\xa9\xcc\xd6\x87\xc9\x7d\xf2\x85\x22\ \xfb\xdb\x87\xfc\x9f\xbf\xff\xfb\xac\x6f\xad\xd1\x58\xdb\x4b\xec\ \xf7\x29\xe7\xa7\xb9\x71\xc3\x8f\xe3\xe7\x00\xeb\xe8\x50\x2f\xe1\ \xc3\x2a\x1c\x0f\x05\x6b\x7f\x76\xb3\xc4\xc3\xf7\xf2\x74\x3a\xfd\ \x44\x0e\x83\x1e\x45\x2b\x85\x39\x5c\x67\x9c\xa8\x6f\xc3\x8c\xbd\ \x16\x3d\x43\x31\xb1\x6b\x8e\xd5\x73\x92\xad\xa5\x6b\x4c\xa6\x3d\ \x76\xe3\x9c\x5e\x09\x4c\x09\x48\xc9\xb6\x2e\x93\x44\xf2\xbb\x04\ \x7a\xd0\xab\x53\xad\x76\x14\x53\xcb\x1e\xc5\x72\x41\x64\xe8\x52\ \xb1\x36\x58\x59\xcf\x70\xff\x81\xc9\x72\x21\x43\xa5\xb9\x3c\x73\ \x1c\x25\xfb\xea\x2c\xdc\x8f\x83\x1b\x62\x2b\x98\xb8\xb9\x30\xa6\ \x7d\x1a\x71\x3a\xf4\x79\xb2\x77\xc4\xa3\x77\x44\xfe\xee\x65\x3f\ \xc9\xbe\x9d\x32\xd4\x1d\x68\x95\x83\x69\x87\x1f\x8d\x99\x25\xa0\ \xc5\xa4\x54\x9b\x56\xd4\xe2\xde\x9d\x02\xaf\x75\x3d\xf8\xd9\x5f\ \xe0\xbf\xfd\xd5\x2f\x62\xdd\x01\xb3\x7e\x87\x57\xbf\xf4\x2a\xff\ \xa2\xd5\xe1\x5f\x03\xfd\xa3\x1d\xbe\xfa\xee\x23\xee\x7f\xf5\x92\ \xad\xa6\xc1\xda\x9d\x09\xed\xab\x01\xbe\x96\x6f\xde\x1e\x59\x2c\ \x70\xcc\xa9\x07\x61\x7d\x19\x73\x74\xae\xb2\xd8\x64\xa5\x48\xf6\ \x20\x62\xd2\x98\x56\x8d\xc8\x6c\x39\x71\x25\x4e\xb1\x6a\xd4\x15\ \x00\xd6\x99\x58\xa6\x69\x56\x2c\x53\x81\x74\x1c\x2d\x60\x8f\x97\ \x15\x30\xa3\xee\x68\x86\x99\x93\x12\x62\xea\xae\x6b\x56\x0c\xf6\ \xb7\x9f\xf1\xdb\xff\xe3\xaf\x13\xed\x8b\x94\x9f\xef\x73\xbe\x28\ \xfc\xc4\x4b\x3f\xc4\x57\x8c\xaf\xb0\x56\x79\xc6\x8d\x92\x68\x9a\ \x71\xa3\xb4\x44\x94\x3d\x53\x8f\xcb\xab\x86\xda\xae\xd4\xd7\xb9\ \x51\xf0\x29\xd6\x33\xd3\xaa\xde\xde\xd4\x2b\x21\x80\x3b\x51\xc0\ \x95\xcc\x3b\xf7\x75\x9d\x91\xe3\x9e\x06\xfa\xf3\x93\x8a\x85\x11\ \xf4\x71\x9d\x89\x02\xf0\xa4\x62\xcd\x24\xff\xe8\xee\xbc\xaa\x9f\ \xf4\xa7\xe9\x9f\x59\x33\xab\x6a\x92\x92\x5c\x34\xb5\x7a\x8d\xb5\ \xf5\x0c\x37\x9a\x4b\x2c\x17\x96\xe7\x5e\xa1\x56\x2a\x45\xce\xfa\ \x83\x84\x06\x6e\x2e\x8c\x13\x8c\xdc\xbf\x12\xe9\x8b\xad\xab\x1c\ \xee\x59\xc0\x77\xde\x5f\xe0\xd1\x3b\xdb\x71\x9b\x80\x42\x42\x32\ \xc8\xfb\x66\x39\x43\x5d\xfb\xba\x66\x39\x33\x33\x68\x32\x74\x92\ \x97\xfa\x66\xf5\x2e\xbf\x75\x74\xc5\x6f\xff\x57\xff\x0d\x61\x4b\ \xb0\x71\xd7\xb0\xf8\x3b\x9f\x79\x99\x97\xee\x8b\x31\xc6\xf5\x66\ \x85\x3f\x7c\xf8\x1e\x7f\xf1\xb5\xd7\x71\xba\x17\x94\x1a\x79\xfc\ \x14\x13\x5f\xd5\x0a\x2c\xc7\x00\xbe\xe2\x06\xd1\xf8\x52\xe5\x13\ \x03\xf8\xd5\x56\x82\x8d\x75\xb7\xa9\x39\x88\x8d\xda\x28\x8e\x53\ \x4b\x1d\x3c\x70\xd1\x7c\xc1\x02\x8c\x6e\x64\x53\xb0\x44\x8e\xb0\ \xf4\xf9\xca\xa4\x1f\xa3\x26\x80\xef\xe5\xce\x95\xac\x90\x6c\xac\ \x12\x88\x62\x1d\x7c\x75\x34\xe4\x6b\xbf\xfe\x4d\x9e\xb4\x9f\xd2\ \x69\xf5\x59\xbe\xda\xa0\xdf\x12\x40\x2e\xec\x3e\xa0\xb2\xb0\xca\ \xcd\xdc\x27\xe8\x55\x2e\x15\x70\xe5\xa5\xf2\x46\x69\x89\x6a\x7f\ \x91\xcd\xcd\x90\x6a\x7f\x91\x8d\x8c\x4b\x79\xd5\x60\xd0\xd1\xb4\ \x9c\x04\xa2\xce\xaa\x12\x60\xf1\x6b\x0a\xcc\xf1\xeb\x6a\xab\x57\ \x1d\x6b\x60\xd4\x2b\x98\x75\xb0\xa6\x73\x79\x75\x4d\x2b\x2b\x35\ \xa6\xd5\xce\xb3\x61\xd6\x7a\xd7\x4c\x04\x31\x5e\x5d\x6f\x72\xff\ \x81\xc9\xe6\xed\x0c\x95\x26\xb3\x5e\x08\xe0\xa4\x7f\x73\x46\x07\ \xb7\xae\x72\x54\x16\x56\xc9\x72\xa0\x18\xd9\x39\x8d\x78\xb2\x3f\ \xe0\x57\xbf\xf5\x4d\xde\xfd\xe6\xeb\xb4\xba\xde\x73\xe5\x42\x2b\ \x6e\x14\x6e\x96\xc5\xfd\xd0\x09\xa8\x94\x6d\xd5\xbf\xc2\x65\x9c\ \x78\x7f\x2b\x2c\x80\x71\x4c\x60\x36\x79\xeb\xfd\x6d\xfe\xf2\xb7\ \xbe\x4a\x14\xec\x51\x8b\x7c\x8c\xad\x65\xfe\xd9\x7f\xf8\x25\x2a\ \xeb\x5b\xb8\xd6\x3a\x4f\xf6\x86\xfc\xd5\x1f\xfc\x11\x1f\xbe\xf1\ \x94\xc6\x64\x4c\x33\x35\x0b\x7a\xa1\x3b\xe4\xbc\x73\x4e\x98\x9f\ \x2e\x5c\x79\x95\x15\x12\xae\x89\x5b\x1c\x27\x6a\xf8\xe4\x79\x30\ \x8b\x5a\x41\x81\x97\x3b\x57\x60\x96\xcf\xeb\x00\x34\x8b\xc9\xac\ \xb4\xa1\x9f\x4c\xdb\xf4\xac\x7c\x82\x9d\x6d\x7f\x84\xdf\x8f\x30\ \x33\xe2\xc3\x2a\x95\x22\x97\xdd\x5d\x7e\xed\xd7\xbe\xce\xc3\xf7\ \xcf\xa9\x5b\x55\x32\xd5\x0e\xc5\x46\x41\x9d\x24\xa5\x83\x62\xa3\ \x04\xa0\x57\xb9\xa4\xda\x5f\x54\x4e\xfb\xfc\x7a\x5d\x39\xed\xcf\ \xe3\x01\x8e\x85\xb5\x9b\xac\xad\x2d\x25\x81\xa2\x81\x59\x3d\xdf\ \x33\x66\x8c\x3f\xfd\x39\xf9\xfc\xa4\x62\x25\xc0\x6b\x0d\x6c\xb2\ \x7d\x9f\x6e\xd8\x4b\xfc\x0d\xf9\x19\x72\x2b\xf7\x97\x8f\x9b\x66\ \xa4\x72\x28\xa4\xa1\x29\x35\xb3\x6e\xc0\xdd\xbb\x53\x60\x65\xa3\ \xa1\xf4\xef\x3c\xe9\x20\xc1\xbb\x56\x79\x36\xa3\x8d\x9b\x0b\x63\ \x9c\xd3\x48\x19\x74\x4f\xf6\x76\xf8\xea\x5f\x3c\xe1\xb5\xd7\xc6\ \x9c\x1d\xb6\x55\xa2\x50\xdf\xf1\x12\xcc\x2b\xb5\x70\xe8\x04\x4a\ \xf7\xca\xfb\x2e\x63\xda\x61\x87\x12\x39\xd1\x71\x33\x1a\x2a\x40\ \xeb\x40\xae\x37\x2b\xfc\xc6\x71\xc4\xff\xf1\xab\xbf\x40\xe7\xbd\ \xdf\xc4\x98\x74\x31\x87\x23\x3e\xfd\xc2\xdd\x04\x1b\xbf\xe6\x85\ \xfc\xe1\xd7\xdf\xe4\x6c\xf8\x94\x61\xd6\xa3\xf7\xec\x50\x8d\x1b\ \x96\x7a\xd8\x1c\x9d\xb3\xc0\x31\x46\x6e\x91\x1b\x05\x5f\x94\x27\ \xf5\x23\x8c\xa0\xa5\x6a\xfb\x66\xfc\xec\xad\x62\x97\xa8\x3b\xc2\ \x5e\x88\xb0\xc7\xcb\x53\x46\xd5\xf2\x89\x65\xef\x89\x84\x11\x61\ \x99\x4a\x72\xd8\xfe\x28\x21\x19\x6c\x7f\x84\x77\x65\x24\xbc\x19\ \x56\xa5\x42\xbf\x3f\xe0\x77\x7f\xe3\x21\x6f\xfc\xd9\x1f\xa9\x95\ \x5d\xab\x0b\x4b\xd5\x30\xb7\x38\xe9\x8b\x6c\x2b\xe7\x34\xa2\x57\ \xb9\x64\x74\xbe\xa2\x00\x7c\xec\x5e\xe0\x9c\x46\x1c\xbb\x17\xec\ \x7e\xb8\x4d\xaf\x72\xc9\xee\xae\xc9\x72\x5b\x9c\xa0\xcf\x7d\xfc\ \x0e\x9b\xf7\xee\xd2\xac\x37\xa6\xa0\x95\xe0\x8c\x8d\xb5\x19\x03\ \x4e\xb2\x63\x7c\x5f\x02\x50\xa6\x48\xa6\x8b\x3b\xa5\x51\x27\xb3\ \xd4\xe6\x97\xdf\xd8\x09\xe3\xad\x15\x1a\x34\x7b\x41\x82\xdd\xa5\ \x61\x28\xd9\x77\xb3\x29\x3c\x10\x42\x03\x2f\xcf\x30\xf0\x59\x7f\ \x90\x00\xaf\x8c\xc8\x25\x0c\xa3\xd3\x0d\xa2\xec\x19\xce\x69\xc4\ \x1b\xdf\x9d\xf0\xee\x5b\x67\xfc\xc9\xdb\x8f\x79\xb2\xbf\x23\x7a\ \xbb\x55\x44\xd7\x22\xa1\x69\x05\x98\x25\x20\xa5\x84\x90\x4c\x2c\ \x25\x84\x18\x8c\x5e\x51\xdd\x8f\x64\x27\x23\xd9\x3a\x4b\x02\xd9\ \x2c\x67\xa8\x37\x2b\xfc\xc9\x3b\x7d\x3e\xf8\x9d\xa7\x30\x38\xa5\ \x6a\x3a\x98\x75\x93\xff\xe0\x27\xff\x96\x62\xe3\x56\xdb\xa0\xbe\ \xd7\xe1\xc3\x37\x9e\xd2\xe9\x74\xa8\xce\x57\x4b\x4a\x4e\x1c\x0f\ \x2d\x3a\x43\xf1\xe5\xda\xe6\xfc\x9e\x76\xa5\x30\x87\xd9\x1c\xd4\ \x12\xac\x0a\xd0\x2a\x26\xa7\xf8\xb8\x91\xad\x80\xac\x8a\x49\x87\ \x1e\x52\x8a\x78\x56\x1e\x23\x6e\x3d\x65\xfb\x23\xa2\x41\x97\x62\ \x49\x48\x12\x2f\x77\x2e\x02\x24\x83\x90\xc7\x5f\xdf\xe3\xaf\xbe\ \xf6\x8c\x52\x39\x4b\xa5\x70\x42\xa5\x2c\x9a\xf7\xad\x54\x27\xdc\ \x5b\x8d\x30\xb5\x6a\x62\x09\x58\xb9\x55\x49\x2b\x71\x2f\x33\xe7\ \x34\x22\xca\x9e\xa9\x7d\x72\xfe\x19\x9b\xb7\x37\x58\x5b\x5b\xc2\ \x35\xc7\xb8\xce\x44\x48\x84\x58\xf3\xea\xf7\x13\x97\x7e\x4d\x3f\ \x5b\x03\x5b\x31\xb0\xd2\xb4\x31\x20\x25\x98\xf5\x8c\xb3\x52\x59\ \x44\xda\xe4\x7f\xdd\xeb\x20\xdf\x57\x33\xab\xb4\xaa\x99\xc4\xdf\ \x95\x8d\x4f\x64\x16\x5a\xb6\x5a\xa0\xbc\xa1\x95\x86\xb5\x66\x59\ \x58\x6a\xe0\xb3\xfe\x60\xc6\x2b\x21\x2f\xbd\x4f\xf6\x07\x7c\xf5\ \x2f\x9e\xf0\xe8\x9d\x6d\xfe\xf4\xaf\x5a\xd4\xad\x2a\xcd\x5b\xf5\ \x18\xb4\x05\x35\xfd\xb4\xef\x78\x54\xca\xb6\x92\x0a\x92\x91\x75\ \x3d\x1c\x3a\x81\x6a\xdf\x25\x81\xad\xb7\xd2\x2a\x91\xa3\xa3\x8d\ \xa8\x5b\xac\x2c\x11\x98\x4d\xfe\xed\x6f\xbe\x46\x6b\xe7\xf7\x94\ \xb7\xe2\x53\x5b\x9b\x8a\x8d\xb3\xcb\x0f\x78\xcd\x0b\xd9\x3e\xde\ \x65\x10\x57\xac\x67\xed\x1b\xca\xc5\x96\xbe\xe9\x57\xe5\x46\xd8\ \x15\x72\xa2\x1f\x89\x0c\x39\xcd\xc6\x30\x13\xec\x19\xb3\xaf\x3d\ \x5e\x4e\x30\x6b\x18\xb8\xaa\x82\x59\x37\xde\x24\x50\x75\x46\xf6\ \xac\x3c\x5e\x54\x13\x9a\x7a\xa9\x4b\x25\x7f\x17\xdf\xb6\x79\xeb\ \xdd\x0f\xf9\xed\xaf\xfe\x2a\xf8\x3b\x82\x2d\xe5\x17\x6d\x2e\x61\ \x98\x5b\x1c\x0f\x2d\x56\x0b\x9b\x73\xf5\x90\xfa\xc2\x67\x01\xdf\ \xce\x95\x67\x72\x04\xa2\xec\x19\x3b\x3b\xaf\xf3\xe2\xca\x33\x3e\ \xf3\xc9\x2f\x2a\x00\xea\x5a\x77\x86\x7d\xe3\x4b\x7e\xa7\x16\x26\ \x58\x52\xa5\x48\xc6\xc0\xd6\xfd\xb8\xe9\x5c\x07\x99\x4b\x9c\x76\ \xb1\xe9\xef\x93\x0b\x60\x5e\x32\x7b\xf3\x56\xc4\xad\x1b\x36\x9f\ \x5b\xa8\xb3\x5c\x58\x9e\x61\xe1\x46\x3b\xab\xc0\xbb\x5a\xd8\xe4\ \xac\x3f\x48\x1c\x23\x63\xb2\xc2\x49\xff\x26\x67\xfd\x01\x3b\x7b\ \x7b\xec\x6c\x9f\xf1\xed\xf7\x4e\xb9\xec\x65\xb5\x63\xdc\x8e\xbd\ \x0a\xb6\xca\xfd\x10\x3d\xe5\x82\x84\x34\x90\x60\x95\xc0\x34\xcb\ \x19\xfc\xe2\x28\xf6\x04\xe5\x14\x78\xf5\x4e\xa1\x4d\x6d\xd0\x47\ \x2b\x6a\x29\xc9\xf0\x07\xff\xf7\x5b\x0c\xdd\x0f\x31\x26\x5d\x72\ \x8d\xbc\xd2\xc6\x20\xfa\x2e\x77\xbf\x66\x72\xfe\x6c\xba\x10\xcf\ \x3b\x42\x42\xcc\xbb\x45\x91\xd0\xc2\x41\xc7\x10\x72\xa2\x62\x50\ \xca\x4c\x12\xc6\x9d\x39\x70\x85\x31\x37\x70\x3f\xba\x34\x4e\xd6\ \xd2\xcd\xfc\xa1\x41\x97\x81\x2b\x00\x5d\xe8\x9d\x2b\x03\x51\xea\ \xe3\xc9\xd1\x90\xdf\xfd\xc5\xd7\x68\x1d\x74\xd4\xc1\x14\xa5\x34\ \xb0\x79\x3b\x43\xb9\xbe\xc3\x8d\x82\xaf\x80\x7b\x3c\xb4\x58\x68\ \xef\xf1\xe4\xd4\xe0\x78\x68\xe1\x9e\x05\x9c\x0e\x77\xe9\xd6\xf2\ \x98\x6c\xe3\x9e\x05\xea\x79\x79\x32\x8d\xc9\x0a\xce\x69\xc4\xc7\ \x36\x2c\x9a\xf5\x06\x43\xdf\xa5\x63\x44\x09\x46\xcd\xd0\x55\x79\ \x14\x12\xa4\xd9\xbe\xaf\x3c\x04\x7e\xd1\x23\xdb\xf7\x67\x8c\x3c\ \xdd\xa7\x2b\x1f\xcb\x82\xd0\x34\x0b\x57\xcb\x83\x19\xd7\x9e\x5c\ \x00\x19\xba\x6a\x18\x8d\xac\x44\x2e\x6f\x18\xb4\x96\x7b\x09\x16\ \x96\xff\xdb\x8d\xe9\xc2\x3a\x1d\x8a\xa0\x46\x94\x3d\x53\xc0\x3e\ \x1e\x5a\x98\x6c\xc7\x81\x8b\x6d\xde\xfe\xc0\x4f\x30\xa9\x04\x6d\ \xa7\x2c\x1e\xf7\x1d\x8f\x86\x59\xc7\x65\xac\x58\x57\x9e\x0f\x09\ \x54\xf9\x7c\xdf\xf1\x54\x42\x95\x64\x61\xd9\x9d\x53\x7d\xd7\x94\ \x3e\x5e\xac\x2c\xd1\x6a\x1b\xbc\xfe\xce\xdb\x0c\x9f\xbe\x4f\x68\ \xb6\xa9\x45\x7e\x42\x1b\x77\x5a\x7d\xde\x31\x77\x78\xed\x8f\xff\ \x94\xe1\xc9\xb3\xb9\x78\x6a\xe4\x7d\x4e\x9c\x78\x40\xa4\x21\xb4\ \x70\xaf\x59\xc5\x08\x5a\x49\x16\x0e\x46\xc2\x3b\x21\x19\xb4\x58\ \x42\x79\x17\xd2\x99\x6b\xba\xac\xb0\x2a\x15\xac\x8a\x81\x67\x09\ \xe0\x17\x4b\x60\x23\x7a\x32\xd8\x46\x57\xf4\x31\x5e\xea\xaa\x40\ \x47\x7f\xf4\x94\x5f\xfb\xb5\xaf\x33\x39\x7f\x44\x76\xf9\xc1\x74\ \x15\x9b\x43\xc5\xc2\x21\xa2\xd3\xbb\x04\xa8\xdb\xda\xe6\x20\x9a\ \x10\x85\x3b\xd4\xba\x23\xba\xb5\x7c\x82\x81\xba\xb5\xbc\x7a\x5e\ \xf7\x27\xde\x28\x2d\x51\x7e\x39\xc3\xad\xad\x57\xf0\x82\x20\x61\ \x60\x89\xcc\xb5\x38\x49\x29\xe8\xab\xdc\x5f\xf9\x58\x82\x52\x37\ \xd8\x66\x18\x3a\x7e\x6c\x0d\x6c\x8c\xa0\x9f\xe8\xe2\x23\x75\xae\ \xac\xbc\xd0\x17\x81\xde\xea\x35\x43\x97\x5a\x46\x00\xf8\xfe\x03\ \x53\x05\x75\x94\xad\xd1\x64\x46\x13\x57\xba\xb7\x66\xdc\x6a\x67\ \xfd\x01\x6e\x6b\x9b\xf7\xde\x09\x78\xe3\xdb\xef\xf1\x64\x6f\xa8\ \x64\x41\xb7\xd8\x57\x8c\x1a\x99\x15\xb2\xce\x58\xe9\x5a\x09\x38\ \xc9\xbc\xb2\x62\x5b\xea\x5c\xf9\xbc\xde\xff\x58\xb2\xb0\x5e\x4d\ \xa2\x7f\x9e\x32\x10\xa3\xa7\x64\xaa\x1d\xbe\x75\x60\xf1\xc1\xef\ \x3c\xc5\x74\x46\xc2\xc8\xd3\xb4\x71\x76\xf9\x01\x97\x3d\xb1\xe8\ \x5e\xff\xf6\x37\x94\x61\x97\x0e\x7c\xac\x95\x0d\xdc\xb3\x80\xa8\ \xd2\xc4\x08\x5a\xd0\x8d\x65\x5e\x26\x36\xa4\x8b\x39\x4a\x99\xbc\ \xf0\x4e\xd8\x46\x97\x68\xd0\x55\x6e\xb5\xc2\x45\x2d\x61\xbc\xc9\ \x66\x28\x6e\x24\xaa\x9a\xc3\x41\xa8\x5e\x93\x72\xa2\x15\xf9\x71\ \xe2\xce\x94\x81\xbd\xdc\x39\xfd\xd1\x19\x5f\xff\x8d\x90\x87\xef\ \x9f\x93\x5d\x7e\x40\xa5\x70\xa2\x19\x3c\xe2\xa0\xe4\xce\x2f\x71\ \x5b\xdb\x6c\x1f\xef\xd2\x6f\x4d\x07\xf0\x19\xe6\xd6\xf4\x72\x11\ \x6b\xe5\x5a\x77\x44\xc8\xfd\x84\x76\x06\xd1\x9f\xe0\x46\x69\x89\ \x5e\xe5\x92\xd5\xae\xc9\x46\xa3\x45\x79\xb1\xa9\xdc\x57\xd2\xa3\ \x20\x7d\xbb\x72\x4b\xaa\xf8\x72\x52\xb1\xa6\x9a\x38\x96\x14\x92\ \x45\xab\xbe\x93\x78\x8f\x94\x11\x12\xf8\xf5\xc8\x98\x61\xef\xf4\ \x63\x05\xe0\x8d\x86\x1a\xdf\x25\x01\x2c\x41\x2b\x59\xb8\xd1\x9e\ \x32\x4e\x71\xfd\x32\xa1\x89\x85\xf7\x21\xab\xe4\x03\x7d\x61\xfd\ \xcb\xa0\x85\x6c\xb6\xdd\x29\x43\xd6\x19\x33\x29\xe7\x14\xf0\x74\ \x90\x96\xc8\x29\xb6\x95\x3a\x57\xbe\x26\x41\x9a\xbe\xf5\x8d\x02\ \x7e\x71\xa4\x5e\x4b\xba\xec\xaa\x6c\x36\x57\xe9\x5e\xb5\x79\x6b\ \xcf\x65\xec\xff\x99\xd2\xc6\x77\x63\x6d\x3c\x39\x7f\x84\x6b\xad\ \x27\x5b\x2a\xd8\x70\x9a\xba\xc8\x1b\xb9\x45\x4a\x2b\x19\x8c\x7e\ \x8b\x28\xd3\x24\xac\x76\x84\x9b\x2d\x66\xe2\xd2\x60\x3c\xf5\x13\ \x7b\x51\x2d\xa1\x71\x8b\x25\x91\x18\x5f\xb1\x4c\xdc\xc8\x06\xca\ \x98\x99\x92\xea\x02\x34\xf5\xaf\x65\x12\x39\x16\xc5\x12\x4a\x3e\ \xb4\x27\x36\x95\xfc\x0a\xdd\x77\x07\x22\x86\xee\xef\x30\x29\x1c\ \x29\x57\x4e\x8b\x80\xa6\x39\xe4\xd4\x83\x0f\xdc\x36\x67\xbd\x2c\ \x67\x3d\xf1\xe5\xa2\x70\x87\xb3\x5e\x56\x0c\xe3\xcb\xdc\x4a\xb0\ \x70\xb7\x96\xe7\x46\xc1\x27\xe4\x7e\xc2\x11\x0e\x28\xe3\xef\xd0\ \x35\x58\xad\x6f\x24\x7c\xc0\xf3\xd8\x75\x5e\x70\xc2\x08\xfa\x09\ \xc3\xad\xea\x3b\x8a\x59\x7b\x56\x99\x52\x39\xab\xc0\xac\x03\x35\ \xad\x87\x75\x2f\x87\xee\xda\xab\x65\x6a\x34\x6b\x36\x6b\x65\x43\ \xb9\xd2\xce\x87\xe7\x09\x63\x4e\xb2\xf0\x41\x34\x49\xb0\xae\x2e\ \x37\x9e\xec\x65\x79\xf2\xf4\x30\x21\x1f\x24\x40\xa5\x1c\x70\x19\ \x2b\x00\xeb\x06\x9b\x04\xb4\xce\xc6\xe9\xed\xdc\x3a\x40\x5f\x74\ \xd6\x9c\xf8\x43\xd5\x99\x3e\xbd\x7f\xa7\x4c\x9c\x8b\x01\x27\xef\ \xfc\x25\x7f\xf5\x97\x21\x70\x85\x31\xe9\x72\xb7\x9e\xe1\xcb\x3f\ \xf4\x22\xcd\x4f\xff\xdd\xf8\x12\x71\x83\xb3\xb8\x6d\x47\x1a\xc0\ \x13\xef\x38\xf1\x9c\x11\xb4\x30\x0d\x69\x0b\x39\xb8\x41\x16\xb7\ \x38\x0d\x6c\x99\x00\x5e\x54\x53\x8d\xb5\x3d\x2b\x8f\x9b\xcf\x29\ \xc0\xda\x9e\x8b\x59\x14\x4d\x54\xb2\x14\x09\x03\x57\x05\x33\xa4\ \x9c\x90\x1e\x0a\x29\x45\x1a\x59\x8f\xd3\xc3\x36\x7f\xfe\x8d\xc7\ \xe0\xef\x80\x15\x5b\xa7\xce\x98\x6e\xb1\x2f\x1c\xeb\x61\x81\x95\ \xcc\x34\x59\x7b\x83\x67\x9c\xf5\xb2\xe4\x2f\xab\xac\xc4\x3d\x74\ \x4b\x2b\x99\x84\x85\x7a\xa3\x20\x1a\xde\x01\x8c\x4e\x8e\x66\x13\ \xaa\x4f\x23\x96\xdb\xed\xc4\x68\xd5\xeb\x8a\x2f\x55\xb2\x79\xec\ \x41\x90\x2d\xa3\x74\xab\x37\x30\x9b\x33\xb9\x0f\x41\xbd\x81\x5f\ \xf4\x12\x0b\x62\x52\xb1\x12\xbe\x66\xe9\x86\xd3\x17\x49\xa6\xda\ \x49\x64\xa3\xe9\xf9\x21\x69\x26\xd6\x1f\xa7\x75\xf2\xee\x7e\xc0\ \xa3\x77\xb6\x39\x39\x0a\x12\xec\x28\x99\x31\xcd\xb4\x52\x4a\x28\ \xd7\xa1\x33\x9e\xd9\x6f\xc6\x80\x8e\x35\x70\x1a\xa4\x12\xc8\x66\ \xd4\x4b\x68\x6f\xa9\xb9\xf5\xc5\xf2\x9a\x17\xf2\xc1\x6b\x5f\xe3\ \xea\xd1\xd5\x54\xeb\xbe\xf2\xb2\x62\xe3\xcb\xfe\x85\xaa\x9b\xd4\ \x6f\xa7\x9e\xf0\x58\xe8\xd8\x88\x32\xcd\x79\xe9\xf3\x74\x7a\x3e\ \x54\x23\x21\x27\x8a\xa5\x64\x32\x4f\x18\xb8\x62\xc8\x4c\x51\x54\ \x2d\xdb\x9e\x41\xce\xb8\x4a\xf8\x81\x7d\x1c\x8c\x5a\x1e\x8b\xa9\ \xb7\x40\x32\xf1\x65\xa7\xc3\x77\x7e\xe7\x1b\x3c\x7c\xef\x4d\x4a\ \xe4\x98\x14\x8e\x14\x2b\x58\x83\x7c\xac\xc3\xda\x53\xf1\x9e\x7b\ \xc6\x21\xc2\x47\x3c\x5a\x14\xc3\x03\x6f\x64\x6e\xcd\xb8\x90\xdc\ \xb3\x80\x4a\xf7\x16\x83\x4e\x40\xbb\x31\xa1\xd6\x1d\x71\x3a\xdc\ \x4d\x78\x32\x0e\x83\x52\xa2\x9b\x4c\x3a\xa0\x21\xc1\xaa\x4b\x0a\ \xf9\x5a\xda\x7d\xe6\x9a\x63\xaa\xe5\x41\xc2\x78\xd3\xc1\x2e\x19\ \xb7\x1e\x89\xd2\xf1\x6e\xd8\x4b\x84\x91\x75\xc6\xae\xd5\x6b\x6c\ \xd5\xfa\x8a\x81\xd3\x01\x0d\xdd\xad\x26\xef\x4b\xe0\x02\x9c\xf5\ \xb2\xec\xee\x07\xca\xfb\xa0\x03\x71\xe2\xcf\x02\x2e\x0d\x52\xe9\ \x69\x90\x7e\x62\x5d\x36\xcc\xc4\x00\xa2\xa4\x01\xa7\x37\xf4\x96\ \xc6\x9d\x94\x1b\x69\xf6\x07\xa8\x2c\xde\xa6\x7b\xd5\xe6\xf5\x77\ \xde\xc6\x3f\x79\x08\x03\x11\x02\xff\xfc\xed\x1a\xaf\xbe\xb8\x44\ \x76\xf9\x01\xae\xb5\x4e\x7f\xb8\xc6\xa4\x37\x64\x74\x3a\x5d\x90\ \x2b\x99\x4b\xa5\x93\xd3\x1e\x2a\x11\xb1\x2b\x53\x1a\x8c\x99\xb8\ \x19\xea\x55\x2b\xd6\xc4\x2c\x10\x0d\xba\x2a\x60\x21\xdd\x65\x22\ \xe1\xa7\xac\x65\x45\x15\x15\x3b\x5b\x94\x45\x07\x79\x3f\x1b\x97\ \x33\x25\xb3\xd6\x76\x8f\x1c\x5e\x7f\xa7\x05\xd6\x56\x22\x46\xdf\ \x8c\x5b\xde\x34\xcc\x88\x96\xd6\x01\xaa\x79\x3e\x8d\xc7\x4b\x29\ \x71\x1c\x1c\x70\x3c\xb4\x14\x48\x4d\xb6\x39\x89\x2c\x8e\x83\x03\ \xa2\x70\x87\x7e\x0b\x8e\x83\x03\x2a\xdd\x5b\xca\x7a\xd7\xeb\xb4\ \xb2\x7d\x3f\xd9\xc0\x4f\x73\xaf\xc9\xfc\x07\xbd\xe2\xb8\x14\xe6\ \xe6\x06\x30\xf4\x26\x28\x52\x2f\x4b\xc3\x50\x06\x36\xf4\x90\xb4\ \x0c\x43\xeb\x4c\xdd\xac\xc3\x67\x1a\x3e\x85\x17\x85\x4b\x50\x4a\ \x88\xe7\xdd\x74\x50\x9f\xf5\x84\x7c\xf8\xf6\x7b\xa7\x74\xfc\xa4\ \x01\xe6\x32\x4e\x34\x51\xd1\x8d\x2e\xb9\x9f\xae\x7d\xe7\x01\x3d\ \xdd\x02\x40\xba\xd2\x74\x96\x96\x7f\x23\x6b\x89\xd7\x24\x53\xeb\ \xfe\x62\xfd\x6f\x06\x66\x93\x6f\x1d\x58\xec\xbe\xf9\x94\x8b\xc3\ \x7d\x8c\x89\xb0\xbb\xbe\xf0\x7d\x2f\x2b\x77\x5b\xc9\x3f\x52\xa1\ \xeb\xd0\xbb\x20\xf4\x2e\x30\x72\x8b\xb3\xdf\x33\x0e\x37\x8b\x88\ \x9d\x43\x27\x0a\xc8\x96\xa6\xc0\x37\x3b\x97\x27\x4a\x1a\x78\x57\ \x46\x22\xf9\xc7\xf2\x2e\x54\x98\x59\x6f\x6f\x35\x4d\x49\x9b\xad\ \xd6\xbd\x68\x89\x1f\x5b\xbe\xd9\x67\x52\x38\xa2\xef\x78\xea\x12\ \xd6\x8e\xbd\x03\x7d\x47\x4c\xa3\x97\xfd\xcd\x74\x17\x93\x3c\x69\ \xf9\xcb\x2a\x6e\x6b\x9b\x7e\x4b\x18\x74\xfd\x96\xd0\xcb\x72\xa2\ \xbc\xdc\x9e\x44\x02\xe0\x12\xcc\x1b\x19\x97\xa8\x78\x53\x01\x4e\ \xca\x87\xeb\x72\x22\x54\x10\xc4\x1c\xcf\x78\x27\xd2\x59\x68\x3a\ \x78\x3b\x46\xa4\xb2\xd7\xa6\x33\x9c\x67\x33\xe7\x36\x6a\x59\x56\ \xea\x0d\xfc\xd2\xb2\x92\x0f\xd7\x25\xf6\x28\xbf\x69\x0c\xf2\xf3\ \xe1\xb9\x02\xf0\xd9\x61\x5b\x8c\x5b\xb0\x92\xb3\x42\xd2\x63\x0f\ \xd2\x0c\xab\xdf\xaf\x94\x87\x6a\xd6\xc8\x3c\xcd\xab\xfa\x18\xc7\ \x21\x6a\x1d\xe4\xb2\x45\x01\x88\x76\x01\x62\xc2\xd3\x73\x16\x45\ \x4c\x1a\x27\x1f\x3e\xc3\xcd\xf7\x08\xcd\x36\x95\x7c\x86\xc6\x0b\ \x5b\xca\xdd\xe6\xb4\xe4\x57\x92\x00\x00\x20\x00\x49\x44\x41\x54\ \x5a\xeb\xca\x28\x3c\xeb\x88\xf6\x62\x69\x7d\x3c\xe2\x4c\x85\x9b\ \xaf\x8a\x13\x26\x6e\x66\x0a\xe0\x58\xd6\x9a\xe1\xc2\x92\x72\x8f\ \xd9\x86\x08\x41\xcb\x00\x86\xcc\xfd\x95\x00\x96\x92\x43\xb2\x6f\ \x1a\xd8\x51\x77\x44\xe0\x4e\x3d\x10\xd9\xe1\xba\xba\x94\x4d\xfc\ \x61\x82\x0d\x4c\x6b\x05\xfa\x10\x8d\x2f\x71\xcf\x16\x18\xb4\x87\ \x0c\xda\xe2\x00\x0e\xda\x43\x3e\x70\xdb\xf8\x07\x43\xce\x7a\x59\ \x8e\x83\x69\x0b\xcd\x83\x9c\xc7\x59\x2f\xcb\x68\xb1\xa7\x0c\xc1\ \x4a\xf7\x16\xfd\x9a\x60\xee\x5e\xe5\x92\xcd\xdb\x1b\x2c\x65\x92\ \xbd\x80\x75\x60\xea\x9a\x55\x07\x72\x9a\x89\xd3\x41\x8c\x74\xe2\ \x8f\x8c\xcc\xb9\xce\x44\x19\x80\xd5\xf2\x80\x6c\xdf\x27\x43\x97\ \x6a\x79\x30\x63\xc8\xcd\xbb\x55\x9a\x49\xe0\x4a\x83\xcf\x3d\x5b\ \x50\x00\x16\x33\x38\x0a\x33\xc0\x9b\x07\x64\x1d\x4c\xba\x97\xa1\ \xef\x14\x94\xbf\xf7\x3a\xa3\x4d\xee\xa3\x0f\xd6\x91\x7f\xb7\x1e\ \x19\xea\xb1\x7e\x25\xa8\x3b\xd3\xbf\x23\x3f\xbb\x6e\x55\xe9\x06\ \x5d\x1e\x05\x63\xf2\x7b\x87\xca\xc0\x03\x78\xf5\xc5\xa5\x44\xa4\ \x4f\xca\xa3\xe3\xb1\xa7\xb4\xf0\x89\x13\x71\xa3\xe0\x33\xf1\xb7\ \xb8\x8a\x9b\xa9\x64\x5c\x93\x6c\x29\xa0\x34\xc8\x31\x71\x33\x8a\ \xa1\x55\xc4\xce\x8b\x6a\x78\x51\x0d\xdb\xe8\xce\x00\x73\xc6\x8f\ \x37\xb1\x67\xb6\x97\x9d\x0e\x57\x91\xc7\xee\x91\xc3\xde\x5b\xef\ \x63\x5c\x39\x4c\x0a\x47\x31\x18\xf2\xea\x80\xe8\x07\xb0\x1b\x74\ \x39\x71\xa2\x38\xed\xee\x4a\x01\x58\xe9\xdb\x28\x8b\x91\x7b\xa6\ \xd8\xf9\xac\x97\xe5\xd6\xd8\xe6\xd6\xd8\x56\xde\x0c\xc3\xdc\xe2\ \x38\x38\xc0\xe9\x6c\xb1\xd0\xde\xe3\x9d\xb7\x77\x18\x9e\x3c\x53\ \x56\xb8\x0e\x44\x09\x60\xd1\x10\xdb\x4b\xe4\x44\x74\x6a\xa1\x8a\ \xac\xcd\xcb\x87\x48\x34\x3d\x29\x67\xc9\x74\xda\xca\x07\xac\xbf\ \xa7\x15\x1a\xca\x2d\x27\x73\x22\x9e\x07\xe0\xf3\xe1\x79\x42\x3a\ \xc8\xe7\x9c\xc3\x88\xe3\xd6\x05\x8f\xf7\xf6\x12\x43\x67\xf4\x63\ \x98\xb5\x0a\x33\xcc\x3c\x4f\xc7\xea\xa0\xee\x1b\x05\x05\x58\xf9\ \x3f\x6b\x15\x08\xfd\xb3\x29\x90\x8d\xe7\xb3\xfd\x75\x8b\xa6\xe3\ \xf7\x94\x7d\x61\x46\x3d\xe8\x84\x1c\xb7\xb6\xd9\xdb\x1f\x13\xb6\ \x62\x9f\xb8\x0d\xab\x8b\x0b\x4a\x52\xe8\x89\x48\x0b\xed\x4b\xce\ \x02\x21\x27\xa4\x0b\x72\xc8\x10\xc3\x89\x08\x4a\x71\x43\x1f\x37\ \xa3\xe4\xc4\xc4\xcd\x4c\x2b\x3b\x8e\xc2\x9c\x02\xaf\x04\xb2\x8c\ \xbe\x19\xb5\xfc\x0c\x90\x0b\xa5\x7d\xe5\x85\xf0\x72\xe7\x34\xb2\ \x02\x08\x12\xc0\x0f\xdf\x7b\x93\x16\xc2\x5a\xd5\x5d\x3a\xfa\x41\ \x50\x07\xa8\x37\xe4\xc4\x89\x70\x0e\x93\x55\x21\xd1\x58\xac\xc8\ \xf5\xb1\x00\xb0\xf4\x58\xe8\x65\x49\x80\x1a\x15\x15\x85\x3b\x7c\ \xcb\x13\x1e\x8e\xa7\x1f\xfe\x85\x00\x9f\xd6\x32\x55\xca\x00\x1d\ \xc0\x7a\x80\x43\x1a\x75\xe9\xe0\xc6\x3c\x9d\x2c\xbd\x14\x7a\x25\ \xb5\x9e\x23\x0c\x62\x08\xa3\x34\xe4\x74\xc6\xfd\x28\xf9\x20\x82\ \x37\x0b\x7c\xe7\xa8\xc5\xd9\x61\x5b\x31\xbc\xce\xc2\xcf\x03\xae\ \x0e\xcc\x79\x52\x43\x67\x57\xfd\x33\x03\x6a\xaa\x29\xb7\xfe\x19\ \xe9\x5b\xa2\x03\xe7\x75\xee\xb8\xd6\x48\xc9\x8d\xc3\x68\x89\x63\ \xf7\x82\xf6\xd9\xd4\x0b\x51\xbf\xbb\xce\xad\xaa\xa3\xc2\xd5\x7a\ \xec\x40\xf7\x56\x1c\x0f\x2d\x2a\xd6\x31\xa6\x51\x26\xe3\x9a\x04\ \xa5\x90\xba\x91\x21\x28\x85\xd3\x8c\xb6\x6a\x24\x40\xbc\x60\xd8\ \xd0\xac\xce\x0f\x29\xc7\x3d\x29\xa4\xfb\xac\x3d\xb1\x95\x17\x22\ \xea\x8e\x18\xba\xb7\xb9\xec\x08\x2b\xcd\x3f\xda\x65\xbf\xfb\x14\ \xac\x2d\x31\x32\xab\x3c\xbb\x72\x3b\x86\x68\x3b\x25\x0f\x5c\xab\ \x3b\x1d\x50\x28\x81\xab\xdf\x0e\xb9\xc9\x4a\x75\x32\x03\xe4\x85\ \x4e\x9f\xdd\x7d\x41\x51\xbb\xfb\x01\xbb\xfb\x01\xcd\xf3\x2a\xee\ \xd9\x11\x7f\xfe\xc1\x00\x3a\xbd\x19\x8d\xab\x1b\x67\x12\xd0\xcf\ \x73\xc3\xc9\xe8\x9c\x0e\x64\x09\x6c\xf9\x79\x3a\x80\xd3\xfe\xe0\ \xc2\x8b\x2b\x09\x0d\xac\x33\xee\xf9\xf0\x3c\x61\xe0\x45\xe3\x38\ \x83\xef\x30\x62\x7f\xef\x50\x69\xcf\xeb\xd8\xef\xa3\x9e\xbf\x8e\ \x34\xd2\x8b\x20\x0d\xe4\x34\x18\xaf\xfb\x7b\x92\xad\x13\x2e\x3a\ \x2d\x53\x50\x1a\x77\x67\x87\x6d\xe5\x0e\x0d\xcd\x27\x54\xf2\x19\ \x6e\xd7\x16\xa8\xac\x88\x41\x06\xd1\x82\x00\x49\x7f\xb8\xa6\x48\ \x4d\x77\xa9\x4e\xfc\x2d\xea\x46\x3c\xd0\x87\x88\x4e\x14\x90\x71\ \x4d\xc5\xc6\xae\x33\xc1\x1c\x2e\x75\xb9\x8a\x3c\x91\x37\xbc\x94\ \x64\x63\x19\x42\x8e\xba\x23\x15\xc9\x2b\x94\xf6\x13\x09\xf4\x6b\ \x76\x5b\xb1\xf0\xd1\x33\x0f\xe7\x59\x05\xfc\x1d\x2a\x65\x9b\xc6\ \x42\x8d\x97\xd6\x56\x55\x7a\xa4\xd4\x55\xed\x7e\x98\x90\x14\xad\ \xae\xa7\xdc\x6d\x3a\x90\xa3\xf1\x25\x46\xee\x19\xfe\xc1\x50\x49\ \x0a\x29\x39\x0e\xa3\xd8\x30\x3b\x9b\xfa\x8b\x0f\x46\xe2\xfb\x77\ \x3a\x7d\xae\x3a\x9d\xb9\x27\x54\x7a\x0f\xd2\x0c\xab\x3f\xd6\x19\ \x3a\x1d\x8e\xd6\x47\x7a\xc9\x5c\x0b\x23\xe8\x8b\xdf\x17\x37\x38\ \x59\xd9\x68\x70\xfb\xce\xc6\x47\x1a\x6e\xd3\xc4\xa6\x05\x8c\xdc\ \x33\x9e\xee\x2d\x70\xe2\x44\xec\xb6\x4e\x13\xde\x9b\xff\x3f\xc0\ \x9d\x07\xc4\xb4\x1c\x79\xee\xe7\xc5\xf3\xf0\x5c\x67\x22\x16\xaa\ \xe6\x07\xd7\x59\x5e\x77\xf3\x51\x8d\x12\x95\x31\xcd\x46\x44\xf7\ \xaa\xcd\x69\xf7\x19\xfe\xc9\x43\x25\x29\xac\x85\x29\x61\x3a\xcf\ \x84\xbb\x52\x46\x73\x2f\x7b\x59\x46\xa7\x41\xc2\x4b\xd1\x89\x02\ \x25\x25\x80\x84\xb4\x28\x95\xb3\x98\x7a\x98\x59\x32\xac\x04\xb0\ \xfe\x9c\x64\x63\xf9\x58\x26\xd0\xb7\x4d\x21\xba\xf7\xf7\xb6\x71\ \x76\x0f\x15\x80\xa3\x85\x32\xb7\x6f\x35\xd8\xbc\x77\x97\x5b\x5b\ \xaf\xd0\xa9\x85\x73\xfd\xb1\x41\xaf\x1e\x5b\xa7\xc2\x6f\x7c\xe2\ \x44\x09\x0b\xd5\x39\x8c\x38\x8c\xb2\x0c\xda\x43\xdc\xb3\x23\xdc\ \xb3\x23\xa2\xf1\xa5\xfa\x2f\xc1\x2e\xef\x97\x56\xd6\xe7\xea\x5a\ \xbf\xe8\x31\xa9\x58\x89\x82\xcf\x79\x60\xd6\xbf\x9f\x5f\xf4\x04\ \x40\xb5\x1c\x60\x1d\xc0\x51\xa6\x92\xa8\x93\xcb\x54\x3b\xa2\xbc\ \xa8\x6c\x50\x5a\xb9\x9a\x09\x64\xe8\x00\x96\xf2\x49\xdf\x9e\x9c\ \x3c\xe6\xd1\x9e\x90\x10\x59\xab\x90\x60\xf9\xef\xe5\xfe\x5f\x07\ \xe8\xcf\xf3\x6e\x48\x63\x57\x5e\x6d\x16\xa2\x5e\x02\x9c\xcf\xfb\ \x6c\x5d\x8e\xf5\x8d\x02\xd4\x4d\x06\x9d\x2a\xef\xb5\x8e\xe3\x64\ \xad\x2e\xb5\xb0\x97\x30\xee\xd2\x49\x4b\x18\xc7\x1c\xb7\xa6\xb2\ \x22\x8c\x92\x25\x5e\x19\xad\x35\x82\xeb\x4c\x84\x9c\x58\x37\xc7\ \x44\xdd\x91\x48\x8e\x37\xba\x1c\xc5\xa5\x3b\x92\x99\xa5\x2e\x96\ \x00\x1e\x2e\x75\x29\x5c\xd4\x54\x9e\x84\x7f\xd2\x21\x3a\x9b\xb0\ \xdf\x7f\x06\xd6\x16\x2b\x75\xb8\x91\x13\x27\xdb\x58\x0d\xb9\xf3\ \xb9\x8f\xb3\x94\x7f\x89\xa3\xc9\xe5\xcc\x6a\xcf\x54\x3b\x62\xfe\ \x71\x1f\xe5\x72\x5b\xc9\x08\x81\x2f\x45\xbe\x0e\x52\x79\x93\xcc\ \x9d\xde\xee\x1c\x0f\xa1\x5e\x55\x1d\xd9\x75\x90\xea\x7a\x38\x3d\ \x1c\x66\x1e\x2b\xeb\xaf\xe9\xc0\x4e\xcb\x11\xd7\x99\x90\x09\x5b\ \x6c\x36\x57\x79\x75\xbd\xa9\x74\xb0\x1e\x85\x3b\xeb\x65\x95\xc1\ \x26\x81\xbb\xeb\x0f\xd4\xef\xfb\xce\x51\x04\xfd\x24\xc8\xe4\x40\ \x46\x79\x05\xd1\xef\xcf\x2b\x8f\x9a\x07\xe8\x4e\x2d\x7c\x2e\xd8\ \xaf\x03\xa2\xaa\x02\x8f\x8d\xd5\xef\x65\x41\xe8\x59\x83\x7a\x6e\ \xf5\x71\x4b\xe4\xba\x48\x5d\x1c\x99\xd5\x19\xe3\x4e\x37\xf0\x2e\ \x7b\x59\x65\xd8\x95\xad\x64\x7a\xa5\x04\xb4\xdc\x2a\xc3\x4e\xca\ \x07\xc9\xc0\x0b\x86\x9d\xd0\xc4\x51\x77\x34\x95\x1a\xb9\x73\x05\ \x60\xc9\xc6\xbb\xfb\x87\x7c\x67\x47\xf4\x98\xbd\x6d\x8f\x30\xed\ \x25\xb2\xab\x05\xd6\xcb\x37\xb9\x73\xcb\xe2\xde\xc7\xee\xf3\x89\ \x1f\xbd\x49\x79\xb1\xa9\x26\xd1\xab\xd0\x6e\xac\xc3\xe4\x20\x6f\ \xc9\xc8\xd2\xf9\x2d\xd9\x19\xe0\x2c\x58\x54\xf7\xd3\x80\x9e\xf4\ \x86\x1c\x1c\x7b\x9c\x9c\x3c\xc6\x08\x45\x86\x59\x7a\x98\x8b\xee\ \x61\x90\x1e\x04\xbf\xe8\xcd\x14\x73\x4a\xd6\x95\xfb\xcb\x13\xa3\ \xfb\x8d\xf5\xc7\x55\xdf\xa1\xb6\xd0\x48\x78\x22\x96\x0b\xcb\xf4\ \x5b\x53\xe6\x35\x72\xcf\x70\x0e\x23\x1e\xfb\xcf\xd4\x6f\xf0\xb7\ \x0b\x9c\x38\x11\xdf\x39\x6a\xd1\x0e\x3b\x4a\x03\x77\x8c\x68\x2e\ \xe8\x74\x20\xab\x63\x28\x2f\xf7\xa9\xd7\x75\xf9\xa6\x6f\xbf\x57\ \x30\xa7\xf3\x4e\xbe\x17\xb6\xd7\x17\x94\x7c\x6d\xe8\xbb\xec\x74\ \x2b\x38\xa7\x11\x9d\xa1\x43\x68\xb6\x29\xd8\x49\xe3\x4e\xea\x61\ \x3d\xc3\x4e\x1e\xa3\xab\x8e\x99\x00\xad\x69\x94\x09\x23\x47\xe5\ \x52\xa8\xa4\x78\xf3\xea\x82\xa3\x30\xc7\xe8\x72\xac\xbc\x14\x57\ \x91\xa7\x74\xb0\x64\x5c\xc9\xc6\x92\x99\x0b\x17\x35\xae\x22\x8f\ \xa3\x67\x22\xa0\x51\x29\xdb\x64\x6b\x49\x7f\xd1\xde\x81\x4f\xe0\ \x9e\xb0\xbe\x6e\x26\x58\x2d\x1d\x7c\xe8\x39\x45\xba\x9d\xee\x8c\ \xb8\xd7\x81\x2a\x2d\x57\xf9\x03\x0f\x8e\x85\x51\x38\xe9\x0d\x69\ \x85\x9e\xf8\xdf\x81\x4e\xa7\xab\x66\x64\x5c\xc7\xb4\x3d\xa7\x48\ \xd5\x77\xc4\x90\x18\x6d\x30\xcc\xdc\xf0\x73\xaa\xbf\x84\xee\x72\ \xab\x96\x07\x50\x37\x55\x7d\x5c\x22\x68\xb3\x28\x02\x30\x6f\x39\ \x7b\x42\x2e\x38\x11\x85\x73\x41\xcf\x8f\xfd\x67\x6a\xd1\x02\x6a\ \xf6\x47\x1a\xb0\x3a\x30\x5d\x67\xa2\x80\x22\xbf\xe3\x44\x1b\xa1\ \x9b\xb8\x55\x93\x8f\xd3\x2c\x9e\xce\xed\xb8\x8e\x91\xd3\x36\x41\ \x22\xd3\xac\x6a\x24\x5d\x79\x73\x3e\x6b\x99\x88\x56\xd7\x53\xc6\ \x9d\xe9\x8c\xa8\xe4\x33\x34\xfd\x48\x19\x77\xa5\xb8\xff\xb4\x64\ \xe2\x79\x9e\x0f\x09\x5a\x09\x60\x5d\x62\x98\x57\x91\xc7\x45\xb3\ \xcc\xba\x29\xa6\x8a\x1e\x85\x39\xae\x22\x8f\x75\x73\xcc\x55\xe4\ \xa9\x5c\x08\xdb\x17\x6c\xdc\x9e\xd8\xca\xb0\x1b\x2e\x75\xf1\x2f\ \x2b\xec\x77\x9f\x72\x11\x78\x44\x0b\x65\xf2\x9b\x1b\x64\x57\x85\ \xe5\x6a\x0c\x9e\xc1\xce\x09\x4f\xf6\xde\xe5\xe8\x28\xa4\x5e\xab\ \xcd\xd5\x4f\x32\xdf\xb6\x15\x1a\x74\x3b\x5d\x76\x5b\xa7\x2a\xc3\ \x49\x02\xba\x5f\x38\x56\xf7\xd3\xc0\xdd\xef\x45\xf4\x9d\x42\xa2\ \xc9\x89\x1c\xee\x22\x07\x1e\x02\x34\x7b\x41\x82\x8d\x75\xf0\xce\ \xd3\xc9\x7a\x7e\xc5\xf3\xea\xea\x36\x9b\xab\x33\xa9\x95\xe7\xc3\ \x73\x31\xfc\x1c\x31\x10\xf2\xc4\x89\x38\xeb\xb4\x69\x85\x62\xe1\ \x15\xce\x9b\x9c\x75\xda\xb4\x43\x23\x61\xc4\xe9\x40\xd5\xb7\x7a\ \xf1\xaa\x7e\x5f\x26\xf5\x1b\x41\x3f\x31\x0b\x5a\xff\xde\xf2\x33\ \x25\x6b\xcf\x63\x58\xd7\x99\x90\xa1\x9b\xcc\xc0\x0b\x73\x2a\x45\ \x75\x1e\x80\x75\x03\x7d\x26\x33\xb0\x27\x00\x1e\xd4\x1b\xca\xb8\ \xeb\x5f\x5e\xe0\x8f\xe3\x29\x5c\x0b\x9a\xe1\xd6\xea\x27\x24\x45\ \xdf\x28\xa8\x73\xed\xc5\x73\xf5\xc2\xc8\x49\x00\x58\x07\xb2\x59\ \x5a\x1e\xb3\x58\xaf\x2b\x1d\xbc\x6e\x8e\x59\x30\x6c\x8e\xc2\x9c\ \x02\xf2\x82\x61\x73\xe8\x08\x66\x96\x3e\x62\x10\xb9\xc7\xd6\x62\ \x1f\xc3\x78\x85\x7a\x64\x28\x1d\xac\xdc\x63\xa1\xd0\xa8\x3b\xaf\ \xef\x32\xde\x13\xef\x93\x39\xbe\xe9\x03\x23\x67\xba\x49\x40\x77\ \x3b\x7b\x89\x93\x2e\x26\x16\x4d\x99\xab\x15\x7a\xf1\x7e\x5d\x11\ \x12\xed\xf4\x13\x4c\x20\x87\xbb\xe8\x33\x33\xa8\x9b\x33\x2e\xb3\ \xe7\x69\x61\xfd\xf3\xf4\xf2\x24\x7d\x9f\x5a\xa6\xa6\x1a\x5d\x8b\ \x61\xe7\xd3\xdb\xae\x3f\xc0\x39\x8c\xe8\x46\xef\x72\xd6\x69\xd3\ \x34\x6d\xf5\xdd\xe5\x55\xc3\xec\x25\xdd\x10\x93\x8a\x95\x60\x5e\ \x1d\x20\x69\x2d\xac\x57\x5e\xeb\xad\x04\xe6\x85\xd8\xd3\x9f\x21\ \x35\xaf\x9e\x52\xaa\xe7\x89\x7c\x94\xa4\x88\x7a\x11\x8d\x8a\x99\ \x04\x70\x2c\x61\x4a\x61\x4e\x15\xe7\x36\xe3\xd4\x99\x41\xa7\xca\ \xe8\xa8\xc3\x38\x3f\xf5\xcc\x2c\xdc\x11\x57\x93\xec\xf2\x03\x42\ \x27\x50\xff\x2b\x91\x20\xa8\xed\xe3\x5d\x6a\xb1\xc7\xc9\x34\xca\ \x0c\x26\xb9\x19\x4d\x0c\x60\x95\x82\x4d\x42\x5c\x16\xeb\xf5\x38\ \x42\xb2\x0c\xdd\x11\x8b\xf5\x3a\x5e\x77\xc4\x82\x21\x18\x37\xe3\ \xde\xc6\xc8\x7a\xb8\xe7\x39\xec\x7a\x9e\xcb\x4e\x87\x05\xc3\x66\ \xf7\xc8\x81\xcb\x37\x68\xd6\x1b\x64\x57\x0b\x6c\x98\x02\xbc\x93\ \xd3\x21\xc7\x63\x0f\xe3\x2a\x76\x6a\x13\x40\xa7\x07\x18\xb1\x6b\ \xca\x9e\xd1\xaa\x3d\x0b\xd5\xa3\xb7\xe6\xd4\x68\x11\x89\xd6\xfe\ \x15\x0f\xfa\xd0\x8a\xfb\xf1\xb7\xf0\xe8\x06\x5d\x4c\x6b\x85\xe0\ \x9a\xcb\x98\x35\xb0\xd5\x9c\x0c\xc5\xbc\xf1\x02\xb9\xee\xf2\x38\ \x0f\xd4\x7a\xe7\x1e\x2b\x6e\x7c\x22\x07\x2a\x6e\xd4\xb2\x09\x19\ \x71\x73\xf2\x03\x89\x80\xc5\xd2\x38\xe2\xe0\xd8\x63\x10\xda\x89\ \x85\xd7\x77\xa6\x2e\x2a\x11\xf1\x43\xb1\xa8\x94\x06\x7a\xc7\xa2\ \x49\xc5\x82\x48\xb8\xf7\x6a\xe5\xaa\x72\xf5\xa9\x2b\x45\x0c\x7c\ \xc9\x9a\x92\x9d\xb3\xf1\xa2\x70\xfb\xc9\xb4\xd1\x7a\x39\x0b\x44\ \x33\x75\x85\x35\x6a\x22\x73\x2f\xfe\x7d\x32\x37\xba\x6e\x56\x67\ \x02\x1e\x13\x7f\x48\xbb\x1f\xb2\x64\xd9\x94\xca\x4c\x7b\x7c\xf4\ \x72\x64\xc2\x16\x41\x3c\x6d\x55\x04\x3d\xda\x1c\xb7\xb6\x39\x76\ \x1f\x70\xef\xc0\xa0\xb8\x71\x48\x73\xe1\x06\x1b\x85\x35\x2a\xeb\ \x5b\xf4\x8f\x76\xa6\x0b\xc7\x5a\x07\x7f\x87\x70\x6f\x9a\xbe\x30\ \x98\x8c\x80\x1c\xe5\x5c\x0e\x34\xbf\xb4\x33\x8e\x87\x31\xca\x22\ \xd0\xc4\xa5\x22\x2e\xfb\x31\x6a\x79\x8c\x5a\x9e\x52\xb0\xa9\xa2\ \x72\xeb\x8b\x05\xa2\x18\xe4\x99\xa6\xd0\x77\x6b\x6b\x4b\xdc\xda\ \x7a\x85\xf5\xf2\x4d\x8e\x72\x2b\xd0\x15\xcf\x1b\x57\x0e\x2d\x02\ \x5a\x9d\x36\x74\x7a\xaa\x79\xc9\x3c\x36\x94\x9e\x04\x31\x35\xc8\ \x26\x13\xb6\xa0\x67\x08\x3f\x72\x47\x38\xfe\xf5\xff\x00\xe1\xe5\ \xc9\xb5\x9a\x4e\x4a\x88\x19\x63\x44\xbb\x02\xa4\x59\xa6\x66\x56\ \x67\xa2\x79\x7e\xd1\x13\xf9\x11\x5a\xe7\x9e\x9e\x55\xa6\xea\x3b\ \x34\x6b\xb6\x2a\x31\x4a\xdf\x8e\x5b\x17\x1c\x1c\x7b\x0a\xb8\xf2\ \xaa\xd1\xea\x24\x93\x69\xea\xf5\x4a\xe2\x72\x4f\xcf\x50\x60\xec\ \xd4\x42\xda\xa3\x5e\x3c\x61\xa9\xa0\xd8\x56\xce\x7b\x56\xa0\xbc\ \xc6\xf7\x7d\x9d\x9f\x3c\x1d\x95\xd4\x0d\x6d\xf9\xfb\x24\x53\xeb\ \x5d\x8a\xd2\x40\x96\xb9\x14\xfa\x42\x70\xcd\x31\x41\xbd\x41\xa6\ \xd3\xa6\xd9\x10\x41\x8f\x8b\x74\x2b\xbc\xe1\xec\x31\x53\x7a\xb8\ \x70\x42\x25\x1a\x52\x5b\x68\x88\x1c\x99\x23\x71\xa5\x2a\x66\xc7\ \x38\xe3\xb1\x60\xe0\xb8\x54\xa9\x98\x15\x6e\x40\xeb\xf4\xd1\x1e\ \xd6\x5a\xfd\xda\x1f\xbd\x51\xb6\x19\x65\x4a\x1a\x38\x0a\x88\x41\ \x19\x60\x37\x61\x73\xbd\x8c\x7f\xef\xae\x72\xa7\xdd\x3c\xb5\xd8\ \xf5\xf6\x39\x39\xb9\x50\xec\xab\x0e\x76\xcc\x2c\xe9\xc1\xdd\x69\ \xf0\x15\xac\x52\xac\x57\xc7\xe0\x14\x81\x79\x40\x2d\xe2\x57\x3d\ \xfc\x9e\xcb\x72\xdd\xe0\xbc\x13\x25\xe6\x24\xa7\x3f\x4f\x2d\xd0\ \xa0\x0f\xd8\x73\x0d\x11\x31\x89\x47\x78\x23\xdc\xfe\x34\x8b\xed\ \xaa\x62\x91\xc5\x9f\xeb\x8d\x90\x3a\x58\x67\xe0\xe3\xd6\x85\xd2\ \xec\xf4\xa7\x9e\x17\x7d\xe6\x5d\x5d\x16\x9c\xfa\x43\xc5\x92\xa3\ \xb6\xc3\xc6\x9d\x06\x5f\x7a\xe5\x25\x8a\xdf\x27\xaa\x59\x8e\x8e\ \x42\xf6\xb7\xf3\x1c\x7e\xe7\x37\xa7\xa9\x9d\x65\x31\x2a\xb7\x16\ \x7f\xcf\x6e\xd1\x83\x38\x47\xba\x1b\xf4\x00\x9b\x7a\xd7\xc4\x35\ \xe7\x87\xd3\x67\xec\x92\x8a\x35\x3b\x82\xa1\x1a\x7d\xcf\x5e\x09\ \xd7\x99\x88\x6c\x39\xf9\x19\x3d\x43\x68\xe1\xa0\x4b\x00\x2c\x55\ \x60\xa7\x5b\xe1\x4b\xf2\x9c\x30\x20\xdb\xee\xb2\xba\xb8\xc0\xad\ \xaa\xc3\x43\x92\xdd\x88\xfa\x86\xc8\xe5\x70\xcf\x8e\x38\x76\xd7\ \x69\x70\x87\xc1\x24\x37\x35\xf0\x6a\x3e\x61\xe4\x30\x98\xe4\xc4\ \x1c\x3b\x00\xff\xa4\x43\xef\x9c\xb9\xcd\x2c\x76\xe9\x70\x18\x5c\ \xb0\x21\x9b\x6e\x67\x37\xb0\x16\x3d\xe8\x78\x5c\x76\x3a\xec\x1e\ \x39\x18\xab\x21\xcd\xee\x6d\x5a\xec\xab\x6c\xa4\x76\x0c\x60\x79\ \x59\xcb\xf6\x7d\xa8\x66\xc1\x99\x3f\x81\x3e\x7d\x19\x97\xc3\x0a\ \xa5\x81\xa6\xef\x2b\x81\xe9\xf7\x42\xac\xaa\xc9\x79\x27\x54\xc3\ \x0c\xf5\xf7\xa5\x01\x3c\x2f\x99\x67\x9e\x7c\x90\xd3\xea\x6b\x66\ \x95\x6e\xb1\x47\xb6\x9f\x7c\x4f\x6d\xa1\x41\xf1\xbe\x37\x53\x62\ \x24\x3c\x10\x17\x42\xb7\xc7\xe0\xad\xc5\x6d\x4c\x45\xc6\x5b\x72\ \x68\xa3\x94\x00\x2a\x21\x7c\x73\x8d\x4f\xbd\x7c\x8b\xaf\xfc\xa3\ \xaf\x50\xfa\xc4\x0b\x5c\x99\xd0\xde\x1e\xf1\x27\xfc\x1e\x3b\x4f\ \x2d\xba\x81\x90\x13\xad\xd0\x88\x67\x47\xcb\xdc\x0d\x21\x21\xba\ \x7a\xc6\x5e\x0c\x28\x29\x2f\x66\x7e\x73\xdc\xc2\xb6\x1b\x4e\x7f\ \x9f\x3c\x76\x69\x43\x4d\x77\x9d\x49\x29\xa1\x8c\xc8\x9e\x41\xb5\ \x3a\xa0\xe7\xa4\xdc\x73\x64\x45\x20\x4b\xef\x6d\x17\x8f\xb9\x5d\ \x2a\x14\xe8\x67\x8d\x19\x26\x56\xa5\x6b\xe5\x21\xdd\x8e\xf0\x42\ \x1d\x0f\x2d\x36\x8d\x0e\x9d\x48\xe4\x87\x86\x91\x83\xd9\xab\x63\ \xd6\x62\x92\xab\x46\x58\x7f\xfe\xf0\x4d\x8c\xc2\x0a\x37\x2d\x8b\ \xab\x7d\xc1\xa6\xd1\xa9\x89\xb5\xbe\x49\xe0\x3f\xa5\xd9\xbd\xcd\ \xed\xca\x11\xa1\x1d\xb7\x0d\x9d\x1c\xb2\x7b\x64\xb1\x91\xf1\x39\ \x0c\x2c\x02\x5f\x18\x33\xad\xda\x3e\xd1\xa9\xc9\x33\x3f\x3e\x29\ \x12\xc0\x9a\x2b\xa8\x1b\xf4\xa0\x48\xa2\xc0\x52\x19\x53\xd2\x10\ \xd3\xb6\x0c\x50\xc3\x0b\x67\x46\xca\x0e\x52\xef\x21\xf6\xe1\x22\ \x64\x49\x61\x30\x7f\xe0\xb7\xc8\x62\x9b\x0f\xe0\x9a\x53\x4b\x9c\ \x7c\xb7\x2f\x98\x59\xf7\x0f\x37\x7b\x01\xcd\xda\x0d\x3e\xbe\xb9\ \x30\x13\x42\x96\xfe\x6a\x9d\x7d\xbb\x41\x37\x1e\x30\x8e\xda\xaa\ \x4b\x7b\xd7\x84\x6a\x96\x97\x1e\xbc\xc0\xe6\xbd\xbb\xdc\x5d\xce\ \x72\xeb\xde\x16\xc5\x9b\x2b\x74\xdb\x01\xa7\xef\x74\x78\xfd\x83\ \x3f\x63\xef\xf1\x07\x64\xfb\x3e\xf5\xfa\x72\x9c\xd2\x6a\x43\x6c\ \x68\x4a\x26\x15\xfa\xf5\xfa\xe8\xa3\xf4\x77\x2b\xad\x1d\x77\xfb\ \x94\xbf\x6f\x26\x27\x79\x4e\xee\x35\xc0\x45\xe0\xb1\x64\xd9\xd4\ \x25\x1b\x57\xa3\x69\x3b\x83\xf8\x73\xab\xe5\x81\xf0\xff\xc7\x00\ \x0e\xea\x0d\x76\x5b\xa7\x1c\x07\x07\x94\xdb\xfb\x30\xfc\x24\x64\ \xcb\x2c\xad\x5b\xc2\xcd\xf6\xfe\x1f\xd3\x1f\xae\x51\xe2\x48\x54\ \x89\x94\x1b\x10\xe7\x9b\xd7\x52\xc9\x67\x83\x49\x8e\x62\xb5\xc3\ \x60\x3c\x6d\x0c\x69\xad\x97\x6f\x2a\xe0\x3d\xf3\x7d\x38\x82\x68\ \x78\x02\x1f\x3c\x8b\x13\x70\x4e\xe0\x02\x8c\x82\xf8\xa1\x37\x63\ \x6b\x69\x37\x96\x0f\x00\xd1\xa9\xd0\x38\x47\xcf\x3c\x26\xde\x31\ \xce\xb3\x8a\xd0\x4c\xfe\x90\x4e\xcc\x04\xf5\xc8\x48\x8c\xbc\xd5\ \xe7\xb4\xc9\xc7\x12\xb0\x0a\x9c\x96\x60\xdd\x4c\xa6\x06\x74\xa7\ \xcc\x1a\x3b\x0a\x74\xd0\x4b\x26\x2e\x0c\x4a\x0c\x7b\x2e\x3e\x42\ \x52\xe8\x4c\x2c\x80\xd8\x67\xe8\x4f\xf7\x6f\xf6\x02\xa5\xc3\x25\ \x80\xf5\x74\x4d\x6b\x20\x18\xd9\x65\x42\xd3\x8c\xa8\xdd\x91\x79\ \x11\x57\x8a\x85\xa5\x0f\x58\x67\xe0\x80\x9a\xca\xb3\xf0\x7d\xf1\ \x7d\xe4\x1c\x3b\xc8\xaa\xb6\xb2\x9f\xb9\xb3\xcc\xdf\xfc\xa7\xf7\ \xb9\x63\xdd\xc7\x66\x81\xca\x4d\x8b\x63\xe0\xe8\x9b\xdf\xe5\xe7\ \xff\xb7\xd7\x79\xba\x2d\x86\xf3\x98\xc5\x08\x3a\x02\x28\xa5\x6a\ \x36\x31\x9c\xd1\xed\x4f\x70\x99\x02\x52\x1a\x7c\x89\x81\x90\x45\ \x0f\xd7\x91\xe0\x1c\xcf\x18\xae\x3a\x0b\xeb\x4c\x3d\x4f\x53\x5f\ \x04\x1e\x75\x8c\x44\x74\xcf\x35\xc7\x6a\xa8\x8e\x34\x56\xe9\x19\ \x64\x9b\x79\x2a\xd1\x90\xee\x55\x88\x7f\x30\xe4\x24\x28\xb2\x64\ \x3a\xc0\x22\x8d\xc1\xd4\xc5\x39\x29\x1c\x81\x13\xbb\xd8\x1c\x8f\ \x5a\xa6\x46\xb7\xd3\xe5\x38\x38\xe0\x13\xbc\x48\x31\x9b\x67\x30\ \x11\x3a\x58\x4a\x0b\x95\x9d\xa8\x03\x53\x6e\x29\xdf\x9c\x7b\x99\ \x7f\xe6\xfb\x18\x83\x67\xc2\x78\x03\x38\x12\xef\x79\xe6\xfb\xd4\ \x3b\x1e\xfb\xdd\xfd\xb8\x55\xeb\x98\x8b\xc0\x03\x63\x3a\x87\x58\ \x9d\xd0\x39\xab\x3e\x5d\x41\xa1\xef\x53\xb0\x4a\xd0\xf7\x09\xe2\ \xfb\xf3\xe4\x85\x3c\xf8\xe9\xc9\x9d\x72\x7f\xc9\xf4\x69\x5f\xb0\ \xf4\x88\xe8\x60\x96\xba\xd9\x2f\x6a\x03\x15\x7b\x39\xaa\xa1\x43\ \x2d\xd3\x88\x27\x77\x4e\x01\x7c\x30\xbc\xc9\xc8\x39\x54\x00\x6e\ \xb5\x0d\x5c\x53\xe8\x78\x0b\x9b\xf1\xf8\x04\x62\x83\x4c\xaf\xd3\ \x93\x03\xcc\xd7\xca\x06\x7b\x07\x3e\x66\xb8\xc3\xa0\xb3\xcd\xe9\ \x1f\x1f\xf2\x03\xaf\xfe\x10\x00\x9f\xf8\xd1\x9b\xdc\xb6\x3f\x4b\ \x6b\xe1\x81\xb2\xe0\xcf\xb6\xdf\xa0\x49\x53\x63\xc0\x89\x02\xae\ \x3c\xc6\x6e\x6c\x43\xc8\xb6\x5c\xfa\xa0\x48\x1d\x74\x7a\xf0\x46\ \x12\x86\x3c\x4e\x99\xb8\x87\xf2\xdc\x4e\x9e\xb1\x8c\x90\x19\xe9\ \x72\xf1\xcf\xb8\xf4\xaa\x59\x91\x9f\x1c\x67\xca\x1d\x8c\xba\x30\ \xfe\x10\xf8\x7e\x16\x32\x11\x7b\x95\x12\x5b\x95\x21\x0f\xd7\xb7\ \xe8\xef\xed\x28\xcf\x83\xe8\xfb\x86\x60\xe3\x5e\x96\x43\xd7\xa0\ \x52\x14\x03\x0b\x07\x13\x7d\x5e\x74\x9c\x69\x28\xe5\x43\x7a\x9b\ \x06\xef\x4d\xcb\xe2\xa6\x65\x11\x59\x37\xb9\xa9\x3d\x0f\x10\x9d\ \x4d\x78\x77\xe7\x21\x51\xdc\x0e\xe9\x22\xf0\x94\x1f\xd3\x2f\x82\ \x3b\xe7\xb2\x95\x98\x7d\x9c\x9a\x44\x6f\x61\xce\x68\x59\x09\xc8\ \xb4\xbc\x60\x30\xdf\xf8\x48\x03\x7e\xd8\x73\xa7\x2e\x37\x8d\xe9\ \xe5\xdf\xed\x59\x82\xe5\xba\xe5\x6e\xa2\xb3\x8f\x72\xb1\x99\x4d\ \x56\x36\xea\xca\x9d\x26\x2b\x2f\x46\xad\x29\x80\x0f\xbb\x13\x86\ \xa1\x0b\xa1\xb6\x80\x62\x00\xcb\xef\x2a\xbd\x1d\x3d\x47\x8c\x0d\ \x33\x72\x8b\xac\x5c\x1e\xf0\xd4\xbf\xc3\x07\xaf\x3f\x06\xe3\x98\ \xa8\x78\x93\xfb\x9f\xff\x24\x3f\x76\xe3\x0b\x14\xbf\xfc\x05\x26\ \x8d\x02\x17\xad\x2f\xf1\xd6\x1f\xee\xf2\x26\x30\x39\x7f\x04\x3d\ \x03\xbf\xec\xc5\xda\xb8\x88\xcb\xac\xf4\x91\x25\x55\x69\x3b\x20\ \x13\xb6\xf0\xcb\x99\xc4\x00\xf5\x82\x55\x12\x83\xd1\x7b\x0e\xe7\ \xb8\xe0\x94\x66\xd2\x2b\xf5\xec\x36\xf5\x58\x6b\x40\x9e\x96\x23\ \xea\xbd\x71\x0e\x89\xe5\x9e\xb3\xbb\x6b\xb2\xb1\x75\xc1\xc2\xc6\ \x6d\x2a\x0b\x8b\x74\x17\xe4\x49\xd8\xc2\x2c\x9c\x28\x03\xaf\x44\ \x8e\x7e\x27\x6e\xec\xee\x6f\x03\x9f\xc1\x1f\x58\x58\xc5\x3e\x50\ \x49\x78\x44\x4c\x80\xae\x7f\x7f\xea\xc4\x8e\x01\x6c\xac\x86\x82\ \x79\x57\x43\x6e\x5a\x96\x92\x0e\xfa\x56\x32\xf7\x7e\xf7\x29\xad\ \x83\x4e\x02\xc0\x1d\x23\xa2\x66\x56\xe7\xb2\xaf\x1e\x54\x48\xaf\ \x74\x69\xb0\xe9\x46\x9c\x6e\xa4\xe9\xa1\x64\xfd\x73\xd3\x9a\x59\ \x37\xfe\x74\x50\xfb\xbd\x90\x28\x53\x51\x72\x42\x06\x32\xfc\xa2\ \x97\x00\x70\xa2\x8a\x23\x14\x5d\xd1\xd7\xca\xd3\x0a\x8d\x83\xe1\ \x4d\x8e\x5b\xc2\x88\x6b\x75\x62\x00\xfb\xee\xdc\x2b\x80\xba\x52\ \xc4\x7f\xaf\x15\x0a\x5f\x79\xd0\xab\x73\xdc\xba\xc0\xfe\xf4\x16\ \x3f\x7c\xcb\xe0\xc1\x8f\xdf\xe3\xc5\x1f\xfc\x22\x9b\xb7\x37\xf0\ \x4f\x3a\x7c\xeb\xf0\x82\x77\xdf\x38\xe1\xfd\xdf\xd9\x65\xcd\xdb\ \xe7\x1f\xfc\x0d\x93\x2f\xff\xc4\x06\xd9\xe5\x07\x1c\x4d\x2e\x89\ \x32\x95\x44\xcf\x37\xfd\x7b\xcf\xdb\xca\xbf\x9f\x0e\xb3\xeb\x84\ \x71\x8e\x91\x78\xec\x9a\x63\x5c\x73\x3c\x75\xb3\x69\x1d\x46\x13\ \xb3\x4f\xb4\x9b\x1e\xf5\xd3\x0d\xbb\x9d\xae\x00\xdf\xd9\xf0\x29\ \xe3\xe1\x15\x99\x6e\x9b\x8d\xc2\x9a\xc8\xa1\xf0\x77\x66\xab\x45\ \xea\x26\x83\xf6\x90\x6a\x7f\x91\xfe\xa0\x8b\x55\xf4\xf1\x07\x96\ \x62\x61\x95\x3b\x11\x9d\x9a\xd4\xd7\x3f\x4c\x80\x57\x82\xba\xcc\ \x83\x19\x46\x4e\x3f\xb6\xd6\x37\xb9\x5d\xbb\x4b\xb6\x99\xe7\x22\ \xf0\x44\xda\x5e\x2a\x14\x19\x65\x2a\x89\x18\xbc\x7e\x40\xf5\x01\ \x31\xd7\x01\x53\x02\x21\x0d\x50\xc9\xdc\x12\x2c\x2a\xd4\xdc\x0b\ \x67\x16\x8d\xee\xa9\xd0\xf5\xae\xcc\xa3\xb8\xce\x53\xe2\x3a\x13\ \x6a\x77\xa6\xc9\x3d\x52\x03\x37\x2f\x8e\x14\x80\xaf\x3a\x9d\x04\ \x9b\xe9\xdf\x5b\x7e\x17\x1d\x60\x7a\x7f\x8b\xb3\xc3\x36\x7b\xaf\ \x1d\x52\x5e\x35\xf8\xe2\x67\x3e\xc7\x8f\xfe\xbd\xcf\xf2\xf2\x27\ \x57\xb9\x73\xb3\xc8\x46\xc6\xe7\x5b\xdf\x7d\x8d\xdf\xfa\x8d\x5f\ \xe1\xf7\x7e\xf5\xf7\x38\x0a\x73\xdc\xbb\xf3\x0a\xad\x07\x1b\x34\ \xf2\xd5\x99\x06\xdf\xd7\x79\x5c\x12\x55\xdf\x73\x8e\xb1\x7e\x7f\ \x99\x48\x91\x46\x22\x76\x10\xf4\xe7\xba\xe9\xd2\xcf\xa5\xcf\xab\ \xee\x92\x6b\x75\x3d\xa2\xec\x19\x79\x56\x70\x49\x85\xb2\xad\x64\ \xb9\x52\x89\x1c\x01\x35\xd1\xe2\xd5\xbd\x60\xa3\x34\xdf\xe5\x57\ \x2a\x67\xb1\xee\x7f\xfe\x93\xf8\x97\x15\xac\xcf\xf7\x45\xf4\x0d\ \x78\xf5\xee\x90\xc3\xe0\x2e\x0b\x77\x7c\x02\x1f\x16\xec\x0d\x5a\ \xec\xc7\xa0\xfe\x50\x31\xf6\xfa\xba\xa8\xe6\x30\x56\xb2\xe2\x4b\ \x04\x0f\x55\x56\x5a\x3d\x32\xe8\xc4\x91\x26\x79\x49\x13\xee\x9e\ \xf9\x2e\xae\xb4\x3e\x53\x46\x9a\xef\x42\x0f\x7c\xdc\x84\x11\x37\ \x57\x0f\xc7\xd2\x41\xee\x3b\xec\xb9\x09\xa3\x45\x07\xb2\x6e\xd0\ \x28\x3d\x88\xa9\x5c\x4d\xcd\xfa\x40\x15\x82\x16\x57\x93\x25\x56\ \x8f\xfd\x67\x14\xce\x9b\x74\x3b\x5d\xdc\x98\x09\x75\xf6\x95\x2c\ \xaf\xff\x16\x7d\xe1\xd6\x23\x43\xc8\x8c\x6a\xc4\xf6\x55\x87\xee\ \xaf\x7f\x9d\x47\xef\xdc\xa0\xfc\xca\x21\x0b\x5d\xd1\x19\xe9\x0b\ \x1f\xbf\x4f\xb1\x9e\x61\xf3\xde\x5d\x8e\xc7\x1e\x61\x7e\x19\x3f\ \x7c\x88\x65\xbe\xc4\x0f\x1b\x23\xde\x90\x2e\xba\x39\x2c\x7c\x5d\ \xe4\x32\x7d\xac\xf5\xab\x97\xce\xc4\x46\x3f\x22\xdf\x28\xcf\x1c\ \x2f\x5d\xeb\xea\xe4\x23\xc9\x44\x12\x4b\xda\xd5\x26\xd9\xbf\x06\ \x8c\x0f\x26\xf0\xfd\x10\x19\x5d\x20\x98\x1b\xf4\x90\x92\xa2\xa9\ \x35\x79\xba\x74\x45\xae\x85\x55\xf4\x29\x7a\x2e\x7d\x16\x89\x68\ \x09\x4d\xbc\xba\xb1\x81\xb3\x50\xa6\x5c\x74\x58\xdd\x00\xbf\x2f\ \xc2\x2b\x2b\xdd\x51\x9c\x00\xf4\x4a\x2c\x6b\xea\xf8\xf9\x0e\xd6\ \xda\x2b\xec\x5a\x9a\x53\x70\x1d\xd6\xfd\xa7\xec\xaf\x6f\xb1\xfb\ \xd6\x9f\x53\xcf\x2e\xaa\x4b\x88\x8c\x0e\xd5\xca\xc2\xdf\x0a\x95\ \x19\x8b\x39\x7d\x5f\xd7\xc9\xc2\xa8\x22\x21\x23\xa4\x0b\x2d\xed\ \x47\x96\x5e\x09\xaa\xe2\x3d\xfa\xeb\xe9\x13\xb6\x4c\xa4\x2e\x9b\ \xcb\x44\xf4\x00\x33\xec\x01\x75\xc2\x4e\x87\xe5\x66\x4d\x65\xb9\ \xd5\xea\x0d\x5e\xb0\xa6\x39\xc2\xdb\x8f\x42\x0a\xbd\x26\xbb\xad\ \x53\x7a\x4e\x51\x7d\xae\x6e\xc0\x0d\xfd\xa9\x27\xc2\x1a\xd8\x6a\ \xa1\xc8\xdf\xa4\x8f\xba\x2d\x58\x25\x7a\xc0\x5b\x3b\x27\x98\x4f\ \x3e\x24\x72\x2b\x2c\x55\x44\x7f\xb2\xf5\x7b\x5f\x64\xf3\xde\x06\ \x5f\x78\x61\x93\x93\x70\x0d\xcb\x14\x44\xf3\xf0\xfd\xf3\x99\x2b\ \xca\x75\x41\xa3\x79\x72\x4b\x5e\xb9\xe8\xcd\x46\x36\x0b\x56\x89\ \x11\xce\xcc\xfe\x05\xab\x94\x18\xb2\xa3\x37\x57\xd4\xf7\xd5\xff\ \xa6\x0c\x9b\x97\xca\x62\xd0\x7a\x37\x80\x9d\xfd\x3e\x2f\x5e\x5e\ \xd0\xb8\xb5\xc5\x62\x63\x13\xd8\x4b\xba\xd9\xfc\x23\x05\xe4\xbe\ \x51\x50\x19\x8b\x1e\x57\x71\xe3\xca\x0a\xbd\xc8\xc3\x2a\x7a\xf8\ \x72\x1c\xb2\x4d\x0e\x8a\x5a\x32\x45\x25\xbe\xd4\x55\x2a\xac\x02\ \x36\x01\x1e\x19\xc2\x41\x48\x18\xe7\x57\xc8\x3c\x8b\x28\x06\xfa\ \xf2\xc2\x57\xc8\x58\x1f\xb2\xf3\xb4\x09\x5d\xe1\x10\x97\xda\x78\ \x52\xb1\xe8\x10\x51\x37\xab\x74\x88\x34\x46\xf6\x67\xee\xa7\xa5\ \x86\xce\x64\xf2\x80\x4b\xb6\x4d\xb0\xb5\xe6\x52\x4b\xeb\x69\xdd\ \x90\x93\x8f\x7b\x56\x19\x7c\x97\xaa\xef\x08\x30\x03\x8b\x66\x85\ \x16\x90\xcb\xad\xd1\x73\x44\x7e\x44\xed\x4e\x43\x25\xb9\xef\xfa\ \x03\xc2\xa3\x0d\xfa\x85\x77\x39\xd9\x1b\x27\xb4\xa8\x34\xe0\x74\ \x06\x4e\xe8\xd3\xd8\xaf\x9d\xce\x8e\x2b\x55\xb3\x4c\x0c\x8b\x7a\ \xd7\xa4\x64\xe6\xa0\x5e\xa7\xb9\x04\x9f\x7a\xe5\x05\x3e\xf1\xa9\ \x17\x09\xef\x3c\xc3\xdc\x3b\xe5\x1b\xe7\x13\x16\x6c\x9f\xab\x27\ \x87\xbc\xf1\xfe\x5f\x31\x39\x3f\x52\x75\xea\xfa\x15\x4e\xff\x3e\ \xf2\x6f\xa6\x01\xac\xa2\x9a\xbd\x59\x90\x0e\x7d\x97\x51\xdb\x21\ \xaa\x18\x62\xa1\xa7\x5e\x5b\x26\xa2\xe7\x94\x67\xe4\x42\x9a\xcd\ \xe5\xdf\xc9\x84\x2d\x4a\xd5\xc6\x34\x5a\xd9\x11\x39\x14\xa3\xa3\ \x0e\xd1\xfa\x39\xb9\x8d\x06\x37\x3e\x56\xe5\x3b\x1f\xc4\x55\x1c\ \xbe\xf0\x50\xa8\x4e\x9b\x8e\xc8\x58\x3c\x1e\x5a\xdc\x02\xaa\x46\ \xc8\x80\x3e\x90\x4c\x1d\xb0\x3c\xc6\xe4\x0b\x21\xa3\xa1\x39\xb3\ \x55\x65\x4b\xe4\xe2\x39\x83\x7a\xf5\xab\x07\x95\x05\xb2\xb4\xa8\ \x34\x96\xf9\xdb\x1b\x77\xf9\xb3\x3f\x3a\x10\xe1\x51\x3f\x62\xc9\ \xb2\x55\x75\x82\x14\xfb\x75\xb3\x4a\x27\x8e\xf5\xcb\xe8\x92\x9e\ \xb4\xa2\x07\x23\x54\x07\xf6\x5e\x88\x15\x9f\xb1\x82\x55\x52\x5e\ \x06\xc9\x76\x09\x66\xd1\xa4\x83\x7c\x6f\xda\x9f\x2c\x13\x78\x86\ \x18\x0a\xcc\xca\xa0\x89\x43\xca\x3d\xab\x4c\x50\x6f\xb0\x12\x37\ \xaa\xde\xf5\x07\x2c\x9d\xd8\x7c\xe7\xe4\x31\x7d\xa7\x41\xcf\xe9\ \xcf\x8d\x06\x8e\xc7\x27\xe4\x58\x9b\x0b\x64\xfd\x52\xde\x2d\x8a\ \xc8\x9b\xeb\x4c\xc8\x02\xae\x29\x82\x2b\x5b\xa6\x41\xf1\xbe\x17\ \x03\x58\x5c\x52\x9f\x9e\x4f\x78\xfd\xf7\xdf\x10\x9d\x7f\x34\xf7\ \x98\xee\x49\xd1\x43\xe9\xba\x27\x64\x9e\x4e\x4f\x3f\x97\x5e\xf0\ \x51\x3c\xd4\xe5\x42\x73\x02\x0c\xf5\x63\x74\x8d\x7c\x49\x2f\x08\ \x19\xe4\xd0\x23\x7f\xd4\xc5\x39\xea\x55\x2e\x31\x96\x97\xb1\xa9\ \xf0\xc9\xdb\x9f\xe1\x83\xca\x43\xe1\x75\xf1\x87\x98\x75\x5b\x25\ \xc8\xcb\x71\x63\x2a\xd0\x61\x87\xf8\x03\x8b\xaa\x11\xd2\x1b\x78\ \x58\x45\x5b\x34\x14\xb4\xc9\x61\x0e\x23\x6c\x02\xcc\x61\x3c\x93\ \x21\xde\xe6\x0b\x61\xfc\x21\xde\x14\xb8\x6a\x2b\x9e\xb7\xb1\xf1\ \xdb\x67\xd8\x35\x9f\x9f\xfa\x99\x2f\x51\x5f\x7c\x85\xa3\xab\x2b\ \x2e\x02\x4f\x95\x85\x4b\x4f\x85\x9e\xef\x2a\x19\x44\x4f\xc8\x49\ \x07\x19\x74\x9d\xab\x07\x44\xae\xab\x8f\xd3\x25\x84\xae\x9d\x75\ \x00\x5b\x55\x53\x49\x89\x79\x9a\xb0\x67\x95\xa9\x96\x07\xdc\x6b\ \x8a\xa6\x27\x17\x6b\x1e\x4b\x27\x36\x8f\xfd\x67\xa2\x61\x75\x47\ \x00\xd8\x0c\x7b\x33\x97\xe1\x5c\x6e\x6d\xae\xaf\x3b\xed\x03\xd7\ \x7f\x8f\xdc\x2f\xdb\xf7\x69\x05\x70\xf6\xa4\xc1\xd7\x77\xf6\xf8\ \xf3\x3f\x3d\xe4\x4f\x7f\x79\x9b\x3f\xfc\xfd\xaf\xb1\xb3\xbb\xaf\ \x0a\x5f\xe7\x75\x2c\x92\xbf\x4d\x97\x4e\xba\x36\x9f\xe7\xb9\x19\ \xfa\xae\xea\xe1\x5c\xb0\x4a\x18\xfd\x88\x65\xa6\xc6\x53\x54\x31\ \xbe\xa7\xec\x3e\xdd\x08\xd4\x8f\xa5\xde\x6d\xbf\x63\x88\x3e\x75\ \x74\x42\x0e\x23\x31\xfd\xaa\x7d\xb0\xc3\x78\x78\x45\x34\x39\xa6\ \x7a\x73\x43\x94\x2a\xf5\x0c\xfa\xc3\x35\xd5\xa4\xb0\xef\x14\x68\ \x85\x1e\x6e\x5c\xde\x24\x3d\x13\x03\x3b\xc4\x88\xfd\x76\x71\x65\ \x87\x97\x64\x57\x5d\x64\x0f\x0b\x78\xaa\xf1\xc6\x75\x40\x06\x8f\ \x0c\xfe\xf1\x29\x9b\xf7\xef\xf3\x77\xff\xa3\x2f\xb2\x79\xf3\x87\ \x45\x3a\x60\xa7\x4f\xa7\xd3\xa7\x51\x31\x67\xaa\x14\xd2\xae\x35\ \xc9\xc6\x3a\xa8\x25\xf8\xfc\xa2\x37\xd7\xeb\x20\x73\x85\x75\xb6\ \x9d\x77\x40\x75\x40\xeb\xde\x82\x74\xd8\xbb\xea\x3b\x54\xcb\x03\ \x6a\xf5\x1a\xc3\xe5\x16\x17\x6b\x9e\x0a\x27\x9f\x3d\x69\x24\x72\ \x7f\x43\xb3\x3a\xa3\x27\xa5\x6e\xd7\x7f\x83\xee\x19\xf0\x8b\xc2\ \xaf\x2b\xaf\x4c\x52\xfb\x27\x4a\x8d\x3a\x7d\xfe\xe4\x37\xff\x8c\ \xd7\x5e\x7b\x97\x6f\xfe\xe5\x43\x26\xad\x11\xcd\x5a\x93\x4c\xa3\ \x96\x30\x98\x66\x02\x42\x73\xb4\x70\x9a\x69\xd3\xc7\xd0\xce\x64\ \xd4\x6b\x51\xc5\x48\x64\x9b\x49\x80\x7b\x41\xa0\xfe\xeb\xbf\x51\ \xff\xdb\xf3\x58\x58\x5d\x2d\xc2\x1e\xf5\xc8\x20\xca\x54\xb8\x0c\ \xfb\x42\x1e\xc4\x6d\x78\x33\x83\x0c\x4e\x2f\x69\x34\xcb\x86\x3b\ \x6a\x94\xc2\x9c\x61\xb0\xfe\xc0\x22\xa2\x05\xf4\xa7\x7e\x62\xfd\ \x66\x93\xc3\x63\xac\x6d\x03\xf5\x8a\xbe\xd7\x8c\x21\xd1\xee\xe0\ \x84\x7d\x7e\xe0\x2b\x3f\xcc\x7f\xf6\xdf\xff\x34\x5f\xfe\x47\xff\ \x82\x8d\x57\xff\x21\xed\x51\x0f\x6b\x90\x57\x6d\xa5\x9e\x5b\xb3\ \x15\x03\x59\x4f\x85\xd4\x99\x38\x11\x42\xd6\xc0\x9b\x8e\xc8\xa5\ \xc1\xec\x05\xc1\x5c\xd9\x31\xb3\x30\xea\x26\xb5\x7a\x8d\xe2\xaa\ \xc7\x0b\xd6\x4d\xda\x87\x2d\xfc\xed\x02\x1f\xb4\x3a\x84\xfe\x19\ \xe7\x9d\x48\x81\xc4\x0c\x7b\xea\x04\xea\x27\x54\x46\xc8\xa2\x4c\ \x25\xb9\xc8\xa4\x8f\x36\x9e\x24\xaa\x03\x41\x56\x54\xeb\x9f\xa3\ \xb2\xcf\xcc\x31\x9d\x5a\x98\x58\xe0\xba\x54\x4a\xbf\x4f\x6f\x18\ \x93\xf0\xfa\xa4\xae\x46\x33\xe9\xb7\xfd\x28\xc1\xbe\x12\xe0\xe9\ \xed\xf3\x5c\x74\xf2\xb1\x5e\x64\xaa\x8f\x06\xce\xe5\xd6\xa6\x87\ \xba\x50\x26\x73\xcb\xa4\xb1\x24\xbe\xcb\xad\xaa\x43\x76\xf9\x81\ \xea\xdb\xa7\x7c\xce\x41\x57\xb5\x6a\x98\xbd\x55\x24\x13\xdb\x0a\ \x98\x1e\x19\x60\xda\x0d\x5e\x00\xd8\x4e\x30\xee\x3c\x36\xb6\xc9\ \xe1\xd9\x25\xec\xf6\x19\xe5\x41\xc8\xe6\xfd\xfb\x7c\xf9\x67\x5e\ \xe4\x9f\xff\xcb\x1f\xe3\xe5\xcf\xfd\x24\x9d\x4e\x5f\xc9\x0b\x29\ \x27\xae\x3a\x1d\xd5\xb3\x21\x68\x77\x71\x2e\x5b\x04\xed\x6e\xe2\ \xc4\xea\x27\xbb\x69\x46\x89\xcb\xa5\x7e\x72\xd2\x60\xd4\x41\xdf\ \x1e\xf5\x68\x68\x03\xaf\xf5\x13\x19\x76\x3a\x0a\x84\x4d\x33\x4a\ \x00\xf8\xb1\xff\x8c\xca\xf0\x06\x67\x9d\x36\x51\x6f\x9a\xe4\x22\ \x59\x47\x67\x62\x9d\x89\xa4\x91\xaa\x03\x53\xff\xbe\xf3\x6a\xd6\ \x9e\x97\xa4\xaf\x2f\x6c\x3d\x99\x67\x1e\xdb\xa6\x0d\xdb\xb4\x4f\ \x5d\x2e\x3a\xf9\xf7\x24\xbb\xea\xf2\xc1\x48\xcd\xe7\xf6\x82\x20\ \x01\x60\x3d\xb2\x9a\x06\xb2\xdc\x66\xc2\x56\x02\xc8\xba\xcd\xd0\ \x0a\x45\xbd\x5d\x67\xe8\x60\x3a\x19\x36\x1b\x9b\xd4\x3f\xb6\x7e\ \xed\xef\xaf\x65\x6a\x2c\x74\xfa\x8c\x2e\xc7\xca\xc5\x66\x15\x7d\ \x15\xf0\x50\x33\x3b\x04\x1c\x05\xeb\xba\x03\x83\x52\x31\x96\x11\ \xde\x50\x03\xab\x27\x0c\x3c\x6f\xa8\xc0\xec\x69\xd3\x73\x04\x73\ \x67\x70\x46\x2d\x9c\xab\xef\xb2\x10\xc2\xda\xcd\x02\x3f\xf5\x33\ \x5f\x62\xe3\xd5\x7f\x48\xb6\xef\xb3\x7b\xf6\x8c\xa3\xab\x2b\x8e\ \xae\xae\xf0\x82\x80\xd2\xfa\x02\x77\xee\xbf\xc4\xbd\xef\xfb\x24\ \xeb\x77\x37\x71\xfb\x22\x09\xbc\xdf\x9e\xa8\xd2\x22\x79\x70\x64\ \xbe\xb0\xae\x8b\xd3\x72\x61\x1e\x2b\xd8\x99\x4c\xe2\x79\x9d\x89\ \xc3\x38\x09\x5e\x3e\x27\xcb\x87\x54\x75\x75\xa7\x1d\xfb\x82\x27\ \x73\x3d\x1e\x73\xfd\xd5\x73\xca\xfd\xf5\xe8\xa0\x7e\xa5\xf9\x5e\ \x92\xf8\xf5\x54\xcd\x79\x85\x04\x69\x37\xe2\x75\x36\x42\x3a\xfa\ \x79\xdd\x4d\x67\x63\xa3\x1f\xcd\x00\xf8\xba\x9b\xfc\xfd\x32\x17\ \x5c\x8f\xe2\x49\xe9\x98\xcb\xad\xd1\xed\x74\x39\x88\x26\x71\xbd\ \xdd\x25\xad\xb0\xcb\x6a\x7d\xda\x11\x68\x5e\x4f\x8b\xc3\x28\xcb\ \xbd\xdb\x59\x0d\xbc\xe2\xd8\x55\x8d\x30\xce\x01\xf7\xda\x60\x17\ \x94\x7c\x28\x15\x03\xdc\xc1\x90\x52\xb1\x00\xb6\x94\x14\x36\xee\ \x60\x88\x59\x1c\x63\xdb\x0d\x6c\xaf\x0d\x76\x43\xe4\x73\xe2\x29\ \x30\xdb\x71\x02\x87\x07\x74\xdb\x5d\x6c\xc6\xbc\xd0\x28\xf1\xcf\ \xff\xe5\x8f\xf1\xdd\x77\x6f\x71\xb5\x67\xe1\xf0\x88\x9b\x96\x85\ \xb5\xbe\xc9\x67\x3f\xb1\x8e\x99\x29\x31\xa0\x8a\x37\xec\xf0\xe4\ \xc3\x6d\xf6\xf7\xb6\xd9\x7b\xfc\x01\xbb\x3b\x07\xb4\x2f\x5b\x84\ \x03\x71\x50\x6f\x7d\xf2\x8e\xb8\xbc\x1e\x5d\x25\x4f\x60\x2f\x19\ \xd8\x90\xec\x5b\x69\x64\x67\x2e\xb9\x72\xff\x74\x35\x87\x9c\x66\ \x34\x5c\x6e\x51\x19\xde\xa0\x5f\x38\x56\x35\x7d\x22\x78\x33\x99\ \x3d\x61\xd7\xe4\x6c\xe8\x41\x81\x04\xd8\x52\xa9\xa1\xba\x57\x26\ \xed\x39\x98\xe7\xf9\x98\x97\x0b\x3d\xcf\x38\xd5\x17\xb8\xf4\x5f\ \x17\x72\x6b\x33\x57\x8d\x79\x0c\x9b\x96\x14\xcf\x33\xee\xae\x5b\ \x78\xfa\x77\xd7\x93\xe4\xeb\x55\xa0\x9c\x85\x4e\xc8\xce\xf6\x19\ \xfc\x28\x84\x3d\xb0\xcc\x88\xe5\xf6\xd4\xc5\x9b\x2d\x7c\x1c\xfc\ \xa3\x69\x92\x7c\xec\x21\x79\xb2\x3f\x41\x14\x8f\x57\xa8\x1a\x2e\ \x66\xad\xa1\x65\xb1\xd9\x0d\x3c\xc6\x84\x83\x21\xa5\x62\x14\x33\ \x71\x14\x3f\x17\x0a\x30\x7b\x6d\x4a\xc5\x06\x78\x6d\x3c\x1b\xc2\ \xc8\xa6\xa4\x71\xb0\x8d\x87\x3b\x30\xa0\x88\x02\xbd\x40\xf3\x90\ \xb6\x9d\x61\xed\x66\x85\xd5\xfa\x97\xe1\x8b\x7d\x9a\x93\x2f\xd1\ \x0f\xce\xc0\x8e\x2d\xea\xa1\x41\x35\x9f\x63\x62\x98\x6c\xae\x7e\ \x19\x7e\xe4\xcb\x9c\x76\xae\x28\x5c\x79\x9c\x5e\x5e\x71\x38\x14\ \xb5\x56\x9b\xeb\x65\x7e\xe9\x17\xdf\xe7\xe8\xe9\x2f\x51\x5e\x6c\ \x52\xe8\x97\x12\x8c\xa3\x4b\x0a\x3b\x93\xc1\xef\x85\xea\x44\xa5\ \xfd\xc4\x89\xbc\x64\x50\x32\xa2\x70\xde\xa4\xbf\x3c\x05\xf0\xe1\ \xd1\x64\xd6\xf7\x0a\xd3\x54\xd0\x54\xb4\x4a\x82\x37\x51\xb0\x3a\ \x27\x62\x26\xdf\x2b\x7d\xbb\xe9\xab\xc8\x3c\x00\x4f\xa5\x85\x3d\ \x03\xd8\xeb\x8c\xbb\xa1\xef\xce\x05\xf0\xf3\x58\x38\x0d\x64\xf9\ \xf8\xa3\xde\x3b\x6f\x11\x59\x55\x93\x9a\x53\x9b\xe6\x5b\x68\x79\ \x14\x17\xdd\x27\x74\xbd\x4d\x8a\x1b\x4d\xce\xdb\x65\x95\xcd\x76\ \xf8\x9d\xdf\x84\x7a\x45\x25\x01\xb5\x3a\x43\xa2\xf1\x25\x3b\x3b\ \x5f\xe3\xac\x73\x9f\xd0\x5e\x65\x3d\x3a\x22\xb8\xb8\x43\x36\xb3\ \x22\x98\x38\xe7\x0d\x71\x23\x62\xe0\x66\x00\xe1\x56\x93\xa0\x06\ \x31\x39\xc9\x64\x0c\x76\x89\x9a\x17\x32\x2e\x16\x14\x5b\x0b\xd0\ \xa2\xee\xd7\xbc\x90\x76\x24\x24\x89\x1b\x89\xa1\x20\xfd\xf6\x1e\ \x50\xc6\x26\x47\xbf\xd0\x87\xe1\x90\xf6\x50\x04\x50\xcc\xa2\x09\ \x23\xd1\x7f\x78\xc4\x3e\xe5\x7c\x93\xb5\x9b\x05\xa2\x46\x8e\xca\ \x46\x86\xef\x2f\x2c\xd1\x8b\x2a\x74\xfc\x08\x78\x7f\x06\x54\x32\ \x32\x96\x0e\x47\x5b\x55\x13\xbb\x97\xd4\x89\xfa\x89\x58\x26\x02\ \x33\xa2\xa6\x55\x66\x65\xab\x05\x5a\xa7\x36\xa1\x53\xa5\xef\x1f\ \xe2\x17\x0d\xf5\xb9\x7a\x16\x5a\x9a\x19\x25\xcb\xce\x1b\x1b\x76\ \x2d\x60\x32\x15\xfc\x62\x7f\xc6\x68\xbd\x8e\x85\x75\x69\x31\x6f\ \xdf\xeb\xd8\x3c\x0d\x60\xb9\xbd\x4e\x26\xa4\xd9\x57\x02\x7b\x58\ \x71\x3f\x52\xfa\xa4\x33\xe2\x7c\x3c\x55\x3c\xaa\x1b\xcf\x27\x4e\ \x84\x73\x1a\xc1\x4b\x50\x2a\xd6\xb9\x5d\x0b\xf9\xa3\x85\xe9\x24\ \x57\xd5\x7d\xde\x11\x81\xb3\x13\x27\x62\x0b\x18\x74\x02\xe8\x3c\ \xe3\xcf\xc7\x11\x6b\xb9\x7d\x8a\xf5\xb8\x5f\x45\x5b\x03\xb0\x60\ \xde\x08\xbc\x36\x66\xd1\x14\xec\x8a\x18\xc2\x68\x93\xc3\xf6\x5c\ \xc6\x76\x21\x96\x1d\x05\xc5\xd6\x60\x83\xd7\x26\x1c\x84\x8c\xed\ \x82\x00\xf0\x60\x48\xc3\x40\x19\x89\xe0\xe0\xd1\xa2\xdf\x3e\xe6\ \x6a\x60\x88\xbf\xa5\x0d\x77\xb4\x3c\x0f\xbf\xdf\xa7\x73\xb9\x4f\ \xfb\x60\x97\x5e\xfb\x12\x77\x30\xe4\xe0\xa2\x45\xd6\xe8\xd3\xbe\ \x10\x6e\x99\x46\xbe\x4a\xb6\xef\x27\x12\x80\xfc\x5e\x48\xa6\x51\ \x4b\xe8\xbd\xb4\x81\x93\x28\x1f\xf3\x1d\xe1\x89\x88\x4b\x87\xa4\ \x16\x96\xed\x00\x3a\x7e\x8f\x80\x5a\xc2\x80\x92\x4c\x28\x8b\x35\ \x96\x90\x1f\x66\x00\x00\x19\x9b\x49\x44\x41\x54\xe7\xb9\x08\xe7\ \x25\xc4\x3c\x4f\xeb\x5e\x67\x20\x3d\xef\x52\x7d\x1d\xeb\x5d\x07\ \xfc\x8f\x62\xe0\xb4\x21\xa7\x3f\x27\xb7\x12\xd8\xba\xee\x7d\xde\ \xad\xea\x3b\x33\xae\x38\x55\x84\xea\x14\x55\x4f\x89\xce\xd0\x81\ \x81\x60\x1a\x99\xcd\xe6\x3a\x13\x5c\x6b\x3d\x31\x7b\x6f\xd2\x1b\ \xb2\xbb\x1f\xcc\x0c\x14\x1a\x74\x82\x69\x8d\x1d\xde\x90\x30\xb2\ \x63\xe0\xc6\xa0\x8c\x41\xe6\x61\x12\x46\x36\x0c\x86\x94\x8a\x0d\ \xdc\x81\xec\x86\x28\xb6\x42\x82\x88\xd7\x4a\x5e\x1b\x77\x20\x58\ \x19\x40\x2e\x10\x77\x50\xc4\x2c\x9a\x84\x83\x90\x6c\xd1\x66\x3c\ \x20\x66\xf9\x82\x08\x67\x07\x11\x54\x6c\xcc\x81\x18\x76\x03\x65\ \x6c\xcf\x8d\x47\x90\x4d\x6f\xfb\x95\x09\x81\x66\xad\xeb\xae\x23\ \xe9\xd9\x98\x77\xc2\x66\x0c\xbf\x38\x72\xd4\xac\xd9\x0c\x97\x5b\ \xb4\x4e\x81\xd3\xe9\xd8\x58\x59\xf9\xa0\x97\xb9\x8b\xf1\x60\x36\ \xa8\xd6\xae\x3c\xb7\x4e\xf0\x3a\x69\x90\x0e\x76\xcc\x2b\xa3\x9a\ \xc7\xa6\x32\xd7\xa1\xea\x3b\x60\x25\x93\x73\x9e\xc7\xb8\xd7\x45\ \xe6\xa4\x67\xc2\xae\x64\x66\xa4\x83\x64\xdf\x8f\x5a\x44\xd7\xdd\ \xf4\x48\x68\x42\x1b\xc7\x00\x6f\x75\xb3\x6c\x1f\xef\xb2\x79\x79\ \x9f\x71\xe3\x52\xb5\x42\x00\xa8\x2f\xbe\x42\xc9\x3f\xc2\x25\x1e\ \x96\x33\xc8\x89\xb9\x1e\xbb\x01\xd9\xd6\x9b\xec\xda\xa2\x11\xe1\ \x51\x3c\x13\xda\x35\xc7\x98\x25\xc3\xc3\xb3\x93\x07\x52\x32\xa4\ \x1b\xd9\x53\x76\x8e\x3d\x18\xf2\x35\x09\x54\x8f\x0c\x0d\x03\xdc\ \xc1\x50\x0d\x6c\x74\x07\x43\x4a\x86\x17\x33\xb2\x91\x60\x64\xc9\ \xee\xf2\x7e\xc3\x40\xcc\xc9\x1b\x08\x17\x56\x38\x28\xe2\xf7\xfb\ \x49\x00\x7b\x31\xe8\x1e\x1d\x26\x00\x3c\x4f\x1b\xea\x27\x49\xfa\ \x88\xf5\xe7\x97\xeb\xa2\x7f\xb0\x64\xe1\xc1\xa9\xad\x98\xb8\x1d\ \x1a\x89\x80\x86\x3e\x3a\x37\xca\x54\x54\x85\x8a\x2c\xed\x7f\x5e\ \x33\xc2\xeb\x4e\xb6\xfe\x9e\x66\x2f\x98\x49\x50\xba\xee\xf3\xf4\ \xae\x45\x32\x8f\x61\xde\x71\x78\x1e\x80\x13\xf1\x80\x4c\x86\xe2\ \xc0\x9c\x6b\xd4\x49\x00\xe7\x1b\xe5\x6b\x3d\x10\xcf\x5b\xb4\x55\ \xdf\x99\xd9\x47\x36\x9f\x39\xc7\x80\x0a\xdc\xc8\xdc\xe2\xa2\xfb\ \x84\xbd\xfd\x0e\xbd\x6e\x3c\x7f\x7a\xe5\x65\x2e\x46\x0f\xd5\xb0\ \xc6\x86\x99\x5c\x48\xa6\x3d\xed\xa4\xe9\xec\x1e\x72\x7a\xf2\x50\ \x04\x3b\xdc\xc8\xc6\xf6\xc4\x0f\x95\xdb\x34\x03\xba\x03\x43\x4d\ \x13\x75\x23\x7b\xca\xbe\x31\xa0\xc7\x78\x94\x8a\x51\xac\x83\x05\ \xa3\x7b\x76\x09\x3c\xf1\xe5\xc6\x76\x21\x01\x7c\x01\x74\x61\x40\ \xb6\x23\x68\x18\xc9\xc5\x63\x66\x4a\x94\x46\xf1\xb0\x14\x3f\xcb\ \x85\x35\x4d\xb6\xb9\x6a\xf7\xa7\x8d\xb2\xb5\x88\x5e\xfa\xe0\xea\ \x4e\xfa\x99\x83\x5f\x11\xff\x5b\xa1\x47\x71\x75\xda\x1b\xc2\xec\ \x75\x12\x1d\x20\x65\xc8\x54\xef\x9c\x23\x9d\xf7\x69\x00\xeb\x3e\ \xdc\xeb\xf2\x79\xd3\xcf\x5d\x35\xea\xcf\xcd\x6b\xd0\xfd\xbb\xe9\ \x08\x9d\x04\xf3\x3c\x59\x91\xce\xd8\xfb\x28\xe0\x49\x00\x4b\xf0\ \x0e\x8a\x21\x51\xc5\x60\xd4\x76\xe6\x12\xc4\xbc\x85\xa1\x7f\x87\ \x73\x66\xbd\x1a\x7a\xc2\x14\x7d\x31\xf9\xaa\xda\x5f\xa4\x13\x05\ \xf8\x57\x1d\x98\x1c\xe2\xf0\x88\xa5\xfc\x4b\x94\xfc\xa3\x78\xe4\ \x6e\x35\x96\x7b\x43\xd5\xe3\x2f\x6b\xdf\x10\xf2\xe3\xc5\x35\xf2\ \xcd\x57\x66\x99\x58\x6e\x15\xdb\x1a\x1e\x66\xd1\x14\xa0\x8b\xc1\ \x39\x05\x60\x41\x81\xdd\x8d\x6c\xc1\xb0\xb1\x96\x0e\x07\x21\x36\ \x39\xf5\x1e\x25\x41\xe4\x56\xbe\x2f\x66\xe5\x31\xde\xdc\xc5\x03\ \xe0\xe6\x73\x54\x02\x97\xd1\xbe\x33\x17\x30\xb2\x7a\xe3\x3a\x37\ \x93\xbc\x2d\x13\xcd\xb4\xa2\x6a\x9a\xb6\xf2\x44\xb4\x3a\x71\xc5\ \x45\x2f\xbc\x36\x39\x7e\x12\x57\x15\xfb\x45\xef\xb9\x1d\x23\x75\ \xc0\xe9\x06\x67\xda\xaf\x7d\x9d\x7b\x6d\x1e\xe8\x54\x37\xcf\x54\ \x07\xcf\xe7\xb1\xb8\xd1\x8f\x54\x15\x87\x7e\x2c\xe6\x49\x85\x74\ \xb8\x59\x6a\xe1\x51\xdb\xf9\x6b\xc9\xa5\xe7\x2d\x98\x8e\x21\xf2\ \x33\x64\x14\xee\xbc\xd1\x20\xec\xb6\xe9\x76\x32\xaa\xcc\x2d\x51\ \xd9\x11\xdf\x5a\x61\x41\xb1\xf0\x02\xc7\x0a\xc8\xf2\x78\x98\xe2\ \x12\x2e\xf4\x6f\x9a\x89\xa5\x9c\xf0\xec\x52\x82\x89\xcd\xa2\xa9\ \x58\x56\x86\xa5\x25\xa8\xed\xd4\x84\x4a\x7b\xce\xc4\x4a\x7d\x91\ \xc8\xbf\xa3\xd8\x38\x66\x60\x37\x9f\x53\xf7\x3d\xc6\xec\xd6\x44\ \xe6\xff\x42\xa3\x32\xc3\x70\x69\x97\xd9\xbc\xa0\x87\x3c\x99\xb5\ \x7a\x4d\x3b\x38\x9e\x92\x11\x19\xba\x09\x43\x4e\xea\xe1\x79\x7d\ \x81\xf5\x46\x83\xf3\x2a\x52\x94\xd7\x42\x0b\x80\xa4\x81\x36\xa9\ \x58\xcf\xf5\x0f\xa7\x75\x6c\xba\xb4\xe8\xa3\x64\x83\xcc\x87\x98\ \xb7\x28\x74\x57\x5a\x7a\x2b\xaf\x5e\x12\xcc\xd7\xf9\x8a\xd3\xdf\ \xf3\xa3\x8c\xd2\xb9\x8d\xcf\x8f\x1e\xd3\x8b\xe2\xcc\x36\xd9\xf9\ \xc0\xdf\xa1\x53\x4e\x8e\x2e\x6b\x9a\xc3\x04\x0b\x37\xf2\x3e\xed\ \x91\xc5\x02\xc7\x04\xf5\x86\x90\x13\x20\xc6\x79\xa5\xb5\x31\xa0\ \x98\x55\xc8\x88\x82\x02\xae\x7c\x2c\xa5\x86\x64\x59\xe1\x53\x2e\ \xcc\xb0\xaf\xee\x89\x50\xab\x2d\xd6\xd0\xd2\x08\xd4\x6f\xe9\xf6\ \x5a\xd6\xd9\x1b\x62\xbf\x51\x4f\x85\x6e\xf5\x26\x29\xcf\x0b\xdf\ \xce\x63\xe1\x04\x43\x74\xba\x2a\xa7\x61\xe8\xbb\xc9\x71\xb7\x1a\ \xf3\xcb\x06\x7e\xb2\x86\xec\xa3\x52\x2e\xe7\x45\x14\x25\xb8\xf5\ \xa6\xdd\xd7\xe5\xe3\xea\xb5\x85\xf3\xa2\x92\x69\x00\xeb\x3a\xf9\ \xa3\x02\x13\x12\x9c\x69\x20\xeb\x00\x46\x15\x0b\x7c\xf4\xe7\xc9\ \x4c\xb8\xf4\x3e\x7e\xd1\x53\x19\x6d\xd9\xbe\xaf\x16\xa1\x7b\x76\ \xc4\xf1\xd0\xc2\xe3\x0a\xa7\x7d\x39\x53\xa6\x24\x01\x6c\x96\x7b\ \x6a\x98\xfd\x02\xc7\x84\xf9\x65\xda\x23\x8b\x46\xde\x27\xcc\x2f\ \x4f\x3b\xc5\x9b\x45\x13\x33\x33\xdf\xb8\xd3\x5d\x61\x52\x07\xeb\ \xc0\x35\x8b\xa6\x02\xa3\xbc\xaf\x22\x7e\x29\xb6\xd5\xc1\x3b\x0f\ \xc8\x92\x81\xa5\x2e\x96\xf7\xfd\x8c\x88\xce\x5c\x8c\x1e\x62\x67\ \x32\x89\xde\x63\x7a\xd2\xcb\x75\x01\x83\x56\x35\x33\xc3\xc2\xea\ \xb5\xce\x34\x2f\x43\x26\xec\xa4\xdb\x94\xca\x7e\x65\x52\x0f\xeb\ \x35\x72\xe9\x44\xfe\x79\x57\x89\x79\x85\xab\xf3\xea\x04\xe7\xb1\ \x9d\x9e\x4e\xfa\xbc\x80\x48\xc1\x2a\x71\x8e\xf1\x91\x9e\x83\x79\ \x6e\xb4\xa8\x62\x60\x86\x3d\x06\xc5\x10\x33\xec\x29\x7b\xc2\x0b\ \x02\x42\xb3\xfa\x91\x52\xc2\xe8\x47\x8a\xf9\xd3\x0b\x2c\x3d\xcd\ \x55\xbf\xdd\x28\xf8\x6a\xac\x86\xaa\x7a\xf6\x77\xd4\xd4\x2d\x39\ \x57\x0f\x44\xa5\x4b\x98\x5f\xa6\x5c\xec\x61\xac\x64\x69\x8f\x2c\ \x95\xf2\x99\x70\xa0\x4a\x0f\x82\xd4\xc0\xf3\x40\xa7\xd8\x3a\x36\ \xd6\xa4\x04\xf1\xec\xd2\xf4\xfd\xb1\xe1\x97\xd8\xff\x1a\x49\x91\ \xfe\x7c\x9d\x81\xe5\x7d\xb3\x7f\xc5\xd5\x9e\xa5\x0e\x9c\xbc\xbc\ \xcf\x6b\xa4\x9d\xbe\xcc\x59\x55\x53\xa5\x3f\xa6\x6f\x7d\xa7\x80\ \xeb\x4c\x12\x46\x87\x04\x64\xba\x87\x82\x64\x4e\xe9\xad\x78\x9e\ \xd7\x21\xed\x5f\x4e\x97\x52\xcd\x73\x8b\xa5\xa3\x6f\x33\x69\x94\ \xa9\x36\x5e\x69\x40\xcb\x1c\xe7\xef\xc5\x90\x9b\xc7\xc8\xa1\x59\ \xc5\xce\x64\x12\xa0\x95\x60\xfe\x28\x36\x5e\xaa\x3c\x5f\x13\xcf\ \x1b\x95\x06\x60\xad\xbf\xc0\xa7\x6f\xaf\x50\xb9\x5b\xa7\x76\xe5\ \x2b\x26\x96\x03\x1e\xd5\x64\xa7\xbe\x90\xae\xe5\x4f\x94\x60\x6b\ \x8d\xdb\x77\xee\xf3\xd9\xcd\x12\xa5\xc5\xca\xb4\x53\xfc\x34\x20\ \xc1\xb5\x06\x56\x1a\xe8\xd2\x28\x93\xfb\xea\x9f\xa1\xbb\xd1\xd2\ \x9f\xad\x33\xf3\x3c\x89\x61\x66\x4a\x53\xf0\x66\x4a\x94\x8a\x05\ \x5a\x65\xe3\xda\xa4\x98\x8f\xd2\x63\x12\xc0\xf3\x58\x78\xe2\x0f\ \x67\xda\x01\xe8\x80\xd4\x2b\x7c\xd3\x63\x76\xe7\x31\x70\x5a\x23\ \x26\x7a\x65\x68\xef\xb9\xce\x00\x4d\x4b\x88\x99\x56\x05\xda\x02\ \x48\xef\x2f\x13\x6c\xce\x31\x54\xc5\xf2\xf3\x58\x78\x50\x0c\x31\ \xfa\x11\x46\x3f\xc2\x0b\x82\x84\x14\xf8\xeb\x24\xfe\x48\x9d\x2e\ \x17\xe2\x75\x6e\x3d\x69\x5f\xe8\xb2\xce\x3f\x7a\x8c\x1b\x8c\x58\ \x08\x97\xa8\xde\x14\xd3\xa6\x26\xc3\xf7\x13\xb3\x0f\x27\xfe\x90\ \xee\x55\x9b\x17\x4b\x0d\xbe\xb8\xf5\x80\x2f\x6e\x3d\x60\x73\xbd\ \x4c\xf9\xd3\x2f\xf1\x23\x0f\x3e\x2f\x70\x62\x16\xcd\x84\xfe\xd5\ \x19\x30\x6d\x80\x5d\xf7\xdc\x75\x9a\xf7\x3a\xf0\xce\x63\xfb\x34\ \x90\x81\xff\xaf\xb3\xab\xeb\x71\x1c\x4b\xcb\x8f\x3f\x52\x89\xed\ \x38\x76\x52\x55\xdd\xd5\xbd\xdd\x3d\x3d\xd5\x3b\x2b\xcd\xdc\xec\ \x0a\x84\x84\xd0\x08\x81\x10\xdc\x00\x17\x08\xc1\x25\xab\x15\x3f\ \x8a\x0b\x7e\x01\x3f\x61\xaf\xd1\x0a\xd0\x22\x56\xa3\xd5\xd0\x30\ \x3d\xd3\xd3\x1f\xc5\x54\x77\x57\x25\x71\xe2\xd8\x49\x2a\x8e\xcd\ \x85\xfd\x9e\xbc\xe7\xe4\x1c\x27\xbd\x96\x4a\x49\x1c\x97\x93\xd8\ \x8f\x1f\x3f\xef\x37\xc6\xab\xa6\x4d\xd6\xed\x16\x0b\x3c\x97\xc0\ \xcb\x0d\x23\xe9\xea\x66\xd1\x39\x77\x60\xd7\x43\x06\x07\xfb\x5d\ \x3f\x67\x49\xdd\x15\x5d\xe7\x9e\x6a\x9b\xa8\xa4\xba\xd7\xa2\x96\ \xdb\xad\x64\x74\x2a\xd5\x29\x3a\x26\xd5\xbd\x56\x93\xfb\xdb\x3e\ \xe7\xee\xee\x1a\xf7\x50\xe1\x26\x05\x4e\xed\x61\xab\x3b\xcd\xcf\ \x6d\xe1\x4a\xf3\x73\x5b\xf2\x11\xab\xc1\x0e\x93\xa4\x20\x1d\x4c\ \x1e\x0c\xd3\x9d\x45\x92\x6f\xa5\x05\x34\x4d\x51\xfa\x17\x16\xa6\ \xd3\x04\x63\xfb\x46\xe4\xc8\x74\x7a\x5f\x88\x9c\xe2\x00\x27\x82\ \x8d\xdf\x9c\x2c\xf1\x38\xa8\x30\x18\x0d\xf0\x69\xff\x1c\xbf\xef\ \x04\x88\x7e\x14\x34\x77\x0a\xca\x5f\x60\xac\x49\x20\xca\x2a\x0f\ \xe5\x36\xd3\x4a\x0b\x0e\x46\x13\x7b\x9b\x24\x03\xdf\x77\xdb\x32\ \xec\x2c\xd1\xeb\x55\xb0\xe3\x33\xbc\x7e\xd1\x95\xd8\xb0\x93\x16\ \x72\xbe\xac\x26\x49\x9e\x32\xd4\x86\x1a\x39\xc1\x07\x0f\x9a\xdc\ \x59\x6d\xc1\x0c\x5d\x7f\x85\xb6\x5c\x02\xae\x89\x75\x40\x36\x25\ \xd3\xa8\x91\xb9\x36\x6f\x46\x69\x0f\x30\x77\xfb\xe8\x0e\xfb\x18\ \x97\xd3\x83\x49\x3e\x7e\x6e\x4b\x46\x9c\xc9\xf5\x66\xb3\x8b\x9d\ \x3f\xae\xa7\x0b\x8c\xa2\x91\xf0\x82\x1c\x23\x61\x22\x7b\x20\x6c\ \x94\xc5\xbb\x0a\xb1\x95\xe0\xb4\x3c\xc7\xe3\x5e\x9d\x30\x9f\xdc\ \x7e\xa5\x77\x71\xbe\xbf\xc2\xcd\xec\x5b\x54\x2b\x0b\x3d\x58\xc8\ \xbd\xa0\x69\xba\x0d\xbd\x9c\x90\x4e\x68\x18\x1e\x05\x4e\x1d\x5b\ \xb7\xc9\x12\x21\x17\x0c\x0c\x4e\xeb\x57\x2b\x0b\xdd\x55\x61\x4c\ \x7b\x54\xcb\x8e\xf8\x42\x29\x96\x3a\x16\xe6\xe5\xe6\x87\xa2\x5b\ \x5c\x4e\xb4\x01\xfc\x90\x05\xaf\xf6\x66\x30\xb5\xa0\x6d\x03\x83\ \x29\xe0\xc0\xc1\x7c\x48\x4a\x70\x20\x7b\x8e\x23\x5e\xe7\x7e\xa9\ \xdd\x9e\x17\x00\xf0\x7d\xd3\xc5\x62\xa5\x15\x4e\xed\xa1\xd6\x87\ \x2d\xce\x67\x79\x02\xcc\x6b\x77\xe5\x68\xbe\xbb\x70\xd6\xf1\x05\ \x56\x41\x0a\x6c\xde\x8a\xb0\xb3\xd4\xb8\x1b\x27\x98\x0c\x9c\x5d\ \xd2\x10\x80\xfe\xd2\x97\x71\x74\xe8\x44\x50\x1f\x0a\x2e\x33\x38\ \x38\xdb\xbc\x0f\x6d\x12\x43\x27\x2f\x74\xeb\x9d\x6e\xff\xa3\x4f\ \x28\x19\x73\xe5\x20\xde\xab\xd1\x22\x6b\x57\xa7\xa5\xdb\xc0\xc3\ \x5d\x62\xba\xd0\xb2\x09\x54\x26\x69\xa0\x93\x1c\x3a\x3d\x7d\x28\ \xc0\x70\xcc\x05\xa8\x33\xe4\x48\x13\xab\x12\x43\xf5\x19\x5b\x41\ \x6a\xbc\xc0\x28\xa2\x57\x85\x16\xc6\xe5\x54\x44\xea\xb4\x9a\xb8\ \xe9\x9a\x19\x57\x16\x6e\xcb\x54\x14\x1e\x58\x8b\x0a\xae\x7d\x01\ \x74\x1e\x0b\x26\x56\x67\x4a\x47\xf6\x00\xef\x93\x29\x7e\x58\xd5\ \x44\xb2\xf0\x72\xf4\x4f\x4e\x76\xe3\x0e\x4c\x7e\x59\x93\xa1\xc5\ \xb7\xe5\x52\xc3\xe4\x07\x36\x01\xd8\x24\x47\xf8\x7a\xfa\xbc\xe5\ \x2a\x41\x55\x7d\x85\xc5\xed\x44\x5b\x11\xa1\xde\xea\x46\x76\x85\ \x2d\x22\x0c\xed\x4a\xf4\x09\x16\xbf\xb3\x78\x2f\x9a\x9e\x1c\xcb\ \xa0\x1c\xb8\xbc\x01\xe2\x31\xc1\x0a\x9d\x34\x30\x19\x83\xba\x10\ \xef\xa1\x7c\x08\xca\x55\x38\xd6\xad\x46\x86\x1c\x01\x3a\x4b\x4b\ \x01\xdc\x05\xaa\x3d\x4d\xac\x2b\xc3\x22\x29\x41\x5d\x82\xb8\x0c\ \xe1\x79\x13\xf4\x3b\x85\x6b\x6d\x6e\x69\x35\x76\x95\xbe\x16\x9a\ \x38\x3e\xfb\xe9\x3e\x81\xb8\x3d\xcc\x5e\x4d\x61\xe3\x05\xfc\xa5\ \x5d\x8f\x3e\xb0\x73\xb1\x4f\x5b\x07\x56\x93\xa1\xa5\xbe\xe6\x72\ \xc0\xe4\x6d\x38\xa4\x8f\x4d\x40\x27\xcd\xbc\x5d\xdf\xe0\x7f\x92\ \x7b\x62\x06\xb0\xc9\x88\x53\xd7\x39\x4d\x37\x64\x92\x13\xb3\x64\ \x86\x69\x69\xed\x0d\xe1\x3e\x74\xfb\xe7\xc0\x55\xf5\xb0\x4e\x27\ \x9a\x7c\xb9\x52\x89\x94\xc6\x43\xa1\x0b\x39\x1f\xca\x0f\xa6\x85\ \x3c\x12\x26\x39\xa2\xa6\x54\xf2\x10\x73\x1f\x96\xa4\x8b\x89\xa1\ \x4d\x99\x6c\x5c\x4a\x10\x80\xb9\x51\xc8\x7d\xd5\x54\xc9\x2d\xec\ \x86\x66\x56\x34\xff\xae\xf5\x50\x19\x08\x4d\x4c\x8d\x05\x33\xdc\ \x21\x73\x1f\x89\x74\xcc\xe8\x74\x88\x45\x72\x89\x13\x7f\x52\xf7\ \x27\x5e\xb9\x40\xaf\xd8\x97\x13\x2a\x58\x0f\x81\x51\x35\xd0\xd2\ \xc2\xac\xad\x0f\x19\x7e\xba\x0b\x20\x74\x6d\x2c\xe1\x88\x68\xdd\ \xa1\x88\x11\xdd\x7a\xa2\x38\x92\xc0\x4b\x60\xb6\xe7\x89\xdc\xb1\ \x11\xfa\xea\x08\xde\x9c\xf0\x90\xc1\x67\xca\xf1\x35\x05\x2e\x78\ \xd4\x4e\xa7\xc7\x8f\xc9\x44\xe3\xeb\x88\xf9\x78\xd2\x8d\x29\x3a\ \xc7\x75\x30\xf9\x81\xe9\xf5\x02\x15\x82\xd0\x86\x9f\xdb\x22\x7b\ \x4d\x05\x3d\x81\x76\x3d\x5d\xec\x35\x5b\xa1\xe7\x04\x50\x5e\x38\ \x1b\xf4\x3b\x52\xab\xd7\xb9\xdb\x17\x9d\x7d\xd2\x7c\x86\xc5\xdd\ \x9d\xd0\xc4\x70\x2f\x77\x43\xd5\x8b\x97\x08\x58\xda\x42\x55\xbe\ \x44\x52\xc5\x20\x8d\xd8\x2f\xfd\xda\x4f\xcc\xa5\x81\xca\xc4\x3a\ \x66\xe6\xa0\xa5\xff\x21\x16\xe7\x6c\xae\xfb\x5f\x75\x5d\x1b\x23\ \x93\xe4\x28\x9c\x21\xc6\xaf\x5c\xdc\xac\xbf\x16\x09\xf1\x04\x34\ \x35\xb9\x66\xd0\xcf\x05\x03\x73\xf0\x4e\x4b\x0b\xd3\xd2\x92\x58\ \xd0\x94\xa3\xa0\x1a\x89\x26\xd9\xa1\x36\x25\x31\xe5\x2f\xe8\xa4\ \x0f\xaf\x34\x69\xd3\xf9\xc7\x48\x14\x62\xbe\x7b\xa8\x8e\xce\x54\ \xb3\xd2\x4a\xd4\x2e\x02\x40\xd6\x0c\x55\xcc\xd2\x12\xb9\x5f\x4a\ \x12\x41\x65\xe3\x2a\xb4\xf6\x52\x34\xf9\x42\x17\x13\x97\x4d\x62\ \x74\xef\xa0\x42\x1c\x87\x75\xdf\x3a\x40\x8c\x32\xd8\xe6\x1e\xe6\ \x1f\x80\x37\xf3\x7a\xbf\x34\x8f\x5a\x32\xc6\xc7\x53\x56\xba\x5f\ \xdf\x95\xcb\x6a\xb1\x1f\xb1\xe3\x4c\x5c\x6e\x33\xac\x9c\x07\xe2\ \x39\x25\xe3\x98\x34\xb3\xee\x71\x2f\xf2\xe6\x1c\x17\x45\x22\x56\ \x0f\xfc\x1e\xec\x74\xbc\xe7\x21\x20\xa0\xf1\x6e\x36\xc4\x00\x94\ \x27\xcc\xbd\x12\xd5\xbc\x12\x65\xf7\xc7\x30\x27\x67\x60\xb5\x5a\ \x58\xcd\xef\xd5\xb9\xcb\xa6\xeb\xb9\x36\x02\xa7\x7e\xd6\xa1\xd4\ \x46\x1d\x90\x4d\xf2\xa3\x2d\xe4\xcc\x75\x2f\x31\x67\x1f\xb5\x1e\ \x26\x90\xda\x7e\x65\xcc\xad\x38\x74\x17\x54\x2f\x16\x0a\xb6\xf0\ \x1e\xcf\xd4\x5d\x7e\x53\xac\x44\xff\x89\x34\x7a\x03\x0f\xa7\x70\ \x46\x29\x06\xf7\xea\xde\x13\x9b\x0f\xcf\x45\x90\x83\xe7\x50\x44\ \xa7\x43\x3c\xb9\xf3\x90\xe6\x33\xf8\x4d\x94\x38\xdf\xd4\x43\x1f\ \x6d\x1d\x5b\x12\x08\x7b\xdb\xeb\xbd\x9c\x86\x43\x40\x56\xf5\xb5\ \x0a\xe8\x63\x16\xce\xd8\x39\x06\x58\xe0\xf9\x5e\xa4\x8e\x17\x86\ \xf6\xdc\x40\x54\x6b\x88\x26\xe2\xe9\x8e\x8d\x3f\xc6\x0d\x26\xf9\ \x9a\x59\x36\x9a\xc8\xd3\x50\xf4\x2c\x15\xa0\xf2\xfc\x8d\x61\x77\ \xd0\x9a\xa8\xa3\x03\xe4\xb1\x9e\x97\x63\xa2\x94\x7b\xb2\x2d\xb4\ \xb5\xd9\x6a\x41\x68\x0b\x19\xc1\x81\x6c\x62\x61\xdd\xf7\xe5\x7a\ \x1a\x00\x46\xd1\x68\x3f\x9f\x98\x9a\x72\x37\x15\x1c\xd4\x7f\x22\ \x9c\x3d\xc1\x12\xe3\x5a\xdf\x36\xde\x89\xce\xbd\xcf\xb5\x61\xfd\ \xd9\x76\x86\xbb\x7b\x75\x7b\x57\xca\x7c\x13\x86\x9d\x0a\x3c\xdb\ \x09\x5a\x59\x15\xa8\x13\xd5\xf9\x63\x9b\xf1\xf7\x31\x80\xe5\xa0\ \xa7\x7d\x2f\x57\x09\x5e\xbf\xe8\x4a\x4c\xcc\x7b\xad\xf1\xdb\x96\ \xea\x13\x8e\xe2\x08\xe9\xa2\xb7\x37\xb3\x58\x3d\x31\x6a\x6e\x00\ \x35\x64\x59\x15\x19\x2a\x27\x6c\xad\x6d\xa3\xfe\x13\x62\xe2\x53\ \xc3\xc4\xea\xc9\xd5\xb5\x5a\x35\x19\x74\x2a\x60\x8e\xc9\x37\x6e\ \xf3\x31\x9b\xd2\x2e\xad\xb4\x12\x00\x0f\xac\x4c\xfc\x71\xe3\x8e\ \xf6\x69\x0a\x65\xf3\xf0\xb4\x95\x56\x7b\x41\x96\x41\xb1\xa8\xbb\ \xcd\xb3\xa0\x50\x69\x0f\x44\x62\x7c\xe8\x47\xf0\x86\xf5\x7b\xd6\ \xfd\x8e\xf0\x29\xd3\xa8\x31\x00\xb0\xab\x39\x22\x27\xc2\x03\xab\ \x80\x87\xd3\xba\x91\x20\x73\xdd\xd9\x6d\x40\xe2\x8f\x92\x5b\xad\ \x61\xe5\x36\x76\x3e\x96\x85\x4d\xe0\x4f\xdd\xfa\x87\x79\xbd\x58\ \x62\x61\x5d\x57\x47\xea\xde\x23\x5f\x69\x35\x1b\x17\xfe\x5a\x78\ \x24\x4c\xc5\x97\xaa\xcb\x27\x9d\xee\x32\xd5\xac\x6d\x6a\x94\x01\ \xc4\xda\xab\x22\x83\x33\x8c\x04\x83\xf7\xcf\x46\xe2\xe4\xea\x12\ \x7e\xd4\x0b\xc1\xf4\x5c\x17\xbc\x38\x54\x1c\xba\xd7\xe1\xbd\x69\ \x98\xcd\x41\x29\xb4\x71\x90\x0a\xb6\xcd\xaa\x00\x0b\x00\x55\x16\ \x0a\x83\x8f\xef\x53\xf5\x80\x50\x24\xaf\xcd\xfb\xc1\xf3\xb8\xd5\ \x0c\xb6\x51\x54\x03\x31\xb6\x12\x5c\xc4\x0f\x1b\x89\x53\x4f\x26\ \xe8\x8c\xba\x3b\xe3\xae\xd1\xc3\x3f\xfb\x7c\x84\xde\x27\xcf\xe4\ \xa8\x6b\xd3\xe3\xc3\x2e\xb7\x19\xa6\x9b\xa6\xc6\x6c\xe3\xed\x19\ \x66\x5c\xcf\x92\x4e\x56\x0d\x3b\xf5\xaf\x8d\x6d\xdb\x0c\x3f\x75\ \x7d\xea\x04\x48\xfe\xf7\x4a\xb0\x9b\xe9\x24\xaa\x00\x9e\x25\x33\ \x31\x8a\xcb\x9e\x27\xda\x72\xa2\xb6\x25\x1c\x76\x44\xe1\x69\xe5\ \x84\x98\xae\xe7\xa8\x9c\x50\xea\xe9\xa6\xea\x67\x5e\xa8\xba\xb8\ \x9d\xec\x49\x13\xf5\xf6\x7f\x6c\x95\xb3\xca\xde\x26\xa3\xd4\xc4\ \xcc\x54\x9d\x41\xc0\xa5\x3b\xc4\x02\x75\x24\x6e\x01\x26\x2f\xb2\ \x50\x44\xed\x74\xee\x35\x1e\xcc\xa0\x48\x9e\x49\x37\xab\x44\x43\ \x4c\xdc\x71\x7b\xe8\xb9\x01\xbe\x7f\xf9\xc3\xee\x77\x01\xf8\x9c\ \x0d\x02\x4d\x92\x54\xcc\x09\x21\x36\x0e\xee\x3f\x42\xf7\xec\x44\ \x74\x01\x02\x00\xa7\xc9\x36\xb4\x6d\x27\xc0\x13\xab\x40\xb9\xcd\ \x30\xec\xd4\x01\x06\x02\x35\x67\x47\x4a\xc6\xf1\x31\x17\x60\xa7\ \x6d\x49\x82\x70\x29\x62\x02\xb0\xca\xbc\x6d\xbe\xe9\x55\xba\xc1\ \xdb\xd5\x35\xd2\xab\x97\xc2\x33\xc1\xbd\x02\x34\x89\x48\xa6\xd1\ \x06\xd4\xe1\x2e\x47\x42\x57\xe7\xd6\x6a\x54\x4e\x37\x12\x38\x3d\ \xc7\xc1\x76\x3a\x43\xff\x6c\x64\xd4\xcf\x1c\x58\xbc\xf7\x9b\x8e\ \x41\x75\xfe\xed\x36\xcd\xae\x6e\xdf\x16\x1c\x31\x7d\x2e\x67\xe2\ \xe5\x76\x0b\xdb\xaf\xa4\x47\x8a\xd6\x95\xb9\xa5\xf5\x13\x93\x57\ \xc3\xc4\xba\x26\xf0\xaa\x9d\xe3\x37\x93\xb5\x08\xce\x90\xb7\xe1\ \x7c\xd4\x81\xfb\xf0\x3e\x2e\x43\x16\x6e\xe6\x29\xaf\xb1\x8d\xcb\ \xa7\x4f\x11\xfa\x35\x59\xd1\xd0\x19\xda\xa7\x5d\x6e\x33\xbc\xa9\ \x5c\x09\x54\x34\x8c\xdc\xe4\x5d\xa0\xf7\xc7\xab\x12\xa7\x3d\x5b\ \xcb\xae\xe3\x55\x89\xb0\xe8\x68\xe5\x84\x6e\x7b\x95\xf1\x29\x29\ \xe9\xd5\x7f\xfc\x37\x92\xdb\xaf\x76\x1d\x21\x99\xf6\x34\xc9\x08\ \x62\x62\x0a\x7a\xb4\xb1\x30\x6f\x61\x4a\x07\xdc\x73\x1c\x09\xc8\ \xa2\x69\x34\x63\x5b\x1d\x38\x4d\xef\xa9\xcc\xad\x26\xc6\xb7\xe9\ \x5a\x3e\x35\x95\xeb\xec\x63\x42\xcd\x94\xac\xce\x41\xe7\x39\x8e\ \xa4\x63\xcb\x7c\xe7\x27\x26\xaf\x05\x07\x28\xff\xcc\xee\xb0\x2f\ \x12\xe7\x4d\xe0\x35\x1d\x17\xd2\xaf\x99\x7d\x87\xb9\xdb\xc7\x74\ \x36\x13\x49\x3d\x6f\x5f\xbe\x07\x92\x7a\x9f\xe1\xa3\xcb\xfa\x5c\ \xcf\x2d\xc9\x1b\x95\x4d\x5e\x20\xcd\xeb\xe3\xef\xfa\x1e\xb6\x6c\ \xfc\xaf\x7c\x89\x27\xbb\x94\x45\xce\xc6\xd3\x8d\x27\x01\x97\xc0\ \x36\xec\x2c\xf7\xf4\xf3\x78\x55\x8a\xf7\x52\x77\x63\xf4\x1f\x9b\ \xc0\x4d\xfb\x2f\x9c\x21\x7e\xfb\xd5\xaf\xa5\xf9\x14\x1c\xc8\xa6\ \x89\xf2\xb3\xa4\x4e\xfa\x99\x34\xc7\x7e\x52\xb6\x57\x3b\x70\xc7\ \x3f\xf5\x28\xa3\x5e\xc0\xe9\x74\x23\xf5\x2e\xd3\x55\x90\xe8\xc0\ \xcb\x53\x13\xb9\xe1\xa8\x1a\x80\x87\x5c\x6f\x9c\xe9\x8b\x79\xa9\ \xcd\xf1\x6d\xbb\x68\x54\x23\x8e\x83\x92\xfc\xc4\xc4\xc4\x7d\xec\ \xb6\x25\xd7\x1b\xe5\x53\xa8\xbf\xab\xca\x42\x2d\x78\x75\xe7\xc4\ \x24\x73\x86\x51\x84\x37\x3f\x2c\xf1\xcd\x2b\x07\xd3\x69\x82\x22\ \x5f\x8a\xea\x8e\x7a\x0e\x78\x25\x6a\x1a\x89\xb5\xd7\xb7\x77\x28\ \x72\x17\x45\xbe\x84\x43\x21\x6d\xf2\x13\x13\x40\xa7\xc1\x4e\x4c\ \x8b\x75\x0a\x80\x9f\x58\xc5\x4e\x3b\x37\xa0\x27\xe0\x11\x8b\x1b\ \x83\x26\x49\xbc\x97\x2b\xac\x3e\x17\x92\xe6\xe6\x46\x04\x39\xc8\ \x33\xc1\xdb\x38\x71\x16\x1e\xd9\x9e\x08\x66\x94\x83\x18\xb3\x64\ \x06\x07\xcd\x4c\xe5\x23\xb4\x30\xf7\x04\x78\x8e\x83\xc5\xed\x04\ \x9e\xe3\x48\xae\x32\xea\xef\xa6\x7a\x1b\x54\xef\x01\xe5\x14\xd0\ \xfe\xee\xee\xae\x85\x5f\xd4\x54\x2f\xf7\x31\x52\x47\xc7\xc2\x6a\ \x6f\x0d\x2e\x21\xd4\xe8\x1b\x4f\xbf\x24\x16\xa6\x8b\x83\x00\x4c\ \x2e\xb7\xe5\x76\x2b\x19\x81\x3c\xeb\x4d\x07\x50\xb5\x7b\x3c\xfd\ \x51\x47\x20\x7e\xec\x6e\xcb\x14\x9d\x41\x0f\x0f\x7b\x05\xfc\x4e\ \x17\xae\xef\x89\xea\x8e\x4d\xe8\x8a\x2a\x90\x4d\xe8\x8a\xfc\xe3\ \x9a\x85\x8b\x66\x9e\xdd\x52\x61\xe2\x44\x49\x1a\x67\xaf\x87\x9d\ \xa5\xc4\xca\xa9\xbb\xc1\x30\xeb\x4a\xa0\xa7\x6d\xc2\xa2\x23\x19\ \x89\x7c\x5f\xd3\x8d\x07\xc4\x89\x00\x2c\xdf\xaf\x90\x2f\xcd\xb6\ \x54\x9f\xf7\xf5\x8b\x97\xcd\x60\xee\x70\x2f\x5a\xc6\x17\x5e\xb5\ \x6c\xcf\x13\x91\x04\xcf\x7b\x1a\xb7\x2d\x9c\x39\x97\xdb\x2d\x86\ \xdd\x81\x30\xe2\x74\x8d\xab\xd5\xb4\x47\xee\xfe\xe2\x21\x5e\xd5\ \xc3\xa0\xba\xca\x78\x9e\x6e\x9b\xdc\xd1\x31\x35\xff\x0e\x04\x42\ \xd5\xe8\x35\x95\xdc\x7b\x8e\x03\xdb\xaf\xa4\x80\x07\xb9\xd5\x82\ \xd0\x16\xc1\x11\x62\xe1\x2a\xb4\xe0\xa4\xb2\x8c\x30\x75\x16\xd2\ \x1d\x6f\x6e\x10\xf2\xf7\x29\xf4\x3c\x9f\x6d\xb1\xcd\x3d\x89\x89\ \xa9\x8e\x52\xf5\x19\xd7\x4c\xec\xa2\xf0\x7b\x58\xa1\xaa\x99\x98\ \xc0\x35\xdd\x78\x78\x68\x25\xe0\xaf\x09\x58\xc3\xce\x52\x7a\x44\ \x5c\x77\xc9\x89\xf3\x44\xda\x86\xdc\x62\x61\xd1\xc1\xb0\xb3\xac\ \x7d\xbd\xcd\xb6\xc4\xb0\x62\x7d\x12\xe3\xb4\x67\xcb\xc0\x0f\xd6\ \xe2\xf9\xfa\xf5\x02\xe9\xd5\x4b\x6c\x42\xb7\x9e\x13\xcd\x0e\x1e\ \x6f\x88\x0d\xd4\x15\x0c\x43\xbb\xc2\x30\x6b\xa2\x4f\x4d\x17\x9f\ \x0f\x49\x75\xf0\xd6\x46\x27\x9b\x9f\x60\x95\xd1\x78\x78\x5b\x6d\ \x72\xa2\x73\xfc\x4f\xd7\x73\xb1\x4f\x62\x61\x9d\xaf\xf7\xa4\xe9\ \x58\xa9\xfa\x94\x55\xc0\x91\x67\x86\x03\xfa\x90\x71\xa7\xcb\x6d\ \xa0\xd7\x64\xc8\x91\x06\xe6\x79\x14\xdc\x77\x4c\xdb\x02\xc0\x26\ \x8a\x85\x37\x42\x0d\x7a\x98\xc2\xee\xf7\xb0\x33\x04\x79\x5e\x8a\ \x64\xc0\xe3\x05\x96\x18\xa3\xc2\x04\xd1\xb8\xc0\x93\xc1\x02\x71\ \x1c\xd6\x4c\x3c\xdf\x7d\xf7\x7c\xba\x82\xb3\x7a\x25\xd8\xb8\xd3\ \x74\x8c\x92\x34\xf1\xb0\xb3\xc4\x0f\x55\x2c\x58\x31\xce\x77\x80\ \xae\x57\xb0\xc7\x86\x31\x13\x3f\x16\xeb\x38\xab\xbe\xa9\x5c\x20\ \x89\x05\xa8\xa7\x1b\x0f\x48\x62\x90\x3b\x2f\xeb\x9e\x88\xfd\xa5\ \x8b\x40\x7c\xe6\xb0\xb3\xac\x2f\x06\x27\xd8\x95\xab\xa4\x85\xf9\ \xb6\xfa\x61\x04\x60\x2a\x45\x75\x48\x62\xf0\x4e\x3e\xba\xe2\x51\ \xf5\x64\xab\xc6\x0a\x9f\x67\xa1\x03\xa0\x3a\x70\x85\x77\xa4\xe7\ \xda\xd5\x94\x3e\xc9\x3f\xbb\xad\x9e\x8d\xbe\xab\x3b\xb0\xb5\x17\ \x98\x2e\x24\xdd\xa6\x45\xa9\x7e\x8e\x7a\xae\x99\x32\xdd\x4c\x59\ \x6c\xc7\x32\x30\x65\xb4\xd1\xfe\x74\xc3\x1a\x01\x20\x9d\x00\xeb\ \xdb\x3b\x3c\xff\xb0\x5b\x77\xb3\x5d\xd6\xe3\x31\x06\x95\xe8\x38\ \x5f\xdd\xdd\x4a\x6c\x4c\xe7\x37\x28\x4f\x60\x13\x58\xab\xd9\x5a\ \x32\xe4\xac\xea\x3e\x86\x9d\x65\xbd\x3e\x89\xa5\x6d\xb8\x8c\xa8\ \x66\x6b\xa1\x9b\xf9\x73\xa1\xaf\x1b\x96\xe6\xff\x43\x7a\xba\xdc\ \x66\x98\x06\xeb\x5a\x27\x33\xd9\xb1\x4a\x37\x42\x0f\xab\xbd\x1f\ \x82\x7e\x47\x00\x75\x75\x6f\xe7\x8f\xa5\x64\x77\x0a\x35\xeb\xe6\ \x7c\xa8\xc6\x12\x3f\xe0\x6a\xc0\xc3\x04\x5c\x93\x1b\x8c\x33\xa6\ \xee\x7d\xce\xda\xc7\x74\xb1\xe4\xdf\x55\xd5\xe3\x6d\x81\x91\x43\ \x2e\xb7\xdc\x2f\xf7\x0a\x43\xb9\xeb\x4d\x8d\xf2\x05\x96\x5c\x37\ \xa7\x76\xea\xa7\x7e\x77\x6a\xdf\x09\x7e\x81\xa8\x13\xaf\x7a\x6e\ \x80\xb3\x51\x84\xce\xa0\x07\xcb\xbe\xc4\xf5\xba\x10\x59\x6c\x6f\ \xe6\x7d\x9c\x3b\x1e\x36\x93\xb5\x48\x8e\x9f\xbb\x7d\x5c\x2f\x2a\ \x91\x14\x0f\x00\x61\x3f\x93\x99\x78\xd8\x59\x0a\x56\x15\x60\x66\ \x8c\x8b\x38\x91\xb6\x91\xc0\x1e\x75\x85\xac\x48\xfc\x58\x68\x5d\ \xa1\x79\xe3\x64\xef\x7f\x54\x23\xb2\xdc\x66\x62\xbb\xd3\x9e\x8d\ \xe5\x2a\x11\x7a\x58\x5d\x28\x4b\x0d\x80\x68\x41\x35\x2d\x2d\x94\ \xc5\x7b\x6d\x29\xd2\xa1\x72\x1d\xdd\x49\xe4\x27\xf3\x10\xe0\x38\ \x33\xf2\x7e\x0d\xa6\x6d\x0f\x75\x83\xd7\x7d\x66\xdb\x76\x1f\xb3\ \x88\x64\xf8\x06\x98\xdc\x73\x91\xfb\x25\xfc\xdc\xde\x63\xe4\xa1\ \xfb\xc9\x9e\xf1\xa6\x16\x26\x70\x03\xd8\x14\x45\xa4\xa1\x3c\x6e\ \xee\xe1\xee\xee\x1a\x5b\x44\x78\x38\xaa\x5b\x53\x3d\xe8\xd6\xb9\ \x13\xe3\xe5\x5b\x3c\xe8\x7c\x03\xb8\x97\x75\xd4\xae\x09\x74\x6c\ \xc7\xff\xb7\xb7\x4f\x92\x13\x41\x79\x02\xdb\x8a\xba\x98\x6e\x3c\ \xc4\x79\xb2\x0f\xe6\x38\x01\xbd\x2f\x69\x60\x0e\x76\x26\x2b\x88\ \xd5\x25\x0d\xdd\x6c\xab\xfa\x9e\xd5\x85\x1b\x8f\xdb\xec\x7a\xcf\ \x23\x41\x57\x31\x01\x95\x06\x25\x72\x0d\x4c\x2c\xbc\x45\xf4\xd1\ \x27\x98\x37\x0d\x51\x83\x15\x6d\xfd\x21\xda\xc0\xac\xbb\x05\x9b\ \x52\x37\x75\xb9\x16\x6d\x6e\xbc\x63\xbd\x18\x5a\x49\x51\x05\x70\ \xcb\x99\x30\xe6\x72\x7f\xe7\xbe\xb3\x82\x54\x7c\x9f\x2c\x2d\x31\ \x99\x4d\x8c\x95\xd3\x04\x4c\x7a\xce\xbd\x32\xfc\x58\xf1\xc1\xf0\ \x94\x3b\x31\x72\x00\x7f\xd8\x83\x1f\x37\xc7\xaa\x61\xe2\xeb\xcd\ \x4f\x10\x14\x57\x52\xd8\x79\xd3\x74\x42\x27\xfd\x4c\x72\xd1\xcd\ \x57\x75\x16\x1b\x81\x31\xf1\x63\x09\x98\x56\xd4\x05\x92\x58\x0b\ \x56\xf1\x3e\x03\x28\x67\x65\x6e\x1c\x56\xb3\xb5\xb4\x6f\xba\x10\ \x54\xc6\xa6\xf5\x81\xdf\xc3\x8b\xcd\x4f\x91\x5e\xbd\x14\x09\xd5\ \xf4\xe3\x79\x13\x14\x6a\x88\x4d\xae\x35\xce\xc2\x6a\x05\xf2\x31\ \x27\x5f\x95\x13\x3a\xad\xa9\xb2\x3a\x4f\xb9\x34\x4d\x33\x32\x25\ \xfb\xa8\x6c\x7b\xc8\x07\x7c\x28\xa0\xa2\x3e\xaa\x1d\x83\xd4\x8b\ \x64\x13\xc5\x52\xa9\x3e\x00\xb8\xe5\x0c\xcf\xce\x9f\xe0\xcf\xfe\ \xe6\x8f\xf1\x57\x7f\xfe\xb7\x78\xf6\xd9\x97\x58\xa0\xc2\x64\x36\ \x91\x59\xb0\x39\x2f\x9b\x66\x3a\xec\x26\x74\xb5\xd3\x92\xd4\x7e\ \x74\x52\x0e\x45\x08\x5c\x3e\x7d\x8a\xfb\x71\x1d\x4e\x06\x80\x59\ \xf1\x19\x46\xe3\xe7\xc8\x70\x87\xce\xa8\xdb\x64\x10\xb1\xd6\x01\ \xf8\x0c\x1e\x4e\x51\xf8\x3d\x0c\xed\xb1\x38\xd7\x76\xe2\xc7\x12\ \xc3\x72\x46\xad\xac\xf7\x42\x22\x70\x30\x73\xff\xb1\xca\xc2\x56\ \xd4\x15\x4c\xfc\xc4\x2a\x60\x45\x5d\xf1\xa8\x03\x3f\xbf\x28\xaa\ \xd9\x1a\xa9\x13\xe0\xd3\xd9\x4b\xc1\xc4\xbc\x13\x4f\x14\x47\xa2\ \x97\x30\x67\x61\xf2\x0d\xeb\x0e\xde\xa1\x5b\xab\x89\x05\x8f\xd1\ \xc2\xdc\xd0\x3a\xc4\xfc\x87\x7a\x4d\xa8\xdf\xe1\x50\x51\xa9\xe9\ \xbb\xea\xa6\x37\xa9\xfb\x26\xd9\xc0\x8d\x37\x4a\x8c\xbf\xff\x78\ \x88\xbf\xff\xbd\x2f\xf1\x77\xff\xf8\x17\xf8\xcb\x5f\xfc\x09\x7e\ \xf6\xa7\xff\x00\xfb\x49\x2c\x7d\x26\x75\xf3\x21\x37\x58\x5c\xd5\ \xf3\x38\xa8\x6b\xa8\xea\x37\xe6\xcf\xe9\x7c\xde\x8f\x87\xb0\x51\ \x4f\x0a\x0d\x47\x17\xf5\x36\xc9\x7f\xe1\xf5\xb2\xbb\xbb\x58\x9a\ \x69\xb4\x3c\xf1\x68\x89\x31\xdc\x7c\x85\x69\xb9\xcb\x66\xb3\xe3\ \x3c\x41\xe2\xc7\xd8\x66\xd7\x20\x40\xab\x8f\xfc\x56\xcf\x19\x95\ \x18\x94\xc0\x4b\x86\xdc\x6d\x92\xe0\xdd\xed\x18\xf3\x6c\x81\xb0\ \xe8\xe0\xa4\x77\x82\x6a\xb6\xc6\xbb\xe7\xaf\x50\xcd\xd6\x38\xef\ \x9f\xc1\x19\x8d\xa4\x30\x36\xff\x0c\xee\x99\xa0\x36\xaa\xd6\xc0\ \x92\x7c\xc2\x94\x27\x51\x0e\x62\xa9\x31\xb6\xea\x4b\xd6\x25\xed\ \x10\x00\x45\xb7\x74\xc7\x39\xe8\xb3\x35\xe9\x5c\x75\x3d\x1f\x35\ \xdb\xa6\x5f\x0f\x31\xf1\x31\x3d\x29\xd4\x46\x31\x3c\x22\x48\x39\ \x17\x6d\xee\x3b\x49\x62\x04\xb5\x3f\xf9\xe1\xe8\x1c\xdd\x2f\xde\ \x62\xf4\x49\x81\x3f\xf8\xf2\x8f\xf0\xf3\x5f\x7c\x81\xcb\x67\x7f\ \x2d\xa2\x98\xab\x22\xdb\xeb\x16\x9a\x58\x95\x54\xa1\x4c\x2c\xad\ \x66\xaf\xd1\x7a\xf2\x04\x95\xf8\xac\x66\xe0\xef\xd6\x78\xbb\x75\ \x45\x7f\x35\xee\x52\xe5\x7e\x66\x11\x17\xa8\x0a\x8c\xec\x4a\xcc\ \xb1\x73\x09\xa8\x63\xc3\x8f\x13\xc6\x9a\x06\xe0\xdb\xec\x1a\x56\ \x1c\x23\x9e\x25\xb8\xad\x96\x38\x8b\x81\x69\x00\xfc\xe7\x2f\x57\ \xf8\xfa\xdf\xfe\x19\x0f\x1e\xd4\xc2\xbd\x73\xd1\xc3\xe6\xdd\xae\ \x3d\xe7\xa3\x1f\x79\xf8\xf4\x93\x3a\x09\xda\x7d\x10\xe3\xd3\xfe\ \x39\x42\xab\x40\x1a\x75\x11\xbb\x8a\x5f\xd3\x09\x81\x0a\xda\x06\ \x28\xa9\xd5\x83\x3d\x7f\x2f\xaa\x39\x26\xdb\x9d\xe1\xc7\xa7\x27\ \x1d\x0a\x39\x93\x9c\xd0\x59\xfc\xe4\x3e\x53\xf7\x43\xfb\x56\xd7\ \x07\x56\x86\x12\x83\xdf\xc9\xe8\x52\x0d\xa4\x43\xcf\x79\xe4\x8f\ \x86\xb5\x8b\x01\x39\xa0\xca\x8a\x8d\xf4\x7b\xd5\x32\x25\x71\x9c\ \xb3\x3e\x86\x91\x05\x7f\xd8\x03\x3e\x3c\x83\x5b\x14\xf0\x56\x2f\ \xf0\xfd\xd5\x02\xb8\xfd\x55\x3d\x30\xb3\xf9\xcd\xab\x22\x03\x16\ \x01\x3a\x00\xd0\x54\x6d\x6c\x8a\x15\x62\x58\x02\xcc\x71\xb1\xaa\ \x47\x7e\x35\xc6\x17\xc9\x82\x78\x66\xc3\x19\x45\x78\xd0\xb4\x26\ \xeb\x3d\x39\x87\x0b\x1f\xd1\xaf\x6a\xc9\x78\xb3\xfe\x5a\x9a\x3e\ \x1b\x57\x96\x16\x9b\x1b\x3f\x87\x9b\x03\x98\x5b\x70\xd7\xaf\x17\ \x18\x9f\x2d\x85\x41\x35\x06\x80\x6c\x29\x1e\x01\xe0\xdd\x6d\x08\ \xf7\xcc\xf0\xde\xb7\x5b\xb8\xcd\xff\xdf\x26\x09\xbe\xbf\xba\xc2\ \xbf\xfe\xcb\x3f\xc9\x9f\x78\x0d\x54\xa7\x7d\x5c\x6c\x17\x58\x2f\ \x6f\xf0\xdd\x04\xf8\xee\xb7\xff\x2e\xde\xfe\xf1\xb3\xc7\x78\xfa\ \xf9\x1f\xe2\xfe\xc3\x07\x58\x84\x13\x49\x73\xf6\xc3\x11\x46\x0d\ \x4e\x46\xb6\x27\x98\x38\x5d\xf4\x10\x56\x2b\xc0\x89\x30\x99\x5a\ \x70\x06\x89\x18\x0d\xe9\xe6\x1e\x0a\xec\x2a\x2c\x3e\x66\x0c\x80\ \xae\x2f\x9a\xee\x42\xe0\x51\x32\xbe\xaf\xf2\x40\x5b\x2b\xb3\xc6\ \xcd\x8c\xc6\x5c\x5b\x11\x29\x00\x9c\xc6\x31\x12\xab\xc2\x69\x15\ \x8b\xdb\xfc\xc6\x8a\x80\xb4\x10\xc0\xad\x13\x78\x02\xac\xb1\xd8\ \xab\x50\xf6\x1c\xa7\xc9\xfa\xab\xf0\xfc\x37\x2f\x90\x4f\x57\x78\ \xb7\x04\xae\xaf\x6f\x90\x2e\x96\x78\xff\xfd\x35\x2c\x00\xc3\xa1\ \xdc\x44\xe5\x34\x8e\xa5\xe4\xf5\xd8\x1d\xd4\x53\x8f\x00\xc4\x8b\ \x7a\x02\x52\xbc\x00\xb2\xd1\x9d\x28\xf8\xcc\x46\x77\x08\xfb\x11\ \x82\xfb\x8f\x50\x7a\x17\xb8\xd7\xe9\x22\x0f\xa2\xba\x17\xdb\xb7\ \xdf\xd4\xd2\xc4\xbd\xc4\xa6\x77\x85\x78\x01\xc0\x3d\x81\x13\xcf\ \xf0\x70\x74\x8e\xd2\xbb\x80\x87\x53\x78\x16\x50\x34\x8c\x8c\x41\ \x85\xff\x07\x5b\x53\xe4\xea\xf5\xd8\xe3\x94\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ """ qt_resource_name = b"""\ \x00\x09\ \x06\xa8\xaa\x74\ \x00\x71\ \x00\x75\x00\x6f\x00\x74\x00\x65\x00\x2e\x00\x74\x00\x78\x00\x74\ \x00\x0a\ \x07\x2b\x67\xc7\ \x00\x73\ \x00\x61\x00\x6d\x00\x70\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ """ qt_resource_struct = b"""\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\x39\ """ def qInitResources(): QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() ================================================ FILE: tests/QtCore/setprop_on_ctor_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtCore import * class SetPropOnCtorTest(unittest.TestCase): def testIt(self): obj = QEventTransition(targetStates = [QState()]) self.assertEqual(len(obj.targetStates()), 1); if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/staticMetaObject_test.py ================================================ import unittest from PySide.QtCore import QObject, Slot, QMetaObject class MyObject(QObject): @Slot(int, str) def slot1(self, a, b): pass class testAttribute(unittest.TestCase): def testBug896(self): mo = MyObject.staticMetaObject self.assertTrue(isinstance(mo, QMetaObject)) self.assertEqual(mo.className(), 'MyObject') self.assertTrue(mo.indexOfSlot('slot1(int,QString)') > -1) def testDuplicateSlot(self): mo = MyObject.staticMetaObject self.assertEqual(mo.indexOfSignal('destroyed(void)'), -1) self.assertTrue(mo.indexOfSignal('destroyed()') > -1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/static_method_test.py ================================================ #!/usr/bin/python '''Test cases for overloads involving static and non-static versions of a method.''' import os import unittest from PySide.QtCore import QFile class StaticNonStaticMethodsTest(unittest.TestCase): '''Test cases for overloads involving static and non-static versions of a method.''' def setUp(self): filename = 'somefile%d.txt' % os.getpid() self.existing_filename = os.path.join(os.path.curdir, filename) self.delete_file = False if not os.path.exists(self.existing_filename): f = open(self.existing_filename, 'w') for line in range(10): f.write('sbrubbles\n') f.close() self.delete_file = True self.non_existing_filename = os.path.join(os.path.curdir, 'inexistingfile.txt') i = 0 while os.path.exists(self.non_existing_filename): i += 1 filename = 'inexistingfile-%d.txt' % i self.non_existing_filename = os.path.join(os.path.curdir, filename) def tearDown(self): if self.delete_file: os.remove(self.existing_filename) def testCallingStaticMethodWithClass(self): '''Call static method using class.''' self.assert_(QFile.exists(self.existing_filename)) self.assertFalse(QFile.exists(self.non_existing_filename)) def testCallingStaticMethodWithInstance(self): '''Call static method using instance of class.''' f = QFile(self.non_existing_filename) self.assert_(f.exists(self.existing_filename)) self.assertFalse(f.exists(self.non_existing_filename)) def testCallingInstanceMethod(self): '''Call instance method.''' f1 = QFile(self.non_existing_filename) self.assertFalse(f1.exists()) f2 = QFile(self.existing_filename) self.assert_(f2.exists()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/static_protected_methods_test.py ================================================ #!/usr/bin/python '''Unit tests for static protected methods''' import unittest, time from PySide.QtCore import QThread class Test (QThread): def run(self): start = time.time() self.sleep(1) self.time_elapsed = time.time() - start class QStaticProtectedCall(unittest.TestCase): '''Test case for static protected method call''' def setUp(self): pass def tearDown(self): pass def testPathSeparator(self): thread = Test() thread.start() thread.wait() self.assertTrue(thread.time_elapsed <= 1.1) # tolarance of 100ms if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/thread_signals_test.py ================================================ ''' Test case for QObject.signalsBlocked() and blockSignal()''' import unittest import os from tempfile import mkstemp from PySide.QtCore import QObject, SIGNAL, QFile, QThread, QTimer, Qt from helper import UsesQCoreApplication class MyThread(QThread): def run(self): self.emit(SIGNAL("test(const QString&)"), "INdT - PySide"); class TestThreadSignal(UsesQCoreApplication): __called__ = True def _callback(self, msg): self.assertEqual(msg, "INdT - PySide") self.__called__ = True self.app.quit() def testThread(self): t = MyThread() QObject.connect(t, SIGNAL("test(const QString&)"), self._callback); t.start() self.app.exec_() t.wait() self.assert_(self.__called__); if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/tr_noop_test.py ================================================ import unittest import sys from PySide.QtCore import QT_TR_NOOP, QT_TR_NOOP_UTF8 from PySide.QtCore import QT_TRANSLATE_NOOP, QT_TRANSLATE_NOOP3, QT_TRANSLATE_NOOP_UTF8 class QtTrNoopTest(unittest.TestCase): def setUp(self): self.txt = 'Cthulhu fhtag!' def tearDown(self): del self.txt def testQtTrNoop(self): refcnt = sys.getrefcount(self.txt) result = QT_TR_NOOP(self.txt) self.assertEqual(result, self.txt) self.assertEqual(sys.getrefcount(result), refcnt + 1) def testQtTrNoopUtf8(self): refcnt = sys.getrefcount(self.txt) result = QT_TR_NOOP_UTF8(self.txt) self.assertEqual(result, self.txt) self.assertEqual(sys.getrefcount(result), refcnt + 1) def testQtTranslateNoop(self): refcnt = sys.getrefcount(self.txt) result = QT_TRANSLATE_NOOP(None, self.txt) self.assertEqual(result, self.txt) self.assertEqual(sys.getrefcount(result), refcnt + 1) def testQtTranslateNoopUtf8(self): refcnt = sys.getrefcount(self.txt) result = QT_TRANSLATE_NOOP_UTF8(self.txt) self.assertEqual(result, self.txt) self.assertEqual(sys.getrefcount(result), refcnt + 1) def testQtTranslateNoop3(self): refcnt = sys.getrefcount(self.txt) result = QT_TRANSLATE_NOOP3(None, self.txt, None) self.assertEqual(result, self.txt) self.assertEqual(sys.getrefcount(result), refcnt + 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/translation_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Unit tests to test QTranslator and translation in general.''' import os import unittest import py3kcompat as py3k from PySide.QtCore import QObject, QTranslator, QCoreApplication from helper import UsesQCoreApplication class TranslationTest(UsesQCoreApplication): '''Test case for Qt translation facilities.''' def setUp(self): super(TranslationTest, self).setUp() self.trdir = os.path.join(os.path.dirname(__file__), 'translations') def testLatin(self): #Set string value to Latin translator = QTranslator() translator.load(os.path.join(self.trdir, 'trans_latin.qm')) self.app.installTranslator(translator) obj = QObject() obj.setObjectName(obj.tr('Hello World!')) self.assertEqual(obj.objectName(), py3k.unicode_('Orbis, te saluto!')) def testRussian(self): #Set string value to Russian translator = QTranslator() translator.load(os.path.join(self.trdir, 'trans_russian.qm')) self.app.installTranslator(translator) obj = QObject() obj.setObjectName(obj.tr('Hello World!')) self.assertEqual(obj.objectName(), py3k.unicode_('привет мир!')) def testUtf8(self): translator = QTranslator() translator.load(os.path.join(self.trdir, 'trans_russian.qm')) self.app.installTranslator(translator) obj = QObject() obj.setObjectName(obj.trUtf8('Hello World!')) self.assertEqual(obj.objectName(), py3k.unicode_('привет мир!')) def testTranslateWithNoneDisambiguation(self): value = 'String here' obj = QCoreApplication.translate('context', value, None, QCoreApplication.UnicodeUTF8) self.assertTrue(isinstance(obj, py3k.unicode)) self.assertEqual(obj, value) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/translations/trans_latin.ts ================================================ QObject Hello World! Orbis, te saluto! ================================================ FILE: tests/QtCore/translations/trans_russian.ts ================================================ QObject Hello World! привет мир! ================================================ FILE: tests/QtCore/unaryoperator_test.py ================================================ #!/usr/bin/python '''Tests the presence of unary operator __neg__ on the QPoint class''' import unittest from PySide.QtCore import QPoint class NegUnaryOperatorTest(unittest.TestCase): '''Tests the presence of unary operator __neg__ on the QPoint class''' def setUp(self): #Acquire resources self.x, self.y = 10, 20 self.neg_x, self.neg_y = -self.x, -self.y self.qpoint = QPoint(self.x, self.y) def tearDown(self): #Release resources del self.qpoint del self.x del self.y del self.neg_x del self.neg_y def testNegUnaryOperator(self): #Test __neg__ unary operator on QPoint class __neg__method_exists = True try: neg_qpoint = -self.qpoint except: __neg__method_exists = False self.assertTrue(__neg__method_exists) self.assertEqual(self.qpoint, -neg_qpoint) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/unicode_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Unit tests for QString conversion to/from Python Unicode''' import unittest import py3kcompat as py3k from PySide.QtCore import QObject class UnicodeConversion(unittest.TestCase): '''Test case for QString to/from Python Unicode conversion''' def setUp(self): pass def tearDown(self): pass def testSetRegularStringRetrieveUnicode(self): #Set regular Python string retrieve unicode obj = QObject() obj.setObjectName('test') self.assertEqual(obj.objectName(), py3k.unicode_('test')) def testSetUnicodeRetrieveUnicode(self): #Set Python unicode string and retrieve unicode obj = QObject() obj.setObjectName(py3k.unicode_('ümlaut')) self.assertEqual(obj.objectName(), py3k.unicode_('ümlaut')) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtCore/versioninfo_test.py ================================================ import unittest import PySide class TestVersionInfo(unittest.TestCase): def testIt(self): v = PySide.__version_info__ self.assertEqual(type(v), tuple) self.assertEqual(len(v), 5) self.assertEqual(type(v[0]), int) self.assertEqual(type(v[1]), int) self.assertEqual(type(v[2]), int) self.assertEqual(type(v[3]), str) self.assertEqual(type(v[4]), int) self.assertEqual(type(PySide.__version__), str) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/CMakeLists.txt ================================================ PYSIDE_TEST(bug_451.py) PYSIDE_TEST(bug_456.py) PYSIDE_TEST(bug_557.py) PYSIDE_TEST(bug_726.py) PYSIDE_TEST(bug_814.py) PYSIDE_TEST(bug_825.py) PYSIDE_TEST(bug_847.py) PYSIDE_TEST(bug_915.py) PYSIDE_TEST(bug_926.py) PYSIDE_TEST(bug_951.py) PYSIDE_TEST(bug_995.py) PYSIDE_TEST(bug_997.py) PYSIDE_TEST(bug_1029.py) PYSIDE_TEST(qdeclarativenetwork_test.py) PYSIDE_TEST(qdeclarativeview_test.py) PYSIDE_TEST(connect_python_qml.py) PYSIDE_TEST(registertype.py) ================================================ FILE: tests/QtDeclarative/bug_1029.py ================================================ from PySide.QtCore import * from PySide.QtGui import * from PySide.QtDeclarative import * import sys import gc def register_qml_types(): class TestClass(QDeclarativeItem): def __init__(self, parent = None): QDeclarativeItem.__init__(self, parent) qmlRegisterType(TestClass, "UserTypes", 1, 0, "TestClass") def main(): app = QApplication([]) # reg qml types here register_qml_types() # force gc to run gc.collect() view = QDeclarativeView() url = QUrl(__file__.replace(".py", ".qml")) view.setSource(url) if __name__ == "__main__": main() ================================================ FILE: tests/QtDeclarative/bug_1029.qml ================================================ import QtQuick 1.0 import UserTypes 1.0 Rectangle { width: 200 height: 200 color: "#ff0000" TestClass { } } ================================================ FILE: tests/QtDeclarative/bug_451.py ================================================ ''' Test bug 451: http://bugs.openbossa.org/show_bug.cgi?id=451''' from PySide import QtCore, QtGui, QtDeclarative from helper import adjust_filename import sys import unittest class PythonObject(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self, None) self._called = "" self._arg1 = None self._arg2 = None def setCalled(self, v): self._called = v def setArg1(self, v): self._arg1 = v def setArg2(self, v): self._arg2 = v def getCalled(self): return self._called def getArg1(self): return self._arg1 def getArg2(self): return self._arg2 called = QtCore.Property(str, getCalled, setCalled) arg1 = QtCore.Property(int, getArg1, setArg1) arg2 = QtCore.Property('QVariant', getArg2, setArg2) class TestBug(unittest.TestCase): def testQMLFunctionCall(self): app = QtGui.QApplication(sys.argv) view = QtDeclarative.QDeclarativeView() obj = PythonObject() context = view.rootContext() context.setContextProperty("python", obj) view.setSource(QtCore.QUrl.fromLocalFile(adjust_filename('bug_451.qml', __file__))) root = view.rootObject() root.simpleFunction() self.assertEqual(obj.called, "simpleFunction") root.oneArgFunction(42) self.assertEqual(obj.called, "oneArgFunction") self.assertEqual(obj.arg1, 42) root.twoArgFunction(10, app) self.assertEqual(obj.called, "twoArgFunction") self.assertEqual(obj.arg1, 10) self.assertEqual(obj.arg2, app) rvalue = root.returnFunction() self.assertEqual(obj.called, "returnFunction") self.assertEqual(rvalue, 42) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/bug_451.qml ================================================ import Qt 4.7 Rectangle { id: page function simpleFunction() { python.called = "simpleFunction" } function oneArgFunction(x) { python.called = "oneArgFunction" python.arg1 = x } function twoArgFunction(x, y) { python.called = "twoArgFunction" python.arg1 = x python.arg2 = y } function returnFunction() { python.called = "returnFunction" return 42 } } ================================================ FILE: tests/QtDeclarative/bug_456.py ================================================ from PySide import QtCore, QtGui, QtDeclarative from helper import adjust_filename, TimedQApplication import unittest class RotateValue(QtCore.QObject): def __init__(self): super(RotateValue,self).__init__() @QtCore.Slot(result=int) def val(self): return 100 def setRotation(self, v): self._rotation = v def getRotation(self): return self._rotation rotation = QtCore.Property(int, getRotation, setRotation) class TestConnectionWithInvalidSignature(TimedQApplication): def testSlotRetur(self): view = QtDeclarative.QDeclarativeView() rotatevalue = RotateValue() timer = QtCore.QTimer() timer.start(2000) context = view.rootContext() context.setContextProperty("rotatevalue", rotatevalue) view.setSource(QtCore.QUrl.fromLocalFile(adjust_filename('bug_456.qml', __file__))) root = view.rootObject() button = root.findChild(QtCore.QObject, "buttonMouseArea") view.show() button.entered.emit() self.assertEqual(rotatevalue.rotation, 100) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/bug_456.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: PySide Team (pyside@openbossa.org) ** ** This file is part of the examples of PySide: Python for Qt. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import Qt 4.7 Rectangle { id: page width: 500; height: 200 color: "lightgray" Rectangle { id: button width: 150; height: 40 color: "darkgray" anchors.horizontalCenter: page.horizontalCenter y: 120 MouseArea { id: buttonMouseArea objectName: "buttonMouseArea" anchors.fill: parent onEntered: { rotatevalue.rotation = rotatevalue.val() } } Text { id: buttonText text: "Press me!" anchors.horizontalCenter: button.horizontalCenter anchors.verticalCenter: button.verticalCenter font.pointSize: 16; } } } ================================================ FILE: tests/QtDeclarative/bug_557.py ================================================ from PySide.QtCore import * from PySide.QtGui import * from PySide.QtDeclarative import * import sys app = QApplication(sys.argv) engine = QDeclarativeEngine() component = QDeclarativeComponent(engine) # This should segfault if the QDeclarativeComponent has not QDeclarativeEngine component.loadUrl(QUrl.fromLocalFile('foo.qml')) ================================================ FILE: tests/QtDeclarative/bug_726.py ================================================ from PySide import QtCore, QtGui, QtDeclarative from helper import adjust_filename, TimedQApplication import unittest class ProxyObject(QtCore.QObject): def __init__(self): super(ProxyObject,self).__init__() self._o = None self._receivedName = "" @QtCore.Slot(result='QObject*') def getObject(self): if self._o: return self._o self._o = QtCore.QObject() self._o.setObjectName("PySideObject") return self._o @QtCore.Slot(str) def receivedObject(self, name): self._receivedName = name class TestConnectionWithInvalidSignature(TimedQApplication): def testSlotRetur(self): view = QtDeclarative.QDeclarativeView() proxy = ProxyObject() context = view.rootContext() context.setContextProperty("proxy", proxy) view.setSource(QtCore.QUrl.fromLocalFile(adjust_filename('bug_726.qml', __file__))) root = view.rootObject() button = root.findChild(QtCore.QObject, "buttonMouseArea") view.show() button.entered.emit() self.assertEqual(proxy._receivedName, "PySideObject") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/bug_726.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: PySide Team (pyside@openbossa.org) ** ** This file is part of the examples of PySide: Python for Qt. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import Qt 4.7 Rectangle { id: page width: 500; height: 200 color: "lightgray" Rectangle { id: button width: 150; height: 40 color: "darkgray" anchors.horizontalCenter: page.horizontalCenter y: 120 MouseArea { id: buttonMouseArea objectName: "buttonMouseArea" anchors.fill: parent onEntered: { proxy.receivedObject(proxy.getObject().objectName) } } Text { id: buttonText text: "Press me!" anchors.horizontalCenter: button.horizontalCenter anchors.verticalCenter: button.verticalCenter font.pointSize: 16; } } } ================================================ FILE: tests/QtDeclarative/bug_814.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- # Test case for PySide bug 814 # http://bugs.pyside.org/show_bug.cgi?id=814 # 2011-04-08 Thomas Perl # Released under the same terms as PySide itself from PySide.QtCore import QUrl, QAbstractListModel, QModelIndex from PySide.QtDeclarative import QDeclarativeView from helper import adjust_filename, TimedQApplication import unittest class ListModel(QAbstractListModel): def __init__(self): QAbstractListModel.__init__(self) self.setRoleNames({0: 'pysideModelData'}) def rowCount(self, parent=QModelIndex()): return 3 def data(self, index, role): if index.isValid() and role == 0: return 'blubb' return None class TestBug814(TimedQApplication): def testAbstractItemModelTransferToQML(self): view = QDeclarativeView() view.setSource(QUrl.fromLocalFile(adjust_filename('bug_814.qml', __file__))) root = view.rootObject() model = ListModel() root.setProperty('model', model) view.show() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/bug_814.qml ================================================ import Qt 4.7 ListView { width: 300; height: 300 delegate: Text { text: pysideModelData } model: 3 } ================================================ FILE: tests/QtDeclarative/bug_825.py ================================================ from PySide.QtCore import * from PySide.QtGui import * from PySide.QtDeclarative import * from helper import adjust_filename import unittest paintCalled = False class MetaA(type): pass class A(object): __metaclass__ = MetaA MetaB = type(QDeclarativeItem) B = QDeclarativeItem class MetaC(MetaA, MetaB): pass class C(A, B): __metaclass__ = MetaC class Bug825 (C): def __init__(self, parent = None): QDeclarativeItem.__init__(self, parent) # need to disable this flag to draw inside a QDeclarativeItem self.setFlag(QGraphicsItem.ItemHasNoContents, False) def paint(self, painter, options, widget): global paintCalled pen = QPen(Qt.black, 2) painter.setPen(pen); painter.drawPie(self.boundingRect(), 0, 128); paintCalled = True class TestBug825 (unittest.TestCase): def testIt(self): global paintCalled app = QApplication([]) qmlRegisterType(Bug825, 'bugs', 1, 0, 'Bug825') self.assertRaises(TypeError, qmlRegisterType, A, 'bugs', 1, 0, 'A') view = QDeclarativeView() view.setSource(QUrl.fromLocalFile(adjust_filename('bug_825.qml', __file__))) view.show() QTimer.singleShot(250, view.close) app.exec_() self.assertTrue(paintCalled) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/bug_825.qml ================================================ import Qt 4.7 import bugs 1.0 Item { width: 300; height: 200 Bug825 { } } ================================================ FILE: tests/QtDeclarative/bug_847.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- # Testcase for PySide bug 847 # Released under the same terms as PySide itself # 2011-05-04 Thomas Perl import unittest from PySide.QtCore import Slot, Signal, QUrl from PySide.QtDeclarative import QDeclarativeView from helper import adjust_filename, UsesQApplication class View(QDeclarativeView): def __init__(self): QDeclarativeView.__init__(self) self.setSource(QUrl.fromLocalFile(adjust_filename('bug_847.qml', __file__))) self.rootObject().setProperty('pythonObject', self) @Slot(int, int) def blubb(self, x, y): self.called.emit(x, y) called = Signal(int, int) class TestQML(UsesQApplication): def done(self, x, y): self._sucess = True self.app.quit() def testPythonSlot(self): self._sucess = False view = View() view.called.connect(self.done) view.show() self.app.exec_() self.assertTrue(self._sucess) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/bug_847.qml ================================================ import Qt 4.7 Rectangle { width: 500 height: 500 color: 'red' property variant pythonObject: undefined Text { anchors.centerIn: parent text: 'click me' color: 'white' } Timer { interval: 100; running: true; onTriggered: { if (pythonObject != undefined) { pythonObject.blubb(42, 84) } } } } ================================================ FILE: tests/QtDeclarative/bug_915.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- import unittest from PySide.QtDeclarative import QDeclarativeView, QDeclarativeItem from helper import TimedQApplication class TestBug915(TimedQApplication): def testReturnPolicy(self): view = QDeclarativeView() item1 = QDeclarativeItem() item1.setObjectName("Item1") view.scene().addItem(item1) self.assertEqual(item1.objectName(), "Item1") # check if the item still valid item2 = QDeclarativeItem() item2.setObjectName("Item2") item1.scene().addItem(item2) item1 = None self.assertEqual(item2.objectName(), "Item2") # check if the item still valid view = None if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/bug_926.py ================================================ import sys import unittest from helper import adjust_filename from PySide.QtCore import * from PySide.QtGui import * from PySide.QtDeclarative import * class MyClass (QObject): def __init__(self): super(MyClass,self).__init__() self.__url = QUrl() def getUrl(self): return self.__url def setUrl(self,value): newUrl = QUrl(value) if (newUrl != self.__url): self.__url = newUrl self.urlChanged.emit() urlChanged = Signal() urla = Property(QUrl, getUrl, setUrl, notify = urlChanged) class TestBug926 (unittest.TestCase): def testIt(self): app = QApplication([]) qmlRegisterType(MyClass,'Example',1,0,'MyClass') view = QDeclarativeView() view.setSource(QUrl.fromLocalFile(adjust_filename('bug_926.qml', __file__))) self.assertEqual(len(view.errors()), 0) view.show() QTimer.singleShot(0, app.quit) app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/bug_926.qml ================================================ import Qt 4.7 import Example 1.0 Rectangle { width: 100 height: 62 MyClass { id: myClass urla: "http://www.pyside.org" } Text { id: name text: myClass.urla } } ================================================ FILE: tests/QtDeclarative/bug_951.py ================================================ from PySide.QtDeclarative import QDeclarativeItem, qmlRegisterType, QDeclarativeView from PySide.QtCore import QUrl from helper import adjust_filename, TimedQApplication import unittest class MyItem(QDeclarativeItem): COMPONENT_COMPLETE_CALLED = False def __init__(self,parent=None): super(MyItem, self).__init__(parent) self.setObjectName("myitem") def componentComplete(self): MyItem.COMPONENT_COMPLETE_CALLED = True super(MyItem, self).componentComplete() class TestRegisterQMLType(TimedQApplication): def setup(self): TimedQApplication.setup(self, 100 * 3) # 3s def testSignalEmission(self): qmlRegisterType(MyItem, "my.item", 1, 0, "MyItem") view = QDeclarativeView() view.setSource(QUrl.fromLocalFile(adjust_filename('bug_951.qml', __file__))) self.app.exec_() self.assertTrue(MyItem.COMPONENT_COMPLETE_CALLED) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/bug_951.qml ================================================ import Qt 4.7 import my.item 1.0 Rectangle{ width:10 height:10 MyItem{ } } ================================================ FILE: tests/QtDeclarative/bug_995.py ================================================ from PySide.QtGui import * from PySide.QtDeclarative import * from helper import adjust_filename, UsesQApplication app = QApplication([]) view = QDeclarativeView(adjust_filename('bug_995.qml', __file__)) view.show() view.resize(200, 200) item = view.itemAt(100, 100) # it CAN NOT crash here print(item) ================================================ FILE: tests/QtDeclarative/bug_995.qml ================================================ import Qt 4.7 Rectangle { width: 100 height: 100 color: "red" Text { text: "Hello World" anchors.centerIn: parent } } ================================================ FILE: tests/QtDeclarative/bug_997.py ================================================ from PySide import QtCore, QtDeclarative import unittest from helper import adjust_filename, UsesQApplication class TestBug(UsesQApplication): def testQMLFunctionCall(self): ownerData = QtDeclarative.QDeclarativePropertyMap() ownerData.insert('name', 'John Smith') ownerData.insert('phone', '555-5555') ownerData.insert('newValue', '') view = QtDeclarative.QDeclarativeView() ctxt = view.rootContext() ctxt.setContextProperty('owner', ownerData) view.setSource(QtCore.QUrl.fromLocalFile(adjust_filename('bug_997.qml', __file__))) view.show() QtCore.QTimer.singleShot(1000, self.app.quit) self.app.exec_() self.assertEqual(ownerData.value('newName'), ownerData.value('name')) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/bug_997.qml ================================================ import Qt 4.7 Text { text: owner.name + " " + owner.phone Component.onCompleted: { owner.newName = owner.name } } ================================================ FILE: tests/QtDeclarative/connect_python_qml.py ================================================ '''Test case for bug #442''' from PySide import QtCore, QtGui, QtDeclarative from helper import adjust_filename, TimedQApplication import unittest class TestConnectionWithInvalidSignature(TimedQApplication): def onButtonClicked(self): self.buttonClicked = True self.app.quit() def onButtonFailClicked(self): pass def testFailConnection(self): self.buttonClicked = False self.buttonFailClicked = False view = QtDeclarative.QDeclarativeView() view.setSource(QtCore.QUrl.fromLocalFile(adjust_filename('connect_python_qml.qml', __file__))) root = view.rootObject() button = root.findChild(QtCore.QObject, "buttonMouseArea") self.assertRaises(TypeError, QtCore.QObject.connect, [button,QtCore.SIGNAL('entered()'), self.onButtonFailClicked]) button.entered.connect(self.onButtonClicked) button.entered.emit() view.show() self.app.exec_() self.assert_(self.buttonClicked) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/connect_python_qml.qml ================================================ import Qt 4.7 Rectangle { id: page width: 500; height: 200 color: "lightgray" Rectangle { id: button width: 150; height: 40 color: "darkgray" anchors.horizontalCenter: page.horizontalCenter y: 150 MouseArea { id: buttonMouseArea objectName: "buttonMouseArea" anchors.fill: parent } } } ================================================ FILE: tests/QtDeclarative/hw.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import Qt 4.7 Rectangle { id: page width: 500; height: 200 color: "lightgray" Text { id: helloText text: "Hello world!" y: 30 anchors.horizontalCenter: page.horizontalCenter font.pointSize: 24; font.bold: true } } ================================================ FILE: tests/QtDeclarative/qdeclarativenetwork_test.py ================================================ '''Test cases for QDeclarativeNetwork''' import unittest from PySide.QtCore import QUrl from PySide.QtDeclarative import QDeclarativeView, QDeclarativeNetworkAccessManagerFactory from PySide.QtNetwork import QNetworkAccessManager from helper import adjust_filename, TimedQApplication class TestQDeclarativeNetworkFactory(TimedQApplication): def setUp(self): TimedQApplication.setUp(self, timeout=1000) def testQDeclarativeNetworkFactory(self): view = QDeclarativeView() url = QUrl.fromLocalFile(adjust_filename('hw.qml', __file__)) view.setSource(url) view.show() self.assertEqual(view.status(), QDeclarativeView.Ready) self.app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/qdeclarativeview_test.py ================================================ '''Test cases for QDeclarativeView''' import unittest from PySide.QtCore import QUrl, QObject, Property, Slot from PySide.QtDeclarative import QDeclarativeView from helper import adjust_filename, TimedQApplication class MyObject(QObject): def __init__(self, text, parent=None): QObject.__init__(self, parent) self._text = text def getText(self): return self._text @Slot(str) def qmlText(self, text): self._qmlText = text title = Property(str, getText) class TestQDeclarativeView(TimedQApplication): def testQDeclarativeViewList(self): view = QDeclarativeView() dataList = ["Item 1", "Item 2", "Item 3", "Item 4"] ctxt = view.rootContext() ctxt.setContextProperty("myModel", dataList) url = QUrl.fromLocalFile(adjust_filename('view.qml', __file__)) view.setSource(url) view.show() self.assertEqual(view.status(), QDeclarativeView.Ready) def testModelExport(self): view = QDeclarativeView() dataList = [MyObject("Item 1"), MyObject("Item 2"), MyObject("Item 3"), MyObject("Item 4")] ctxt = view.rootContext() ctxt.setContextProperty("myModel", dataList) url = QUrl.fromLocalFile(adjust_filename('viewmodel.qml', __file__)) view.setSource(url) view.show() self.assertEqual(view.status(), QDeclarativeView.Ready) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/registertype.py ================================================ import sys import unittest import helper from PySide.QtCore import * from PySide.QtGui import * from PySide.QtDeclarative import * class PieSlice (QDeclarativeItem): def __init__(self, parent = None): QDeclarativeItem.__init__(self, parent) # need to disable this flag to draw inside a QDeclarativeItem self.setFlag(QGraphicsItem.ItemHasNoContents, False) self._color = QColor() self._fromAngle = 0 self._angleSpan = 0 def getColor(self): return self._color def setColor(self, value): self._color = value def getFromAngle(self): return self._angle def setFromAngle(self, value): self._fromAngle = value def getAngleSpan(self): return self._angleSpan def setAngleSpan(self, value): self._angleSpan = value color = Property(QColor, getColor, setColor) fromAngle = Property(int, getFromAngle, setFromAngle) angleSpan = Property(int, getAngleSpan, setAngleSpan) def paint(self, painter, options, widget): global paintCalled pen = QPen(self._color, 2) painter.setPen(pen); painter.setRenderHints(QPainter.Antialiasing, True); painter.drawPie(self.boundingRect(), self._fromAngle * 16, self._angleSpan * 16); paintCalled = True class PieChart (QDeclarativeItem): def __init__(self, parent = None): QDeclarativeItem.__init__(self, parent) self._name = '' self._slices = [] def getName(self): return self._name def setName(self, value): self._name = value name = Property(str, getName, setName) def appendSlice(self, _slice): global appendCalled _slice.setParentItem(self) self._slices.append(_slice) appendCalled = True slices = ListProperty(PieSlice, append=appendSlice) appendCalled = False paintCalled = False class TestQmlSupport(unittest.TestCase): def testIt(self): app = QApplication([]) qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart'); qmlRegisterType(PieSlice, "Charts", 1, 0, "PieSlice"); view = QDeclarativeView() view.setSource(QUrl.fromLocalFile(helper.adjust_filename('registertype.qml', __file__))) view.show() QTimer.singleShot(250, view.close) app.exec_() self.assertTrue(appendCalled) self.assertTrue(paintCalled) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtDeclarative/registertype.qml ================================================ import Qt 4.7 import Charts 1.0 Item { width: 300; height: 200 PieChart { anchors.centerIn: parent width: 100; height: 100 slices: [ PieSlice { anchors.fill: parent color: "red" fromAngle: 0; angleSpan: 110 }, PieSlice { anchors.fill: parent color: "black" fromAngle: 110; angleSpan: 50 }, PieSlice { anchors.fill: parent color: "blue" fromAngle: 160; angleSpan: 100 } ] } } ================================================ FILE: tests/QtDeclarative/view.qml ================================================ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import Qt 4.7 ListView { width: 100 height: 100 anchors.fill: parent model: myModel delegate: Component { Rectangle { height: 25 width: 100 Text { text: modelData } } } } ================================================ FILE: tests/QtDeclarative/viewmodel.qml ================================================ import Qt 4.7 ListView { width: 100; height: 100 anchors.fill: parent model: myModel delegate: Rectangle { height: 25 width: 100 Text { text: title } } } ================================================ FILE: tests/QtGui/CMakeLists.txt ================================================ #Keep this in alphabetical sort PYSIDE_TEST(action_clear.py) PYSIDE_TEST(api2_test.py) PYSIDE_TEST(add_action_test.py) PYSIDE_TEST(bug_172.py) PYSIDE_TEST(bug_243.py) PYSIDE_TEST(bug_300_test.py) PYSIDE_TEST(bug_307.py) PYSIDE_TEST(bug_324.py) PYSIDE_TEST(bug_338.py) PYSIDE_TEST(bug_363.py) PYSIDE_TEST(bug_367.py) PYSIDE_TEST(bug_389.py) PYSIDE_TEST(bug_400.py) PYSIDE_TEST(bug_416.py) PYSIDE_TEST(bug_429.py) PYSIDE_TEST(bug_430.py) PYSIDE_TEST(bug_433.py) PYSIDE_TEST(bug_467.py) PYSIDE_TEST(bug_480.py) PYSIDE_TEST(bug_493.py) PYSIDE_TEST(bug_500.py) PYSIDE_TEST(bug_512.py) PYSIDE_TEST(bug_525.py) PYSIDE_TEST(bug_546.py) PYSIDE_TEST(bug_547.py) PYSIDE_TEST(bug_549.py) PYSIDE_TEST(bug_569.py) PYSIDE_TEST(bug_575.py) PYSIDE_TEST(bug_576.py) PYSIDE_TEST(bug_585.py) PYSIDE_TEST(bug_589.py) PYSIDE_TEST(bug_606.py) PYSIDE_TEST(bug_617.py) PYSIDE_TEST(bug_635.py) PYSIDE_TEST(bug_640.py) PYSIDE_TEST(bug_652.py) PYSIDE_TEST(bug_653.py) PYSIDE_TEST(bug_660.py) PYSIDE_TEST(bug_662.py) PYSIDE_TEST(bug_667.py) PYSIDE_TEST(bug_668.py) PYSIDE_TEST(bug_674.py) PYSIDE_TEST(bug_675.py) PYSIDE_TEST(bug_688.py) PYSIDE_TEST(bug_696.py) PYSIDE_TEST(bug_693.py) PYSIDE_TEST(bug_714.py) PYSIDE_TEST(bug_716.py) PYSIDE_TEST(bug_722.py) PYSIDE_TEST(bug_728.py) PYSIDE_TEST(bug_736.py) PYSIDE_TEST(bug_740.py) PYSIDE_TEST(bug_743.py) PYSIDE_TEST(bug_750.py) PYSIDE_TEST(bug_778.py) PYSIDE_TEST(bug_785.py) PYSIDE_TEST(bug_793.py) PYSIDE_TEST(bug_811.py) PYSIDE_TEST(bug_834.py) PYSIDE_TEST(bug_836.py) PYSIDE_TEST(bug_844.py) PYSIDE_TEST(bug_854.py) PYSIDE_TEST(bug_860.py) PYSIDE_TEST(bug_862.py) PYSIDE_TEST(bug_871.py) PYSIDE_TEST(bug_879.py) PYSIDE_TEST(bug_882.py) PYSIDE_TEST(bug_919.py) PYSIDE_TEST(bug_921.py) PYSIDE_TEST(bug_941.py) PYSIDE_TEST(bug_964.py) PYSIDE_TEST(bug_967.py) PYSIDE_TEST(bug_972.py) PYSIDE_TEST(bug_979.py) PYSIDE_TEST(bug_988.py) PYSIDE_TEST(bug_991.py) PYSIDE_TEST(bug_998.py) PYSIDE_TEST(bug_1002.py) PYSIDE_TEST(bug_1006.py) PYSIDE_TEST(bug_1048.py) PYSIDE_TEST(bug_1077.py) PYSIDE_TEST(bug_PYSIDE-41.py) PYSIDE_TEST(customproxywidget_test.py) PYSIDE_TEST(deepcopy_test.py) PYSIDE_TEST(event_filter_test.py) PYSIDE_TEST(float_to_int_implicit_conversion_test.py) PYSIDE_TEST(grandparent_method_test.py) PYSIDE_TEST(hashabletype_test.py) PYSIDE_TEST(keep_reference_test.py) PYSIDE_TEST(missing_symbols_test.py) PYSIDE_TEST(paint_event_test.py) PYSIDE_TEST(parent_method_test.py) PYSIDE_TEST(pyside_reload_test.py) PYSIDE_TEST(python_properties_test.py) PYSIDE_TEST(qabstracttextdocumentlayout_test.py) PYSIDE_TEST(qapplication_exit_segfault_test.py) PYSIDE_TEST(qapplication_singleton_test.py) PYSIDE_TEST(qapp_test.py) PYSIDE_TEST(qbrush_test.py) PYSIDE_TEST(qcolor_test.py) PYSIDE_TEST(qcolor_reduce_test.py) PYSIDE_TEST(qcursor_test.py) PYSIDE_TEST(qaction_test.py) PYSIDE_TEST(qdatastream_gui_operators_test.py) PYSIDE_TEST(qdynamic_signal.py) PYSIDE_TEST(qfontdialog_test.py) PYSIDE_TEST(qfontmetrics_test.py) PYSIDE_TEST(qformlayout_test.py) PYSIDE_TEST(qgraphicsitem_isblocked_test.py) PYSIDE_TEST(qgraphicsitem_test.py) PYSIDE_TEST(qgraphicsproxywidget_test.py) PYSIDE_TEST(qgraphicsscene_test.py) PYSIDE_TEST(qicon_test.py) PYSIDE_TEST(qimage_test.py) PYSIDE_TEST(qinputcontext_test.py) PYSIDE_TEST(qinputdialog_get_test.py) PYSIDE_TEST(qitemselection_test.py) PYSIDE_TEST(qlayout_ref_test.py) PYSIDE_TEST(qlayout_test.py) PYSIDE_TEST(qlcdnumber_test.py) PYSIDE_TEST(qlistwidget_test.py) PYSIDE_TEST(qlistwidgetitem_test.py) PYSIDE_TEST(qmainwindow_test.py) PYSIDE_TEST(qmatrix_test.py) PYSIDE_TEST(qmenuadd_test.py) PYSIDE_TEST(qmenu_test.py) PYSIDE_TEST(qobject_mi_test.py) PYSIDE_TEST(qpainter_test.py) PYSIDE_TEST(qpen_test.py) PYSIDE_TEST(qpicture_test.py) PYSIDE_TEST(qpixmap_test.py) PYSIDE_TEST(qpixmap_constructor.py) PYSIDE_TEST(qpixmapcache_test.py) PYSIDE_TEST(qpolygonf_test.py) PYSIDE_TEST(qpushbutton_test.py) PYSIDE_TEST(qkeysequence_test.py) PYSIDE_TEST(qradialgradient_test.py) PYSIDE_TEST(qregion_test.py) PYSIDE_TEST(qshortcut_test.py) PYSIDE_TEST(qsplitter_test.py) PYSIDE_TEST(qstandarditemmodel_test.py) PYSIDE_TEST(qstring_qkeysequence_test.py) PYSIDE_TEST(qstyle_test.py) PYSIDE_TEST(qtableview_test.py) PYSIDE_TEST(qtabwidget_test.py) PYSIDE_TEST(qtextdocument_undoredo_test.py) PYSIDE_TEST(qtextedit_test.py) PYSIDE_TEST(qtextedit_signal_test.py) PYSIDE_TEST(qtextline_test.py) PYSIDE_TEST(qtoolbar_test.py) PYSIDE_TEST(qtoolbox_test.py) PYSIDE_TEST(qtransform_test.py) PYSIDE_TEST(qvariant_test.py) PYSIDE_TEST(qvalidator_test.py) PYSIDE_TEST(qwidget_setlayout_test.py) PYSIDE_TEST(qwidget_test.py) PYSIDE_TEST(reference_count_test.py) PYSIDE_TEST(repr_test.py) PYSIDE_TEST(returnquadruplesofnumbers_test.py) PYSIDE_TEST(standardpixmap_test.py) PYSIDE_TEST(timed_app_test.py) PYSIDE_TEST(virtual_protected_inheritance_test.py) PYSIDE_TEST(virtual_pure_override_test.py) PYSIDE_TEST(wrong_return_test.py) if (${QTVERSION} VERSION_GREATER 4.6.9) PYSIDE_TEST(bug_1091.py) endif() if(Q_WS_X11) PYSIDE_TEST(x11_symbols_test.py) endif() ================================================ FILE: tests/QtGui/action_clear.py ================================================ from PySide.QtGui import QMenu, QWidget, QMenuBar, QToolBar import weakref import unittest from helper import UsesQApplication class TestQActionLifeCycle(UsesQApplication): def actionDestroyed(self, act): self._actionDestroyed = True def testMenu(self): self._actionDestroyed = False w = QWidget() menu = QMenu(w) act = menu.addAction("MENU") _ref = weakref.ref(act, self.actionDestroyed) act = None self.assertFalse(self._actionDestroyed) menu.clear() self.assertTrue(self._actionDestroyed) def testMenuBar(self): self._actionDestroyed = False w = QWidget() menuBar = QMenuBar(w) act = menuBar.addAction("MENU") _ref = weakref.ref(act, self.actionDestroyed) act = None self.assertFalse(self._actionDestroyed) menuBar.clear() self.assertTrue(self._actionDestroyed) def testToolBar(self): self._actionDestroyed = False w = QWidget() toolBar = QToolBar(w) act = toolBar.addAction("MENU") _ref = weakref.ref(act, self.actionDestroyed) act = None self.assertFalse(self._actionDestroyed) toolBar.clear() self.assertTrue(self._actionDestroyed) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/add_action_test.py ================================================ '''Tests for QMenuBar.addAction(identifier, callback) calls''' import unittest from PySide.QtCore import SLOT from PySide.QtGui import QMenuBar, QAction, QPushButton from helper import UsesQApplication class AddActionTest(UsesQApplication): '''QMenuBar addAction''' def tearDown(self): try: del self.called except AttributeError: pass super(AddActionTest, self).tearDown() def _callback(self): self.called = True def testBasic(self): '''QMenuBar.addAction(id, callback)''' menubar = QMenuBar() action = menubar.addAction("Accounts", self._callback) action.activate(QAction.Trigger) self.assert_(self.called) def testWithCppSlot(self): '''QMenuBar.addAction(id, object, slot)''' menubar = QMenuBar() widget = QPushButton() widget.setCheckable(True) widget.setChecked(False) action = menubar.addAction("Accounts", widget, SLOT("toggle()")) action.activate(QAction.Trigger) self.assert_(widget.isChecked()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/api2_test.py ================================================ '''Test cases for PySide API2 support''' import unittest import sys from PySide.QtGui import QWidget, QIntValidator, QSpinBox, QValidator, QApplication from helper import UsesQApplication class WidgetValidatorQInt(QWidget, QIntValidator): def __init__(self, parent=None): QWidget.__init__(self, parent) QIntValidator.__init__(self, parent) class WidgetValidatorQSpinBox(QSpinBox): def __init__(self, parent=None): QSpinBox.__init__(self, parent) def fixup(self, text): print("It was called!") class DoubleQObjectInheritanceTest(UsesQApplication): def testDouble(self): '''Double inheritance from QObject classes''' obj = WidgetValidatorQInt() #QIntValidator methods state, string, number = obj.validate('Test', 0) self.assertEqual(state, QValidator.Invalid) state, string, number = obj.validate('33', 0) self.assertEqual(state, QValidator.Acceptable) def testQSpinBox(self): obj = WidgetValidatorQSpinBox() obj.setRange(1, 10) obj.setValue(0) self.assertEqual(obj.value(), 1) class QClipboardTest(UsesQApplication): def testQClipboard(self): #skip this test on MacOS because the clipboard is not available during the ssh session #this cause problems in the buildbot if sys.platform == 'darwin': return clip = QApplication.clipboard() clip.setText("Testing this thing!") text, subtype = clip.text("") self.assertEqual(subtype, "plain") self.assertEqual(text, "Testing this thing!") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_1002.py ================================================ import unittest import sys from PySide.QtGui import QWidget, QPushButton from helper import UsesQApplication class TestBug1002 (UsesQApplication): def testReturnWindow(self): widget = QWidget() button = QPushButton(widget) self.assertEqual(sys.getrefcount(widget), 2) window = button.window() self.assertEqual(sys.getrefcount(widget), 3) self.assertEqual(sys.getrefcount(window), 3) del widget if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_1006.py ================================================ import unittest import weakref import sys from PySide.QtCore import Qt from PySide.QtGui import QDialog, QLabel, QGridLayout, QHBoxLayout, QWidget from helper import TimedQApplication class LabelWindow(QDialog): def __init__(self, parent): super(LabelWindow, self).__init__(parent) self.test_layout = QGridLayout() label = QLabel("Label") self.test_layout.addWidget(label, 0, 0) self.setLayout(self.test_layout) self._destroyCalled = False def replace(self, unit): old_item = self.test_layout.itemAtPosition(0, 0) old_label = old_item.widget() ref = weakref.ref(old_item, self._destroyed) self.test_layout.removeWidget(old_label) unit.assertRaises(RuntimeError, old_item.widget) del old_item label = QLabel("Label New") old_label.deleteLater() label.setAlignment(Qt.AlignCenter) self.test_layout.addWidget(label, 0, 0) def _destroyed(self, obj): self._destroyCalled = True class TestBug1006 (TimedQApplication): def testLayoutItemLifeTime(self): window = LabelWindow(None) window.replace(self) self.assertTrue(window._destroyCalled) self.app.exec_() def testParentLayout(self): def createLayout(): label = QLabel() layout = QHBoxLayout() layout.addWidget(label) widget = QWidget() widget.setLayout(layout) return (layout, widget) (layout, widget) = createLayout() item = layout.itemAt(0) self.assertTrue(isinstance(item.widget(), QWidget)) def testRemoveOrphanWidget(self): widget = QLabel() layout = QHBoxLayout() layout.addWidget(widget) self.assertEqual(sys.getrefcount(widget), 3) layout.removeWidget(widget) widget.setObjectName("MyWidget") self.assertEqual(sys.getrefcount(widget), 2) def testRemoveChildWidget(self): parent = QLabel() widget = QLabel(parent) self.assertEqual(sys.getrefcount(widget), 3) layout = QHBoxLayout() layout.addWidget(widget) self.assertEqual(sys.getrefcount(widget), 3) layout.removeWidget(widget) widget.setObjectName("MyWidget") self.assertEqual(sys.getrefcount(widget), 3) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/bug_1048.py ================================================ from PySide import QtGui a = QtGui.QApplication([]) w = QtGui.QWidget() l = QtGui.QGridLayout(w) l.itemAtPosition(0, 0) ================================================ FILE: tests/QtGui/bug_1077.py ================================================ ''' unit test for BUG #1077 ''' from PySide import QtCore, QtGui import time class Highlighter(QtGui.QSyntaxHighlighter): def __init__(self, parent, mode): QtGui.QSyntaxHighlighter.__init__(self, parent) self.tstamp = time.time() if __name__ == "__main__": app = QtGui.QApplication([]) python = QtGui.QTextEdit() python.setWindowTitle("python") hl = Highlighter(python.document(), "python") python.show() text = hl.document() ================================================ FILE: tests/QtGui/bug_1091.py ================================================ ''' unit test for BUG #1091 ''' import unittest from PySide import QtGui class QPainterTestCase(unittest.TestCase): def testIt(self): self.assertTrue("PixmapFragment" in dir(QtGui.QPainter)) self.assertTrue("drawPixmapFragments" in dir(QtGui.QPainter)) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/bug_172.py ================================================ from PySide.QtGui import * if __name__ == '__main__': app = QApplication([]) wdg = QWidget() hbox = QHBoxLayout() vbox = QVBoxLayout() vbox.addLayout(hbox) wdg.setLayout(vbox) ================================================ FILE: tests/QtGui/bug_243.py ================================================ ''' Test bug 243: http://bugs.openbossa.org/show_bug.cgi?id=243''' import unittest import sys from PySide.QtGui import QApplication, QMainWindow, QLayout class QAppPresence(unittest.TestCase): def testBug(self): app = QApplication(sys.argv) window = QMainWindow() l = window.layout() self.assert_(isinstance(l, QLayout)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_300_test.py ================================================ from PySide.QtGui import QStringListModel from PySide.QtCore import QModelIndex import unittest class TestQAbstractItemModelSignals(unittest.TestCase): def sigCallback(self, index, r, c): self._called = True def testSignals(self): self._called = False m = QStringListModel() m.rowsAboutToBeInserted[QModelIndex,int,int].connect(self.sigCallback) m.insertRows(0, 3) self.assert_(self._called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_307.py ================================================ import unittest import colorsys from PySide.QtCore import SIGNAL from PySide.QtGui import QPushButton, QApplication class Test (QApplication) : def __init__(self, argv) : super(Test, self).__init__(argv) self._called = False def called(self): self._called = True class QApplicationSignalsTest(unittest.TestCase): def testQuit(self): app = Test([]) button = QPushButton("BUTTON") app.connect(button, SIGNAL("clicked()"), app.called) button.click() self.assert_(app._called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_324.py ================================================ ''' Test bug 324: http://bugs.openbossa.org/show_bug.cgi?id=324''' import unittest import sys import signal from PySide.QtCore import * from PySide.QtGui import * class QBug( QObject ): def __init__(self, parent = None): QObject.__init__(self, parent) def check(self): self.done.emit("abc") done = Signal(str) class Bug324(unittest.TestCase): def on_done(self, val): self.value = val def testBug(self): app = QApplication([]) bug = QBug() self.value = '' bug.done.connect(self.on_done) bug.check() self.assertEqual(self.value, 'abc') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_338.py ================================================ ''' Test bug 338: http://bugs.openbossa.org/show_bug.cgi?id=338''' import sys import unittest from PySide import QtCore,QtGui class DiagramItem(QtGui.QGraphicsPolygonItem): def __init__(self, parent=None, scene=None): super(DiagramItem, self).__init__(parent, scene) def itemChange(self, change, value): return value class BugTest(unittest.TestCase): def test(self): app = QtGui.QApplication(sys.argv) scene = QtGui.QGraphicsScene() item = DiagramItem() item2 = DiagramItem() #this cause segfault scene.addItem(item) scene.addItem(item2) ================================================ FILE: tests/QtGui/bug_363.py ================================================ ''' Test bug 363: http://bugs.openbossa.org/show_bug.cgi?id=363''' import sys import unittest from helper import UsesQApplication from PySide import QtCore,QtGui # Check for desktop object lifetime class BugTest(UsesQApplication): def mySlot(self): pass # test if it is possible to connect with a desktop object after storing that on an auxiliar variable def testCase1(self): desktop = QtGui.QApplication.desktop() desktop.resized[int].connect(self.mySlot) self.assert_(True) # test if it is possible to connect with a desktop object without storing that on an auxiliar variable def testCase2(self): QtGui.QApplication.desktop().resized[int].connect(self.mySlot) self.assert_(True) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_367.py ================================================ ''' Test bug 367: http://bugs.openbossa.org/show_bug.cgi?id=367''' import sys import unittest from helper import UsesQApplication from PySide import QtCore,QtGui class BugTest(UsesQApplication): def testCase(self): model = QtGui.QStandardItemModel() parentItem = model.invisibleRootItem() for i in range(10): item = QtGui.QStandardItem() rcount = sys.getrefcount(item) parentItem.appendRow(item) self.assertEqual(rcount+1, sys.getrefcount(item)) parentItem = item self.assert_(True) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_389.py ================================================ ''' Test bug 389: http://bugs.openbossa.org/show_bug.cgi?id=389''' import sys import unittest from helper import UsesQApplication from PySide import QtCore,QtGui class BugTest(UsesQApplication): def testCase(self): s = QtGui.QWidget().style() i = s.standardIcon(QtGui.QStyle.SP_TitleBarMinButton) self.assertEqual(type(i), QtGui.QIcon) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_400.py ================================================ ''' Test bug 400: http://bugs.openbossa.org/show_bug.cgi?id=400''' import unittest from helper import UsesQApplication from PySide.QtGui import QTreeWidgetItemIterator, QTreeWidgetItem, QTreeWidget class BugTest(UsesQApplication): def testCase(self): treeWidget = QTreeWidget() treeWidget.setColumnCount(1) items = [] for i in range(10): items.append(QTreeWidgetItem(None, ["item: %i" % i])) treeWidget.insertTopLevelItems(0, items); _iter = QTreeWidgetItemIterator(treeWidget) index = 0 while(_iter.value()): item = _iter.value() self.assert_(item is items[index]) index += 1 _iter += 1 if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_416.py ================================================ #!/usr/bin/python import unittest from helper import TimedQApplication from PySide.QtCore import QSignalTransition, QState, Qt, QStateMachine from PySide.QtGui import QCheckBox class CheckedTransition(QSignalTransition): def __init__(self, check): QSignalTransition.__init__(self, check.stateChanged[int]) self.eventTested = False def eventTest(self, event): self.eventTested = True if not QSignalTransition.eventTest(self, event): return False return event.arguments()[0] == Qt.Checked class TestBug(TimedQApplication): def testCase(self): check = QCheckBox() check.setTristate(True) s1 = QState() s2 = QState() t1 = CheckedTransition(check) t1.setTargetState(s2) s1.addTransition(t1) machine = QStateMachine() machine.addState(s1) machine.addState(s2) machine.setInitialState(s1) machine.start() check.stateChanged[int].emit(1) check.show() self.app.exec_() self.assert_(t1.eventTested) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_429.py ================================================ from PySide.QtCore import * from PySide.QtGui import * import sys app = QApplication(sys.argv) scene = QGraphicsScene() label = QLabel("hello world") label.show() QTimer.singleShot(0, label.close) exit(app.exec_()) ================================================ FILE: tests/QtGui/bug_430.py ================================================ import sys from PySide.QtCore import * from PySide.QtGui import * class ListModel(QAbstractListModel): def rowCount(self, parent = QModelIndex()): return 0 app = QApplication([]) model = ListModel() v = QListView() v.setModel(model) QTimer.singleShot(0, v.close) app.exec_() ================================================ FILE: tests/QtGui/bug_433.py ================================================ from PySide import QtCore, QtGui import sys class Test(QtGui.QGraphicsView): def __init__(self, parent=None): super(Test, self).__init__(parent) self.s = QtGui.QGraphicsScene() self.setScene(self.s) a = QtGui.QApplication(sys.argv) t = Test() t.show() QtCore.QTimer.singleShot(0, t.close) sys.exit(a.exec_()) ================================================ FILE: tests/QtGui/bug_467.py ================================================ ''' Test bug 367: http://bugs.openbossa.org/show_bug.cgi?id=467''' import unittest from helper import UsesQApplication from PySide.QtGui import QMainWindow, QApplication class MyWidget(QMainWindow): def __init__(self, parent = None): QMainWindow.__init__(self, parent) class BugTest(UsesQApplication): def testCase(self): w = MyWidget() widgets = QApplication.allWidgets() self.assert_(w in widgets) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_480.py ================================================ import unittest from PySide import QtGui class BuggyWidget(QtGui.QWidget): def setup(self): self.verticalLayout = QtGui.QVBoxLayout(self) self.gridLayout = QtGui.QGridLayout() self.lbl = QtGui.QLabel(self) self.gridLayout.addWidget(self.lbl, 0, 1, 1, 1) # this cause a segfault during the ownership transfer self.verticalLayout.addLayout(self.gridLayout) class LayoutTransferOwnerShip(unittest.TestCase): def testBug(self): app = QtGui.QApplication([]) w = BuggyWidget() w.setup() w.show() self.assert_(True) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_493.py ================================================ from PySide.QtCore import Qt, QEvent from PySide.QtGui import QApplication, QKeyEvent, QKeySequence import unittest class TestBug569(unittest.TestCase): def testIt(self): # We need a qapp otherwise Qt will crash when trying to detect the # current platform app = QApplication([]) ev1 = QKeyEvent(QEvent.KeyRelease, Qt.Key_Delete, Qt.NoModifier) ev2 = QKeyEvent(QEvent.KeyRelease, Qt.Key_Copy, Qt.NoModifier) ks = QKeySequence.Delete self.assertEqual(ev1, ks) self.assertEqual(ks, ev1) self.assertNotEqual(ev2, ks) self.assertNotEqual(ks, ev2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_500.py ================================================ #!/usr/bin/python import unittest from PySide.QtCore import * from PySide.QtGui import * from helper import UsesQApplication class NeverDiesTest(UsesQApplication): def testIt(self): QPrintDialog() if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/bug_512.py ================================================ ''' Test bug 512: http://bugs.openbossa.org/show_bug.cgi?id=512''' import unittest from helper import UsesQApplication from PySide.QtCore import * from PySide.QtGui import * class BugTest(UsesQApplication): def testCase(self): w = QWidget(None) lbl = QLabel("Hello", w); g = QGridLayout() g.addWidget(lbl, 0, 0) w.setLayout(g) w.show() t = g.getItemPosition(0) self.assertEqual(type(t), tuple) self.assertEqual(t, (0,0,1,1)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_525.py ================================================ import unittest from PySide.QtGui import QApplication from PySide.QtGui import QMenu class M2(QMenu): def __init__(self,parent=None): super(M2,self).__init__(parent) self.setTitle(self.tr("M2")) class TestMenuDerivedClass(unittest.TestCase): def aboutToShowHandler(self): pass def testConnectSignal(self): app = QApplication([]) m2 = M2() # Test if the aboutToShow signal was translated to correct type m2.aboutToShow.connect(self.aboutToShowHandler) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_546.py ================================================ import unittest from PySide.QtGui import * class TestBug546(unittest.TestCase): """Test to check a crash at exit""" def testIt(self): app = QApplication([]) textEdit = QPlainTextEdit() completer = QCompleter(("foo", "bar"), textEdit) completer.setWidget(textEdit) if __name__=='__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_547.py ================================================ """ Unittest for bug #547 """ """ http://bugs.openbossa.org/show_bug.cgi?id=547 """ from PySide import QtGui import sys import unittest class MyMainWindow(unittest.TestCase): app = QtGui.QApplication(sys.argv) def testCase1(self): self._tree = QtGui.QTreeWidget() self._tree.setColumnCount(2) self._i1 = None self._i11 = None self._updateTree() self.assertEqual(sys.getrefcount(self._i1), 3) self.assertEqual(sys.getrefcount(self._i11), 3) self._i11.parent().setExpanded(True) self._i11.setExpanded(True) self._updateTree() self.assertEqual(sys.getrefcount(self._i1), 3) self.assertEqual(sys.getrefcount(self._i11), 3) def testCase2(self): self._tree = QtGui.QTreeWidget() self._tree.setColumnCount(2) self._i1 = None self._i11 = None self._updateTree() self.assertEqual(sys.getrefcount(self._i1), 3) self.assertEqual(sys.getrefcount(self._i11), 3) self._i11.parent().setExpanded(True) self._i11.setExpanded(True) self.assertEqual(sys.getrefcount(self._i1), 3) self.assertEqual(sys.getrefcount(self._i11), 3) def _updateTree(self): self._tree.clear() if self._i1 and self._i11: self.assertEqual(sys.getrefcount(self._i1), 2) self.assertEqual(sys.getrefcount(self._i11), 2) self._i1 = QtGui.QTreeWidgetItem(self._tree, ['1', ]) self.assertEqual(sys.getrefcount(self._i1), 3) self._i11 = QtGui.QTreeWidgetItem(self._i1, ['11', ]) self.assertEqual(sys.getrefcount(self._i11), 3) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_549.py ================================================ import unittest from PySide.QtGui import * class TestBug549(unittest.TestCase): def testBug(self): app = QApplication([]) w = QGraphicsWidget() w.setContentsMargins(1, 2, 3, 4) self.assertEquals(w.getContentsMargins(), (1, 2, 3, 4)) w.setWindowFrameMargins(5, 6, 7, 8) self.assertEquals(w.getWindowFrameMargins(), (5, 6, 7, 8)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_569.py ================================================ from PySide.QtCore import * from PySide.QtGui import * import unittest class TestBug569(unittest.TestCase): def testIt(self): types = (QTableWidgetItem, QListWidgetItem, QTreeWidgetItem) for t in types: a = t() a.__lt__ = lambda other : True b = t() b.__lt__ = lambda other : False self.assertTrue(a < b) self.assertFalse(b < a) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_575.py ================================================ """ Unittest for bug #575 """ """ http://bugs.openbossa.org/show_bug.cgi?id=575 """ from PySide.QtGui import QApplication, QPlainTextEdit, QTextEdit import sys import unittest class Bug575(unittest.TestCase): def testPropertyValues(self): app = QApplication(sys.argv) textEdit = QPlainTextEdit() textEdit.insertPlainText("PySide INdT") selection = QTextEdit.ExtraSelection() selection.cursor = textEdit.textCursor() selection.cursor.setPosition(2) self.assertEqual(selection.cursor.position(), 2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_576.py ================================================ """ Unittest for bug #576 """ """ http://bugs.openbossa.org/show_bug.cgi?id=576 """ from PySide import QtGui, QtCore import sys import unittest class Bug576(unittest.TestCase): def onButtonDestroyed(self, button): self._destroyed = True self.assert_(isinstance(button, QtGui.QPushButton)) def testWidgetParent(self): self._destroyed = False app = QtGui.QApplication(sys.argv) w = QtGui.QWidget() b = QtGui.QPushButton("test") b.destroyed[QtCore.QObject].connect(self.onButtonDestroyed) self.assertEqual(sys.getrefcount(b), 2) b.setParent(w) self.assertEqual(sys.getrefcount(b), 3) b.parent() self.assertEqual(sys.getrefcount(b), 3) b.setParent(None) self.assertEqual(sys.getrefcount(b), 2) del b self.assert_(self._destroyed) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_585.py ================================================ '''Test bug 585: http://bugs.openbossa.org/show_bug.cgi?id=585''' from PySide import QtCore ,QtGui import sys import unittest class Bug585(unittest.TestCase): def testCase(self): app = QtGui.QApplication([]) self._tree = QtGui.QTreeWidget() self._tree.setColumnCount(2) i1 = QtGui.QTreeWidgetItem(self._tree, ['1', ]) i2 = QtGui.QTreeWidgetItem(self._tree, ['2', ]) refCount = sys.getrefcount(i1) # this function return None # because the topLevelItem does not has a parent item # but still have a TreeWidget as a parent self._tree.topLevelItem(0).parent() self.assertEqual(refCount, sys.getrefcount(i1)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_589.py ================================================ # trimmed down diagramscene.py to demonstrate crash in sizeHint() import sys from PySide import QtCore, QtGui import unittest class CustomWidget(QtGui.QGraphicsProxyWidget): def itemChange(self, eventType, value): QtGui.QGraphicsProxyWidget.itemChange(self, eventType, value) class Bug589(unittest.TestCase): def testCase(self): widget = QtGui.QGraphicsProxyWidget() custom = CustomWidget() custom.setParentItem(widget) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) unittest.main() ================================================ FILE: tests/QtGui/bug_606.py ================================================ import unittest import PySide from PySide.QtGui import QVector2D, QVector3D, QVector4D from PySide.QtGui import QColor class testCases(unittest.TestCase): def testQVector2DToTuple(self): vec = QVector2D(1, 2) self.assertEqual((1, 2), vec.toTuple()) def testQVector3DToTuple(self): vec = QVector3D(1, 2, 3) self.assertEqual((1, 2, 3), vec.toTuple()) def testQVector4DToTuple(self): vec = QVector4D(1, 2, 3, 4) self.assertEqual((1, 2, 3, 4), vec.toTuple()) def testQColorToTuple(self): c = QColor(0, 0, 255) c.setRgb(1, 2, 3) self.assertEqual((1, 2, 3, 255), c.toTuple()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_617.py ================================================ from PySide.QtCore import QEvent from PySide.QtGui import QColor import unittest class MyEvent(QEvent): def __init__(self): QEvent.__init__(self, QEvent.Type(999)) class Bug617(unittest.TestCase): def testRepr(self): c = QColor.fromRgb(1, 2, 3, 4) s = c.spec() self.assertEqual(repr(s), repr(QColor.Rgb)) def testOutOfBounds(self): e = MyEvent() self.assertEqual(repr(e.type()), 'PySide.QtCore.QEvent.Type(999)') if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/bug_632.py ================================================ import sys from PySide.QtGui import QLineEdit, QApplication import unittest class Bug589(unittest.TestCase): def testWrongSignature(self): text = QLineEdit("PySide bug 632") a = b = c = d = 0 self.assertRaises(TypeError, text.getTextMargins, (a, b, c, d)) def testTupleReturn(self): text = QLineEdit("PySide bug 632") text.setTextMargins(10, 20, 30, 40) (a, b, c, d) = text.getTextMargins() self.assert_((a, b, c, d), (10, 20, 30, 40)) if __name__ == "__main__": app = QApplication(sys.argv) unittest.main() ================================================ FILE: tests/QtGui/bug_635.py ================================================ ''' Test bug 635: http://bugs.openbossa.org/show_bug.cgi?id=635''' import unittest from PySide.QtGui import QApplication, QToolBar, QIcon import sys class testQToolBar(unittest.TestCase): def callback(self): self._called = True def testAddAction(self): bar = QToolBar() self._called = False a = bar.addAction("act1", self.callback) a.trigger() self.assert_(self._called) def testAddActionWithIcon(self): bar = QToolBar() self._called = False icon = QIcon() a = bar.addAction(icon, "act1", self.callback) a.trigger() self.assert_(self._called) if __name__ == '__main__': app = QApplication(sys.argv) unittest.main() ================================================ FILE: tests/QtGui/bug_640.py ================================================ import sys from PySide.QtGui import * import unittest class Bug640(unittest.TestCase): def testIt(self): option = QStyleOptionGraphicsItem() a = option.state # crash!? if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/bug_652.py ================================================ import unittest from PySide.QtGui import * class MyData(QTextBlockUserData): def __init__(self, data): QTextBlockUserData.__init__(self) self.data = data def getMyNiceData(self): return self.data class TestBug652(unittest.TestCase): """Segfault when using QTextBlock::setUserData due to missing ownership transfer""" def testIt(self): td = QTextDocument() tc = QTextCursor(td) tc.insertText("Hello world") heyHo = "hey ho!" tc.block().setUserData(MyData(heyHo)) self.assertEqual(type(tc.block().userData()), MyData) self.assertEqual(tc.block().userData().getMyNiceData(), heyHo) del tc tc = QTextCursor(td) blk = tc.block() self.assertEqual(type(blk.userData()), MyData) self.assertEqual(blk.userData().getMyNiceData(), heyHo) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/bug_653.py ================================================ import unittest from PySide.QtCore import * from PySide.QtGui import * class TestBug653(unittest.TestCase): """Crash after calling QWizardPage.wizard()""" def testIt(self): app = QApplication([]) wizard = QWizard() page = QWizardPage() wizard.addPage(page) page.wizard() # crash here if the bug still exists due to a circular dependency wizard.show() if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/bug_660.py ================================================ import unittest import py3kcompat as py3k from PySide.QtGui import QStandardItemModel, QStandardItem class MyItemModel(QStandardItemModel): def __init__(self,parent=None): super(MyItemModel,self).__init__(parent) self.appendRow([QStandardItem('Item 1'),]) def mimeTypes(self): mtypes = super(MyItemModel,self).mimeTypes() mtypes.append(py3k.unicode_('application/my-form')) return mtypes def mimeData(self,indexes): self.__mimedata = super(MyItemModel,self).mimeData(indexes) self.__mimedata.setData(py3k.unicode_('application/my-form'), 'hi') return self.__mimedata class TestBug660(unittest.TestCase): '''QMimeData type deleted prematurely when overriding mime-type in QStandardItemModel drag and drop''' def testIt(self): model = MyItemModel() model.mimeData([model.index(0, 0)]) # if it doesn't raise an exception it's all right! if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_662.py ================================================ ''' Test bug 662: http://bugs.openbossa.org/show_bug.cgi?id=662''' import unittest from PySide.QtGui import QTextEdit, QApplication, QTextCharFormat import sys class testQTextBlock(unittest.TestCase): def tesIterator(self): edit = QTextEdit() cursor = edit.textCursor() fmt = QTextCharFormat() frags = [] for i in range(10): fmt.setFontPointSize(i+10) frags.append("block%d"%i) cursor.insertText(frags[i], fmt) doc = edit.document() block = doc.begin() index = 0 for i in block: self.assertEqual(i.fragment().text(), frags[index]) index += 1 if __name__ == '__main__': app = QApplication(sys.argv) unittest.main() ================================================ FILE: tests/QtGui/bug_667.py ================================================ from PySide.QtCore import * from PySide.QtGui import * class Ball(QGraphicsEllipseItem): def __init__(self, d, parent=None): super(Ball, self).__init__(0, 0, d, d, parent) self.vel = QPointF(0,0) #commenting this out prevents the crash class Foo(QGraphicsView): def __init__(self): super(Foo, self).__init__(None) self.scene = QGraphicsScene(self.rect()) self.setScene(self.scene) self.scene.addItem(Ball(10)) if __name__ == "__main__": import sys app = QApplication(sys.argv) w = Foo() w.show() w.raise_() QTimer.singleShot(0, w.close) sys.exit(app.exec_()) ================================================ FILE: tests/QtGui/bug_668.py ================================================ # coding: utf-8 from PySide.QtCore import * from PySide.QtGui import * import sys class A(QMainWindow): def __init__(self, parent=None): super(A, self).__init__(parent) a = QFileSystemModel(self) a.setRootPath(QDir.homePath()) v = QTreeView(self) v.setModel(a) self.setCentralWidget(v) app = QApplication([]) m = A() m.show() QTimer.singleShot(0, m.close) app.exec_() ================================================ FILE: tests/QtGui/bug_674.py ================================================ from PySide.QtCore import * from PySide.QtGui import * import unittest import sys class TestBug679(unittest.TestCase): '''QGraphicsScene::clear() is missing''' def testIt(self): app = QApplication([]) scene = QGraphicsScene() hello = scene.addText("Hello") scene.addText("World") self.assertEqual(sys.getrefcount(hello), 3) scene.clear() self.assertEqual(sys.getrefcount(hello), 2) self.assertEqual(len(scene.items()), 0) self.assertRaises(RuntimeError, hello.isVisible) # the C++ object was deleted if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_675.py ================================================ from PySide.QtCore import * from PySide.QtGui import * app = QApplication([]) scene = QGraphicsScene() # don't segfault due to lack of keepReferenceCall textEdit = scene.addWidget(QTextEdit()) layout = QGraphicsLinearLayout() layout.addItem(textEdit) view = QGraphicsView(scene) view.show() ================================================ FILE: tests/QtGui/bug_688.py ================================================ ''' Test bug 688: http://bugs.openbossa.org/show_bug.cgi?id=688''' import unittest from helper import UsesQApplication from PySide.QtGui import QTextFrame, QTextEdit, QTextCursor, QTextCharFormat, QFont, QTextFrameFormat class BugTest(UsesQApplication): def testCase(self): editor = QTextEdit() cursor = QTextCursor(editor.textCursor()) cursor.movePosition(QTextCursor.Start) mainFrame = cursor.currentFrame() plainCharFormat = QTextCharFormat() boldCharFormat = QTextCharFormat() boldCharFormat.setFontWeight(QFont.Bold); cursor.insertText(""" Text documents are represented by the QTextDocument class, rather than by QString objects. Each QTextDocument object contains information about the document's internal representation, its structure, and keeps track of modifications to provide undo/redo facilities. This approach allows features such as the layout management to be delegated to specialized classes, but also provides a focus for the framework.""", plainCharFormat) frameFormat = QTextFrameFormat() frameFormat.setMargin(32) frameFormat.setPadding(8) frameFormat.setBorder(4) cursor.insertFrame(frameFormat) cursor.insertText(""" Documents are either converted from external sources or created from scratch using Qt. The creation process can done by an editor widget, such as QTextEdit, or by explicit calls to the Scribe API.""", boldCharFormat) cursor = mainFrame.lastCursorPosition() cursor.insertText(""" There are two complementary ways to visualize the contents of a document: as a linear buffer that is used by editors to modify the contents, and as an object hierarchy containing structural information that is useful to layout engines. In the hierarchical model, the objects generally correspond to visual elements such as frames, tables, and lists. At a lower level, these elements describe properties such as the style of text used and its alignment. The linear representation of the document is used for editing and manipulation of the document's contents.""", plainCharFormat) frame = cursor.currentFrame() items = [] #test iterator for i in frame: items.append(i) #test __iadd__ b = frame.begin() i = 0 while not b.atEnd(): self.assertEqual(b, items[i]) self.assert_(b.parentFrame(), items[i].parentFrame()) b.__iadd__(1) i += 1 #test __isub__ b = frame.end() i = 0 while i > 0: self.assertEqual(b, items[i]) self.assert_(b.parentFrame(), items[i].parentFrame()) b.__isub__(1) i -= 1 if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_693.py ================================================ from PySide.QtCore import * from PySide.QtGui import * import unittest class MyModel (QAbstractListModel): stupidLine = QLine(0, 0, 10, 10) def rowCount(self, parent): return 1 def data(self, index, role): return self.stupidLine class TestBug693(unittest.TestCase): def testIt(self): app = QApplication([]) model = MyModel() view = QListView() view.setModel(model) view.show() # This must NOT throw the exception: # RuntimeError: Internal C++ object (PySide.QtCore.QLine) already deleted. MyModel.stupidLine.isNull() if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/bug_696.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- # # This file is part of the Shiboken Python Bindings Generator project. # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # # Contact: PySide team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public License # version 2.1 as published by the Free Software Foundation. Please # review the following information to ensure the GNU Lesser General # Public License version 2.1 requirements will be met: # http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. # # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA import sys import unittest from helper import UsesQApplication from PySide.QtGui import QMainWindow, QMenu, QApplication class MainWindow(QMainWindow): def __init__(self, *args): self._menu = QMenu(self.dontexist) # attribute called with invalid C++ object class MainWindow2(QMainWindow): def __init__(self): self.show() class Bug696(UsesQApplication): def testContructorInitialization(self): self.assertRaises(AttributeError, MainWindow) def testContructorInitializationAndCPPFunction(self): self.assertRaises(RuntimeError, MainWindow2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_711.py ================================================ import unittest from PySide.QtGui import QToolBar, QApplication, QAction, QToolButton class TestLabelPixmap(unittest.TestCase): def testReference(self): toolbar = QToolBar() for i in xrange(20): toolbar.addAction(QAction("Action %d" % i, None)) buttons = toolbar.findChildren(QToolButton, "") toolbar.clear() for b in buttons: self.assertRaises(RuntimeError, b.objectName) if __name__ == '__main__': app = QApplication([]) unittest.main() ================================================ FILE: tests/QtGui/bug_714.py ================================================ import unittest import sys from PySide.QtGui import QLabel, QApplication, QPixmap class TestLabelPixmap(unittest.TestCase): def testReference(self): l = QLabel() p = QPixmap() l.setPixmap(p) # doesn't increment pixmap ref because this makes a copy self.assertEqual(sys.getrefcount(p), 2) p = l.pixmap() # this increment the reference because this is an internal pointer self.assertEqual(sys.getrefcount(p), 3) p2 = l.pixmap() self.assertEqual(p, p2) if __name__ == '__main__': app = QApplication([]) unittest.main() ================================================ FILE: tests/QtGui/bug_716.py ================================================ from PySide.QtCore import Qt, QPersistentModelIndex from PySide.QtGui import QStringListModel if __name__ == '__main__': stringListModel = QStringListModel(['one', 'two']) idx = stringListModel.index(1, 0) persistentModelIndex = QPersistentModelIndex(idx) stringListModel.data(persistentModelIndex, Qt.DisplayRole) ================================================ FILE: tests/QtGui/bug_722.py ================================================ import unittest from helper import UsesQApplication from PySide.QtGui import QDoubleSpinBox, QGraphicsBlurEffect class TestSignalConnection(UsesQApplication): def testFloatSignal(self): foo1 = QDoubleSpinBox() foo2 = QDoubleSpinBox() foo1.valueChanged[float].connect(foo2.setValue) foo2.valueChanged[float].connect(foo1.setValue) foo1.setValue(0.42) self.assertEqual(foo1.value(), foo2.value()) def testQRealSignal(self): foo1 = QDoubleSpinBox() effect = QGraphicsBlurEffect() effect.blurRadiusChanged['qreal'].connect(foo1.setValue) # check if qreal is a valid type effect.setBlurRadius(0.42) self.assertAlmostEqual(foo1.value(), effect.blurRadius()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_728.py ================================================ from PySide.QtGui import * from PySide.QtCore import * app = QApplication([]) QTimer.singleShot(200, app.quit) # This test for a dead lock in QFileDialog.getOpenFileNames, the test fail with a timeout if the dead lock exists. QFileDialog.getOpenFileNames(None, "caption", QDir.homePath(), None, "", QFileDialog.DontUseNativeDialog) ================================================ FILE: tests/QtGui/bug_736.py ================================================ import unittest from PySide.QtCore import * from PySide.QtGui import * class TestBug736 (unittest.TestCase): def testIt(self): app = QApplication([]) slider = QSlider(Qt.Horizontal) slider2 = QSlider(Qt.Horizontal) slider2.setMaximum(10) slider.valueChanged[int].connect(slider2.setMaximum) slider.valueChanged[int].emit(100) self.assertEqual(slider2.maximum(), 100) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_740.py ================================================ import unittest import py3kcompat as py3k from helper import UsesQApplication from PySide.QtCore import QSize from PySide.QtGui import QBitmap, QImage class TestQBitmap(UsesQApplication): def testFromDataMethod(self): dataBits = py3k.b('\x38\x28\x38\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\xfe\xfe\x7c\x7c\x38\x38\x10\x10') bim = QBitmap.fromData(QSize(8, 48), dataBits, QImage.Format_Mono) # missing function if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_743.py ================================================ import unittest from PySide.QtGui import QMatrix4x4 class TestQMatrix(unittest.TestCase): def testOperator(self): m = QMatrix4x4(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) v = 1 for x in range(4): for y in range(4): self.assertEqual(m[x,y], v) v += 1 if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_750.py ================================================ import unittest from helper import UsesQApplication from PySide.QtCore import QTimer from PySide.QtGui import QPainter, QFont, QFontInfo, QWidget, qApp class MyWidget(QWidget): def paintEvent(self, e): p = QPainter(self) self._info = p.fontInfo() self._app.quit() class TestQPainter(UsesQApplication): def testFontInfo(self): w = MyWidget() w._app = self.app w._info = None QTimer.singleShot(300, w.show) self.app.exec_() self.assert_(w._info) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_778.py ================================================ import unittest from helper import UsesQApplication from PySide.QtGui import QTreeWidget, QTreeWidgetItem, QTreeWidgetItemIterator class QTreeWidgetItemIteratorTest(UsesQApplication): def testWidgetIterator(self): treeWidget = QTreeWidget() treeWidget.setColumnCount(1) items = [] for i in range(10): items.append(QTreeWidgetItem(None, ['item: %d' % i])) treeWidget.insertTopLevelItems(0, items) index = 0 for it in QTreeWidgetItemIterator(treeWidget): self.assertEqual(it.value().text(0), 'item: %d' % index) index += 1 if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_785.py ================================================ import sys import unittest from PySide.QtGui import QApplication, QStandardItemModel, QStandardItem, QItemSelection class Bug324(unittest.TestCase): def testOperators(self): model = QStandardItemModel() for i in range(100): model.appendRow(QStandardItem("Item: %d"%i)) first = model.index(0, 0) second = model.index(10, 0) third = model.index(20, 0) fourth = model.index(30, 0) sel = QItemSelection(first, second) sel2 = QItemSelection() sel2.select(third, fourth) sel3 = sel + sel2 #check operator + self.assertEqual(len(sel3), 2) sel4 = sel sel4 += sel2 #check operator += self.assertEqual(len(sel4), 2) self.assertEqual(sel4, sel3) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/bug_793.py ================================================ import unittest import sys from PySide.QtCore import QTimer from PySide.QtGui import QWidget, QApplication class TestW1(QWidget): def __init__(self, parent = None): super(TestW1, self).__init__(parent) TestW2(parent, self) class TestW2(QWidget): def __init__(self, ancestor, parent = None): super(TestW2, self).__init__(parent) self.ancestor_ref = ancestor class Test(QWidget): def __init__(self): super(Test, self).__init__() TestW1(self) class TestQApplicationDestrcutor(unittest.TestCase): def testDestructor(self): w = Test() w.show() QTimer.singleShot(0, w.close) if __name__ == '__main__': app = QApplication(sys.argv) unittest.main() sys.exit(app.exec_()) ================================================ FILE: tests/QtGui/bug_811.py ================================================ import unittest import sys import weakref from helper import UsesQApplication from PySide.QtGui import QTextBlockUserData, QTextEdit, QTextCursor class TestUserData(QTextBlockUserData): def __init__(self, data): super(TestUserData, self).__init__() self.data = data class TestUserDataRefCount(UsesQApplication): def testRefcount(self): textedit = QTextEdit() textedit.setReadOnly(True) doc = textedit.document() cursor = QTextCursor(doc) cursor.insertText("PySide Rocks") ud = TestUserData({"Life": 42}) self.assertEqual(sys.getrefcount(ud), 2) cursor.block().setUserData(ud) self.assertEqual(sys.getrefcount(ud), 3) ud2 = cursor.block().userData() self.assertEqual(sys.getrefcount(ud), 4) self.udata = weakref.ref(ud, None) del ud, ud2 self.assertEqual(sys.getrefcount(self.udata()), 2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_834.py ================================================ from PySide import QtCore, QtGui class Window(QtGui.QMainWindow): def childEvent(self, event): super(Window, self).childEvent(event) app = QtGui.QApplication([]) window = Window() dock1 = QtGui.QDockWidget() dock2 = QtGui.QDockWidget() window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dock1) window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dock2) window.tabifyDockWidget(dock1, dock2) window.show() QtCore.QTimer.singleShot(0, window.close) app.exec_() ================================================ FILE: tests/QtGui/bug_836.py ================================================ from PySide.QtCore import * from PySide.QtGui import * class Mixin1(object): pass class Mixin2(object): pass class Mixin3(object): pass class MainWindow(Mixin1, Mixin2, Mixin3, QFrame): def __init__(self): super(MainWindow, self).__init__() def main(): app = QApplication([]) # if it doesn't crash it should pass w = MainWindow() w.show() QTimer.singleShot(0, w.close) app.exec_() if __name__ == "__main__": main() ================================================ FILE: tests/QtGui/bug_844.py ================================================ from PySide.QtGui import * from PySide.QtCore import * class QtKeyPressListener(QObject): def __init__(self, obj): QObject.__init__(self) obj.installEventFilter(self) def eventFilter(self, obj, event): # This used to crash here due to a misbehaviour of type discovery! return QObject.eventFilter(self, obj, event) app = QApplication([]) key_listener = QtKeyPressListener(app) w = QLabel('Hello') w.show() QTimer.singleShot(0, w.close) app.exec_() ================================================ FILE: tests/QtGui/bug_854.py ================================================ from PySide.QtGui import QTableView, QVBoxLayout, QApplication from PySide.QtCore import QAbstractItemModel from helper import UsesQApplication import unittest class VirtualList(QAbstractItemModel): def __getitem__(self, index): self._getItemCalled = True pass def rowCount(self, parent): return 5000 def columnCount(self, parent): return 3 def index(self, row, column, parent): return self.createIndex(row, column) def parent(self, index): return QModelIndex() def data(self, index, role): return "(%i, %i)" % (index.row(), index.column()) class TestQAbstractItemModel(UsesQApplication): def testSetModel(self): model = VirtualList() model._getItemCalled = False table = QTableView() table.setModel(model) table.show() self.assertFalse(model._getItemCalled) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/bug_860.py ================================================ import sys import unittest from PySide.QtCore import QSignalMapper from PySide.QtGui import QCheckBox from helper import UsesQApplication class MultipleSlotTest(UsesQApplication): def cb_changed(self, i): self._changed = True def cb_changedVoid(self): self._changed = True def testSignalMapper(self): checkboxMapper = QSignalMapper() box = QCheckBox('check me') box.stateChanged.connect(checkboxMapper.map) checkboxMapper.setMapping(box, box.text()) checkboxMapper.mapped[str].connect(self.cb_changed) self._changed = False box.setChecked(True) self.assert_(self._changed) def testSimpleSignal(self): box = QCheckBox('check me') box.stateChanged[int].connect(self.cb_changedVoid) self._changed = False box.setChecked(True) self.assert_(self._changed) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/bug_862.py ================================================ from PySide.QtCore import QObject from PySide.QtGui import * import PySide.QtCore import unittest class MyQObject(QObject): def __init__(self): QObject.__init__(self) class MyQWidget(QWidget): def __init__(self): QWidget.__init__(self) class MyQGraphicsObject(QGraphicsObject): def __init__(self): QGraphicsObject.__init__(self) class MyQGraphicsItem(QGraphicsItem): def __init__(self): QGraphicsItem.__init__(self) class TestRepr (unittest.TestCase): def testIt(self): app = QApplication([]) self.assertEqual("<__main__.MyQObject object at ", repr(MyQObject())[:30]) self.assertEqual("<__main__.MyQWidget object at ", repr(MyQWidget())[:30]) self.assertEqual("<__main__.MyQGraphicsObject(this = 0x", repr(MyQGraphicsObject())[:37]) self.assertEqual("<__main__.MyQGraphicsItem(this = 0x", repr(MyQGraphicsItem())[:35]) self.assertEqual("> QPixmap''' def setUp(self): super(QPixmapQDatastream, self).setUp() self.source_pixmap = QPixmap(100, 100) self.source_pixmap.fill(Qt.red) self.output_pixmap = QPixmap() self.buffer = QByteArray() self.read_stream = QDataStream(self.buffer, QIODevice.ReadOnly) self.write_stream = QDataStream(self.buffer, QIODevice.WriteOnly) def testStream(self): self.write_stream << self.source_pixmap self.read_stream >> self.output_pixmap image = self.output_pixmap.toImage() pixel = image.pixel(10,10) self.assertEqual(pixel, QColor(Qt.red).rgba()) self.assertEqual(self.source_pixmap.toImage(), self.output_pixmap.toImage()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qdynamic_signal.py ================================================ import unittest from PySide.QtCore import QObject from PySide.QtGui import QInputDialog from helper import UsesQApplication class DynamicSignalTest(UsesQApplication): def cb(self, obj): self._called = True def testQDialog(self): dlg = QInputDialog() dlg.setInputMode(QInputDialog.TextInput) lst = dlg.children() self.assert_(len(lst)) obj = lst[0] self._called = False obj.destroyed[QObject].connect(self.cb) obj = None del dlg self.assert_(self._called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qfontdialog_test.py ================================================ import unittest import sys from PySide import QtGui from PySide import QtCore from helper import TimedQApplication class TestFontDialog(TimedQApplication): def testGetFont(self): QtGui.QFontDialog.getFont() def testGetFontQDialog(self): QtGui.QFontDialog.getFont(QtGui.QFont("FreeSans",10)) def testGetFontQDialogQString(self): QtGui.QFontDialog.getFont(QtGui.QFont("FreeSans",10), None, "Select font") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qfontmetrics_test.py ================================================ '''Tests for inject codes and modifications on QFontMetrics and QFontMetricsF''' import unittest from PySide.QtGui import QFont, QFontMetrics, QFontMetricsF from PySide.QtCore import QRect, QRectF, Qt, QSize, QSizeF from helper import UsesQApplication class QFontMetricsTest(UsesQApplication): '''Base class for QFontMetrics tests''' def setUp(self): super(QFontMetricsTest, self).setUp() self.font = QFont() self.metrics = QFontMetrics(self.font) def tearDown(self): del self.metrics del self.font super(QFontMetricsTest, self).tearDown() class BoundingRectTest(QFontMetricsTest): '''Tests for QFontMetrics.boundingRect inject code''' def testIntDefault(self): '''QFontMetrics.boundingRect(int, int, int, int, ...) - default args''' rect = self.metrics.boundingRect(0, 0, 0, 0, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT') self.assertTrue(isinstance(rect, QRect)) def testIntWithArg(self): '''QFontMetrics.boundingRect(int, int, int, int, ...) - single arg''' rect = self.metrics.boundingRect(0, 0, 0, 0, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 2) self.assertTrue(isinstance(rect, QRect)) def testIntWithFull(self): '''QFontMetrics.boundingRect(int, int, int, int, ...) - all argss''' rect = self.metrics.boundingRect(0, 0, 0, 0, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 20, [1, 2, 3, 4, 5]) self.assertTrue(isinstance(rect, QRect)) def testIntTypeError(self): '''QFontMetrics.boundingRect(int, int, int, int, ...) - type error''' self.assertRaises(TypeError, self.metrics.boundingRect, 0, 0, 0, 0, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 20, ['aaaa', 'ase']) def testQRectDefault(self): '''QFontMetrics.boundingRect(QRect, ...) - default args''' arg = QRect(0, 0, 100, 200) rect = self.metrics.boundingRect(arg, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT') self.assertTrue(isinstance(rect, QRect)) def testQRectWithArg(self): '''QFontMetrics.boundingRect(QRect, ...) - only tabstops''' arg = QRect(0, 0, 100, 200) rect = self.metrics.boundingRect(arg, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 2) self.assertTrue(isinstance(rect, QRect)) def testQRectWithFull(self): '''QFontMetrics.boundingRect(QRect, ...) - all arguments''' arg = QRect(0, 0, 100, 200) rect = self.metrics.boundingRect(arg, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 20, [1, 2, 3, 4, 5]) self.assertTrue(isinstance(rect, QRect)) def testQRectTypeError(self): '''QFontMetrics.boundingRect(QRect, ...) - type error''' arg = QRect(0, 0, 100, 200) self.assertRaises(TypeError, self.metrics.boundingRect, arg, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 20, ['aaaa', 'ase']) class SizeTest(QFontMetricsTest): '''Tests for QFontMetrics.size inject code''' def testDefault(self): '''QFontMetrics.size - default arguments''' size = self.metrics.size(Qt.TextExpandTabs | Qt.TextSingleLine, 'PySide by INdT') self.assertTrue(isinstance(size, QSize)) def testWithTabStops(self): '''QFontMetrics.size - only tabstops''' size = self.metrics.size(Qt.TextExpandTabs | Qt.TextSingleLine, 'PySide by INdT', 2) self.assertTrue(isinstance(size, QSize)) def testFull(self): '''QFontMetrics.size - all arguments''' size = self.metrics.size(Qt.TextExpandTabs | Qt.TextSingleLine, 'PySide by INdT', 2, [1, 2, 3, 4]) self.assertTrue(isinstance(size, QSize)) def testTypeError(self): '''QFontMetrics.size - type error''' self.assertRaises(TypeError, self.metrics.size, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 20, ['aaaa', 'ase']) class QFontMetricsFTest(UsesQApplication): '''Base class for QFontMetrics tests''' def setUp(self): super(QFontMetricsFTest, self).setUp() self.font = QFont() self.metrics = QFontMetricsF(self.font) def tearDown(self): del self.metrics del self.font super(QFontMetricsFTest, self).tearDown() class FBoundingRectTest(QFontMetricsFTest): '''Tests for QFontMetricsF.boundingRect inject code''' def testQRectDefault(self): '''QFontMetricsF.boundingRect(QRectF, ...) - default args''' arg = QRectF(0, 0, 100, 200) rect = self.metrics.boundingRect(arg, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT') self.assertTrue(isinstance(rect, QRectF)) def testQRectWithArg(self): '''QFontMetricsF.boundingRect(QRectF, ...) - only tabstops''' arg = QRectF(0, 0, 100, 200) rect = self.metrics.boundingRect(arg, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 2) self.assertTrue(isinstance(rect, QRectF)) def testQRectWithFull(self): '''QFontMetricsF.boundingRect(QRectF, ...) - all arguments''' arg = QRectF(0, 0, 100, 200) rect = self.metrics.boundingRect(arg, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 20, [1, 2, 3, 4, 5]) self.assertTrue(isinstance(rect, QRectF)) def testQRectTypeError(self): '''QFontMetricsF.boundingRect(QRectF, ...) - type error''' arg = QRectF(0, 0, 100, 200) self.assertRaises(TypeError, self.metrics.boundingRect, arg, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 20, ['aaaa', 'ase']) class FSizeTest(QFontMetricsFTest): '''Tests for QFontMetricsF.size inject code''' def testDefault(self): '''QFontMetricsF.size - default arguments''' size = self.metrics.size(Qt.TextExpandTabs | Qt.TextSingleLine, 'PySide by INdT') self.assertTrue(isinstance(size, QSizeF)) def testWithTabStops(self): '''QFontMetricsF.size - only tabstops''' size = self.metrics.size(Qt.TextExpandTabs | Qt.TextSingleLine, 'PySide by INdT', 2) self.assertTrue(isinstance(size, QSizeF)) def testFull(self): '''QFontMetricsF.size - all arguments''' size = self.metrics.size(Qt.TextExpandTabs | Qt.TextSingleLine, 'PySide by INdT', 2, [1, 2, 3, 4]) self.assertTrue(isinstance(size, QSizeF)) def testTypeError(self): '''QFontMetricsF.size - type error''' self.assertRaises(TypeError, self.metrics.size, Qt.TextExpandTabs | Qt.AlignLeft, 'PySide by INdT', 20, ['aaaa', 'ase']) class QCharTest(QFontMetricsFTest): def testBoundingRect(self): retCh = self.metrics.boundingRectChar('a') self.assertEqual(type(retCh), QRectF) def testWith(self): retCh = self.metrics.widthChar('a') self.assertTrue(retCh > 0) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qformlayout_test.py ================================================ import unittest from PySide.QtGui import QFormLayout, QWidget from helper import UsesQApplication class QFormLayoutTest(UsesQApplication): def testGetItemPosition(self): formlayout = QFormLayout() row, role = formlayout.getItemPosition(0) self.assert_(isinstance(row, int)) self.assert_(isinstance(role, QFormLayout.ItemRole)) self.assertEqual(row, -1) widget = QWidget() formlayout.addRow(widget) row, role = formlayout.getItemPosition(0) self.assert_(isinstance(row, int)) self.assert_(isinstance(role, QFormLayout.ItemRole)) self.assertEqual(row, 0) self.assertEqual(role, QFormLayout.SpanningRole) def testGetWidgetPosition(self): formlayout = QFormLayout() widget = QWidget() row, role = formlayout.getWidgetPosition(widget) self.assert_(isinstance(row, int)) self.assert_(isinstance(role, QFormLayout.ItemRole)) self.assertEqual(row, -1) formlayout.addRow(widget) row, role = formlayout.getWidgetPosition(widget) self.assert_(isinstance(row, int)) self.assert_(isinstance(role, QFormLayout.ItemRole)) self.assertEqual(row, 0) self.assertEqual(role, QFormLayout.SpanningRole) def testGetLayoutPosition(self): formlayout = QFormLayout() layout = QFormLayout() row, role = formlayout.getLayoutPosition(layout) self.assert_(isinstance(row, int)) self.assert_(isinstance(role, QFormLayout.ItemRole)) self.assertEqual(row, -1) formlayout.addRow(layout) row, role = formlayout.getLayoutPosition(layout) self.assert_(isinstance(row, int)) self.assert_(isinstance(role, QFormLayout.ItemRole)) self.assertEqual(row, 0) self.assertEqual(role, QFormLayout.SpanningRole) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/qgraphicsitem_isblocked_test.py ================================================ #!/usr/bin/python import unittest from PySide import QtCore from PySide import QtGui from helper import UsesQApplication class Item(QtGui.QGraphicsItem): def __init__(self): QtGui.QGraphicsItem.__init__(self) def boundingRect(self): return QtCore.QRectF(0, 0, 100, 100) def paint(self, painter, option, widget): painter.setBrush(QtGui.QColor(255, 255, 255)) painter.drawRect(0, 0, 100, 100) class QGraphicsViewIsBlockedTest(UsesQApplication): def testIsBlockedByModalPanel(self): (first, second) = Item().isBlockedByModalPanel() self.assertFalse(first) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/qgraphicsitem_test.py ================================================ ''' Test cases related to QGraphicsItem and subclasses''' import unittest from PySide.QtGui import QGraphicsScene, QPolygonF, QColor, QBrush from helper import UsesQApplication class QColorOnSetBrush(UsesQApplication): '''Test case for passing a QColor directly to setBrush''' def setUp(self): #Acquire resources super(QColorOnSetBrush, self).setUp() self.scene = QGraphicsScene() poly = QPolygonF() self.item = self.scene.addPolygon(poly) self.color = QColor('black') def tearDown(self): #Release resources del self.color del self.item del self.scene super(QColorOnSetBrush, self).tearDown() def testQColor(self): #QGraphicsAbstractShapeItem.setBrush(QColor) self.item.setBrush(self.color) self.assertEqual(QBrush(self.color), self.item.brush()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qgraphicsproxywidget_test.py ================================================ import unittest from helper import UsesQApplication from PySide.QtCore import Qt, QTimer from PySide.QtGui import QLabel, QPainter from PySide.QtGui import QGraphicsScene, QGraphicsView, QGraphicsItem, QGraphicsProxyWidget class QGraphicsProxyWidgetTest(UsesQApplication): def testQGraphicsProxyWidget(self): scene = QGraphicsScene() proxy = QGraphicsProxyWidget(None, Qt.Window) widget = QLabel('Widget') proxy.setWidget(widget) proxy.setCacheMode(QGraphicsItem.DeviceCoordinateCache) scene.addItem(proxy) scene.setSceneRect(scene.itemsBoundingRect()) view = QGraphicsView(scene) view.setRenderHints(QPainter.Antialiasing|QPainter.SmoothPixmapTransform) view.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate) view.show() timer = QTimer.singleShot(100, self.app.quit) self.app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qgraphicsscene_test.py ================================================ '''Basic test cases for QGraphicsScene''' import unittest import gc from PySide.QtCore import QPointF from PySide.QtGui import QApplication, QPushButton, QPolygonF, QPixmap from PySide.QtGui import QGraphicsScene, QPainterPath from PySide.QtGui import QGraphicsEllipseItem, QGraphicsLineItem from PySide.QtGui import QGraphicsPathItem, QGraphicsPixmapItem from PySide.QtGui import QGraphicsPolygonItem, QGraphicsRectItem from PySide.QtGui import QGraphicsSimpleTextItem, QGraphicsTextItem from PySide.QtGui import QGraphicsProxyWidget from helper import UsesQApplication class Constructor(unittest.TestCase): '''QGraphicsScene constructor''' def testConstructor(self): #QGraphicsScene constructor obj = QGraphicsScene() self.assertTrue(isinstance(obj, QGraphicsScene)) class ConstructorWithRect(unittest.TestCase): '''QGraphicsScene qrect constructor and related sizes''' def setUp(self): #Acquire resources # PyQt4 doesn't accept a QRect as argument to constructor self.scene = QGraphicsScene(0, 200, 150, 175) def tearDown(self): #Release resources del self.scene def testHeight(self): #QGraphicsScene.height() self.assertEqual(self.scene.height(), 175) def testWidth(self): #QGraphicsScene.width() self.assertEqual(self.scene.width(), 150) class AddItem(UsesQApplication): '''Tests for QGraphicsScene.add*''' qapplication = True def setUp(self): #Acquire resources super(AddItem, self).setUp() self.scene = QGraphicsScene() # While the scene does not inherits from QWidget, requires # an application to make the internals work. def tearDown(self): #Release resources del self.scene super(AddItem, self).tearDown() def testEllipse(self): #QGraphicsScene.addEllipse item = self.scene.addEllipse(100, 100, 100, 100) self.assertTrue(isinstance(item, QGraphicsEllipseItem)) def testLine(self): #QGraphicsScene.addLine item = self.scene.addLine(100, 100, 200, 200) self.assertTrue(isinstance(item, QGraphicsLineItem)) def testPath(self): #QGraphicsScene.addPath item = self.scene.addPath(QPainterPath()) self.assertTrue(isinstance(item, QGraphicsPathItem)) def testPixmap(self): #QGraphicsScene.addPixmap item = self.scene.addPixmap(QPixmap()) self.assertTrue(isinstance(item, QGraphicsPixmapItem)) def testPolygon(self): #QGraphicsScene.addPolygon points = [QPointF(0, 0), QPointF(100, 100), QPointF(0, 100)] item = self.scene.addPolygon(QPolygonF(points)) self.assertTrue(isinstance(item, QGraphicsPolygonItem)) def testRect(self): #QGraphicsScene.addRect item = self.scene.addRect(100, 100, 100, 100) self.assertTrue(isinstance(item, QGraphicsRectItem)) def testSimpleText(self): #QGraphicsScene.addSimpleText item = self.scene.addSimpleText('Monty Python 42') self.assertTrue(isinstance(item, QGraphicsSimpleTextItem)) def testText(self): #QGraphicsScene.addText item = self.scene.addText('Monty Python 42') self.assertTrue(isinstance(item, QGraphicsTextItem)) def testWidget(self): #QGraphicsScene.addWidget # XXX: printing some X11 error when using under PyQt4 item = self.scene.addWidget(QPushButton()) self.assertTrue(isinstance(item, QGraphicsProxyWidget)) class ItemRetrieve(UsesQApplication): '''Tests for QGraphicsScene item retrieval methods''' qapplication = True def setUp(self): #Acquire resources super(ItemRetrieve, self).setUp() self.scene = QGraphicsScene() self.topleft = QGraphicsRectItem(0, 0, 100, 100) self.topright = QGraphicsRectItem(100, 0, 100, 100) self.bottomleft = QGraphicsRectItem(0, 100, 100, 100) self.bottomright = QGraphicsRectItem(100, 100, 100, 100) self.items = [self.topleft, self.topright, self.bottomleft, self.bottomright] for item in self.items: self.scene.addItem(item) def tearDown(self): #Release resources del self.scene super(ItemRetrieve, self).tearDown() def testItems(self): #QGraphicsScene.items() items = self.scene.items() for i in items: self.assertTrue(i in self.items) def testItemAt(self): #QGraphicsScene.itemAt() self.assertEqual(self.scene.itemAt(50, 50), self.topleft) self.assertEqual(self.scene.itemAt(150, 50), self.topright) self.assertEqual(self.scene.itemAt(50, 150), self.bottomleft) self.assertEqual(self.scene.itemAt(150, 150), self.bottomright) class TestGraphicsGroup(UsesQApplication): def testIt(self): scene = QGraphicsScene() i1 = QGraphicsRectItem() scene.addItem(i1) i2 = QGraphicsRectItem(i1) i3 = QGraphicsRectItem() i4 = QGraphicsRectItem() group = scene.createItemGroup((i2, i3, i4)) scene.removeItem(i1) del i1 # this shouldn't delete i2 self.assertEqual(i2.scene(), scene) scene.destroyItemGroup(group) self.assertRaises(RuntimeError, group.type) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qicon_test.py ================================================ import unittest from helper import TimedQApplication from PySide.QtGui import QIcon class QIconCtorWithNoneTest(TimedQApplication): '''Test made by seblin, see Bug #944: http://bugs.pyside.org/show_bug.cgi?id=944''' def testQIconCtorWithNone(self): icon = QIcon(None) pixmap = icon.pixmap(48, 48) self.app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qimage_test.py ================================================ '''Test cases for QImage''' import unittest import py3kcompat as py3k from PySide.QtGui import * from helper import UsesQApplication, adjust_filename xpm = [ "27 22 206 2", " c None", ". c #FEFEFE", "+ c #FFFFFF", "@ c #F9F9F9", "# c #ECECEC", "$ c #D5D5D5", "% c #A0A0A0", "& c #767676", "* c #525252", "= c #484848", "- c #4E4E4E", "; c #555555", "> c #545454", ", c #5A5A5A", "' c #4B4B4B", ") c #4A4A4A", "! c #4F4F4F", "~ c #585858", "{ c #515151", "] c #4C4C4C", "^ c #B1B1B1", "/ c #FCFCFC", "( c #FDFDFD", "_ c #C1C1C1", ": c #848484", "< c #616161", "[ c #5E5E5E", "} c #CECECE", "| c #E2E2E2", "1 c #E4E4E4", "2 c #DFDFDF", "3 c #D2D2D2", "4 c #D8D8D8", "5 c #D4D4D4", "6 c #E6E6E6", "7 c #F1F1F1", "8 c #838383", "9 c #8E8E8E", "0 c #8F8F8F", "a c #CBCBCB", "b c #CCCCCC", "c c #E9E9E9", "d c #F2F2F2", "e c #EDEDED", "f c #B5B5B5", "g c #A6A6A6", "h c #ABABAB", "i c #BBBBBB", "j c #B0B0B0", "k c #EAEAEA", "l c #6C6C6C", "m c #BCBCBC", "n c #F5F5F5", "o c #FAFAFA", "p c #B6B6B6", "q c #F3F3F3", "r c #CFCFCF", "s c #FBFBFB", "t c #CDCDCD", "u c #DDDDDD", "v c #999999", "w c #F0F0F0", "x c #2B2B2B", "y c #C3C3C3", "z c #A4A4A4", "A c #D7D7D7", "B c #E7E7E7", "C c #6E6E6E", "D c #9D9D9D", "E c #BABABA", "F c #AEAEAE", "G c #898989", "H c #646464", "I c #BDBDBD", "J c #CACACA", "K c #2A2A2A", "L c #212121", "M c #B7B7B7", "N c #F4F4F4", "O c #737373", "P c #828282", "Q c #4D4D4D", "R c #000000", "S c #151515", "T c #B2B2B2", "U c #D6D6D6", "V c #D3D3D3", "W c #2F2F2F", "X c #636363", "Y c #A1A1A1", "Z c #BFBFBF", "` c #E0E0E0", " . c #6A6A6A", ".. c #050505", "+. c #A3A3A3", "@. c #202020", "#. c #5F5F5F", "$. c #B9B9B9", "%. c #C7C7C7", "&. c #D0D0D0", "*. c #3E3E3E", "=. c #666666", "-. c #DBDBDB", ";. c #424242", ">. c #C2C2C2", ",. c #1A1A1A", "'. c #2C2C2C", "). c #F6F6F6", "!. c #AAAAAA", "~. c #DCDCDC", "{. c #2D2D2D", "]. c #2E2E2E", "^. c #A7A7A7", "/. c #656565", "(. c #333333", "_. c #464646", ":. c #C4C4C4", "<. c #B8B8B8", "[. c #292929", "}. c #979797", "|. c #EFEFEF", "1. c #909090", "2. c #8A8A8A", "3. c #575757", "4. c #676767", "5. c #C5C5C5", "6. c #7A7A7A", "7. c #797979", "8. c #989898", "9. c #EEEEEE", "0. c #707070", "a. c #C8C8C8", "b. c #111111", "c. c #AFAFAF", "d. c #474747", "e. c #565656", "f. c #E3E3E3", "g. c #494949", "h. c #5B5B5B", "i. c #222222", "j. c #353535", "k. c #D9D9D9", "l. c #0A0A0A", "m. c #858585", "n. c #E5E5E5", "o. c #0E0E0E", "p. c #9A9A9A", "q. c #6F6F6F", "r. c #868686", "s. c #060606", "t. c #1E1E1E", "u. c #E8E8E8", "v. c #A5A5A5", "w. c #0D0D0D", "x. c #030303", "y. c #272727", "z. c #131313", "A. c #1F1F1F", "B. c #757575", "C. c #F7F7F7", "D. c #414141", "E. c #080808", "F. c #6B6B6B", "G. c #313131", "H. c #C0C0C0", "I. c #C9C9C9", "J. c #0B0B0B", "K. c #232323", "L. c #434343", "M. c #3D3D3D", "N. c #282828", "O. c #7C7C7C", "P. c #252525", "Q. c #3A3A3A", "R. c #F8F8F8", "S. c #1B1B1B", "T. c #949494", "U. c #3B3B3B", "V. c #242424", "W. c #383838", "X. c #6D6D6D", "Y. c #818181", "Z. c #939393", "`. c #9E9E9E", " + c #929292", ".+ c #7D7D7D", "++ c #ADADAD", "@+ c #DADADA", "#+ c #919191", "$+ c #E1E1E1", "%+ c #BEBEBE", "&+ c #ACACAC", "*+ c #9C9C9C", "=+ c #B3B3B3", "-+ c #808080", ";+ c #A8A8A8", ">+ c #393939", ",+ c #747474", "'+ c #7F7F7F", ")+ c #D1D1D1", "!+ c #606060", "~+ c #5C5C5C", "{+ c #686868", "]+ c #7E7E7E", "^+ c #787878", "/+ c #595959", ". . . + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / . . + + ", ". ( + _ : < [ & } | 1 2 $ 3 4 5 3 6 7 + + 8 9 + . + . ", ". + 0 9 a ( 3 a b c d e c f g h i g j $ k + l m + . + ", "+ 2 8 n o p | ( q r s . # t + + + u ^ v e w + x + + + ", "+ y z . @ A k B 7 n + ( s | p 8 C D 2 E 4 + + F G + . ", "# H I $ J G K L - M N . 2 O P Q R R S T U s s V W j + ", "X Y Z @ o ` _ g ...+.( 4 @.#.m G $.%.7 &.X *.=.-.;.&.", "Q >.C ,.'.} e + ).!.k + . + + . ~.{.> ].x f 7 ^./.k (.", "_.:.4 @ <.[.}.|.1.2.+ + + >.} 4 B + ( @ _ 3.4.5.6.r 7.", "3.8.9.~ 0.+ a.Q b.+ + c.d.#.=.$ |.b #.e.z ^ ; ^. .f.g.", "-.h.+ i.S M + # p j.% n 9.5.k.H l.m.V ^.n.o.M + M p.q.", "7 r.N s.1.R t.<.|.| u.v.~ w.x.E + s y.z.A.B.C.+ 5 D.q ", ").p.2 E.0.9 F.%.O {._ @.+ + i { [ i.G.H.P I.+ s q.} + ", ").p.6 J.R b.K.L.M.A.! b.g.K [.R M k + N.I + + >.O.+ . ", ").8.9.N.P...R R R R E.t.W n.+ Q.R.6 @.| + . + S.+ + . ", "n }.w T.U.B.<.i.@ Y + + U.+ c u V.= B B 7 u.W.c + . + ", "N T.# + }.X.Y.,.8.F.8 Z.[.`. +.+}.4 ++@+O.< ~.+ ( . + ", "d #+1 + _ ~.u.$+b $.y @+| $+%+I.&+k.h W +.9.+ ( . + . ", "w 0 |.*+. >.<.=+++++p a.p -+;+5.k.>+,+@ + . . + . + + ", "q '+9.R.^ I.t b %.I.)+4 $+n.I.,+ .|.+ . . . + . + + + ", ". p !+( + + + + + + E 0. .-+8.f.+ + . . + + . + + + + ", ". ( A ~+{+]+^+l > /+D f.c q . + . . + + . + + + + + + " ] class QImageTest(UsesQApplication): '''Test case for calling setPixel with float as argument''' def testQImageStringBuffer(self): '''Test if the QImage signatures receiving string buffers exist.''' img0 = QImage(adjust_filename('sample.png', __file__)) # btw let's test the bits() method img1 = QImage(img0.bits(), img0.width(), img0.height(), img0.format()) self.assertEqual(img0, img1) img2 = QImage(img0.bits(), img0.width(), img0.height(), img0.bytesPerLine(), img0.format()) self.assertEqual(img0, img2) ## test scanLine method data1 = img0.scanLine(0) data2 = img1.scanLine(0) self.assertEqual(data1, data2) # PySide python 3.x does not support slice yet if not py3k.IS_PY3K: buff = py3k.buffer(img0.bits()[:img0.bytesPerLine()]) self.assertEqual(data1, buff) self.assertEqual(data2, buff) def testEmptyBuffer(self): img = QImage(py3k.buffer(''), 100, 100, QImage.Format_ARGB32) def testEmptyStringAsBuffer(self): img = QImage(py3k.b(''), 100, 100, QImage.Format_ARGB32) def testXpmConstructor(self): label = QLabel() img = QImage(xpm) self.assertFalse(img.isNull()) self.assertEqual(img.width(), 27) self.assertEqual(img.height(), 22) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qinputcontext_test.py ================================================ import unittest from PySide.QtCore import Qt from PySide.QtGui import QPushButton from helper import UsesQApplication class QInputContextTest(UsesQApplication): def testSetFocusWidget(self): widget = QPushButton() widget.show() context = self.app.inputContext() self.assertEqual(context.focusWidget(), None) if not widget.testAttribute(Qt.WA_InputMethodEnabled): widget.setAttribute(Qt.WA_InputMethodEnabled) context.setFocusWidget(widget) self.assertEqual(context.focusWidget(), widget) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qinputdialog_get_test.py ================================================ import unittest from PySide import QtCore, QtGui from helper import UsesQApplication, TimedQApplication class TestInputDialog(TimedQApplication): def testGetDouble(self): self.assertEquals(QtGui.QInputDialog.getDouble(None, "title", "label"), (0.0, False)) def testGetInt(self): self.assertEquals(QtGui.QInputDialog.getInt(None, "title", "label"), (0, False)) def testGetInteger(self): self.assertEquals(QtGui.QInputDialog.getInteger(None, "title", "label"), (0, False)) def testGetItem(self): (item, bool) = QtGui.QInputDialog.getItem(None, "title", "label", ["1", "2", "3"]) self.assertEquals(str(item), "1") def testGetText(self): (text, bool) = QtGui.QInputDialog.getText(None, "title", "label") self.assertEquals(str(text),"") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qitemselection_test.py ================================================ import unittest from helper import UsesQApplication from PySide.QtGui import QItemSelection, QStandardItemModel class QItemSelectionTest(UsesQApplication): def testLen(self): model = QStandardItemModel(2, 2) model.insertRow(0) model.insertRow(1) model.insertColumn(0) model.insertColumn(1) selection = QItemSelection(model.index(0,0), model.index(1,1)) self.assertEqual(len(selection), 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qkeysequence_test.py ================================================ import unittest from PySide.QtCore import Qt from PySide.QtGui import QKeySequence from helper import UsesQApplication class QKeySequenceTest(UsesQApplication): def testGetItemOperator(self): # bug #774 ks = QKeySequence(Qt.SHIFT, Qt.CTRL, Qt.Key_P, Qt.Key_R) self.assertEqual(ks[0], Qt.SHIFT) self.assertEqual(ks[1], Qt.CTRL) self.assertEqual(ks[2], Qt.Key_P) self.assertEqual(ks[3], Qt.Key_R) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qlayout_ref_test.py ================================================ '''Test cases for QLayout handling of child widgets references''' import unittest from sys import getrefcount from PySide.QtGui import QHBoxLayout, QVBoxLayout, QGridLayout, QWidget from PySide.QtGui import QStackedLayout, QFormLayout from PySide.QtGui import QApplication, QPushButton, QLabel from helper import UsesQApplication class SaveReference(UsesQApplication): '''Test case to check if QLayout-derived classes increment the refcount of widgets passed to addWidget()''' # Adding here as nose can't see the qapplication attrib we inherit qapplication = True def setUp(self): #Acquire resources super(SaveReference, self).setUp() self.widget1 = QPushButton('click me') self.widget2 = QLabel('aaa') def tearDown(self): #Release resources del self.widget2 del self.widget1 super(SaveReference, self).tearDown() def checkLayoutReference(self, layout): #Checks the reference cound handling of layout.addWidget self.assertEqual(getrefcount(self.widget1), 2) layout.addWidget(self.widget1) self.assertEqual(getrefcount(self.widget1), 3) self.assertEqual(getrefcount(self.widget2), 2) layout.addWidget(self.widget2) self.assertEqual(getrefcount(self.widget2), 3) # Check if doesn't mess around with previous widget refcount self.assertEqual(getrefcount(self.widget1), 3) def testMoveLayout(self): l = QHBoxLayout() self.assertEqual(getrefcount(self.widget1), 2) l.addWidget(self.widget1) self.assertEqual(getrefcount(self.widget1), 3) w = QWidget() w.setLayout(l) self.assertEqual(getrefcount(self.widget1), 3) def testHBoxReference(self): #QHBoxLayout.addWidget reference count w = QWidget() self.checkLayoutReference(QHBoxLayout(w)) def testVBoxReference(self): #QVBoxLayout.addWidget reference count w = QWidget() self.checkLayoutReference(QVBoxLayout(w)) def testGridReference(self): #QGridLayout.addWidget reference count w = QWidget() self.checkLayoutReference(QGridLayout(w)) def testFormReference(self): #QFormLayout.addWidget reference count w = QWidget() self.checkLayoutReference(QFormLayout(w)) def testStackedReference(self): #QStackedLayout.addWidget reference count w = QWidget() self.checkLayoutReference(QStackedLayout(w)) class MultipleAdd(UsesQApplication): '''Test case to check if refcount is incremented only once when multiple calls to addWidget are made with the same widget''' qapplication = True def setUp(self): #Acquire resources super(MultipleAdd, self).setUp() self.widget = QPushButton('click me') self.win = QWidget() self.layout = QHBoxLayout(self.win) def tearDown(self): #Release resources del self.widget del self.layout del self.win super(MultipleAdd, self).tearDown() def testRefCount(self): #Multiple QLayout.addWidget calls on the same widget self.assertEqual(getrefcount(self.widget), 2) self.layout.addWidget(self.widget) self.assertEqual(getrefcount(self.widget), 3) self.layout.addWidget(self.widget) self.assertEqual(getrefcount(self.widget), 3) self.layout.addWidget(self.widget) self.assertEqual(getrefcount(self.widget), 3) class InternalAdd(UsesQApplication): def testInternalRef(self): mw = QWidget() w = QWidget() ow = QWidget() topLayout = QGridLayout() # unique reference self.assertEqual(getrefcount(w), 2) self.assertEqual(getrefcount(ow), 2) topLayout.addWidget(w, 0, 0) topLayout.addWidget(ow, 1, 0) # layout keep the referemce self.assertEqual(getrefcount(w), 3) self.assertEqual(getrefcount(ow), 3) mainLayout = QGridLayout() mainLayout.addLayout(topLayout, 1, 0, 1, 4) # the same reference self.assertEqual(getrefcount(w), 3) self.assertEqual(getrefcount(ow), 3) mw.setLayout(mainLayout) # now trasfer the ownership to mw self.assertEqual(getrefcount(w), 3) self.assertEqual(getrefcount(ow), 3) del mw # remove the ref and invalidate the widget self.assertEqual(getrefcount(w), 2) self.assertEqual(getrefcount(ow), 2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qlayout_test.py ================================================ import unittest import sys from helper import UsesQApplication from PySide.QtCore import * from PySide.QtGui import * class MyLayout(QLayout): def __init__(self, parent=None): QLayout.__init__(self, parent) self._list = [] def addItem(self, item): self.add(item) def addWidget(self, widget): self.add(QWidgetItem(widget)) def itemAt(self, index): if index < len(self._list): return self._list[index] return None def count(self): return len(self._list) def add(self, item): self._list.append(item) class MissingItemAtLayout(QLayout): def __init__(self, parent=None): QLayout.__init__(self, parent) self._list = [] def addItem(self, item): self.add(item) def addWidget(self, widget): self.add(QWidgetItem(widget)) def count(self): return len(self._list) def add(self, item): self._list.append(item) #Test if a layout implemented in python, the QWidget.setLayout works #fine because this implement som layout functions used in glue code of #QWidget, then in c++ when call a virtual function this need call the QLayout #function implemented in python class QLayoutTest(UsesQApplication): def testOwnershipTransfer(self): b = QPushButton("teste") l = MyLayout() l.addWidget(b) self.assertEqual(sys.getrefcount(b), 2) w = QWidget() #transfer ref w.setLayout(l) self.assertEqual(sys.getrefcount(b), 3) def testReferenceTransfer(self): b = QPushButton("teste") l = QHBoxLayout() # keep ref l.addWidget(b) self.assertEqual(sys.getrefcount(b), 3) w = QWidget() # transfer ref w.setLayout(l) self.assertEqual(sys.getrefcount(b), 3) # release ref del w self.assertEqual(sys.getrefcount(b), 2) def testMissingFunctions(self): w = QWidget() b = QPushButton("test") l = MissingItemAtLayout() l.addWidget(b) self.assertRaises(RuntimeError, w.setLayout, l) def testQFormLayout(self): w = QWidget() formLayout = QFormLayout() spacer = QSpacerItem(100, 30) formLayout.setItem(0, QFormLayout.SpanningRole, spacer) w.setLayout(formLayout) w.show() QTimer.singleShot(10, w.close) self.app.exec_() del w self.assertRaises(RuntimeError, spacer.isEmpty) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qlcdnumber_test.py ================================================ import unittest from PySide.QtGui import QApplication, QLCDNumber class QLCDNumberOverflow(unittest.TestCase): '''Test case for unhandled overflow on QLCDNumber() numDigits argument (see bug #215).''' def setUp(self): self.app = QApplication([]) def testnumDigitsOverflow(self): # NOTE: PyQt4 raises TypeError, but boost.python raises OverflowError self.assertRaises(OverflowError, QLCDNumber, 840835495615213080) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qlistwidget_test.py ================================================ import unittest import sys from PySide import QtGui, QtCore from helper import UsesQApplication class QListWidgetTest(UsesQApplication): def populateList(self, lst): o = QtCore.QObject() o.setObjectName("obj") item = QtGui.QListWidgetItem("item0") item.setData(QtCore.Qt.UserRole, o) #item._data = o self.assert_(sys.getrefcount(o), 3) self.assert_(sys.getrefcount(item), 2) lst.addItem(item) self.assert_(sys.getrefcount(item), 3) def checkCurrentItem(self, lst): item = lst.currentItem() self.assert_(sys.getrefcount(item), 3) def checkItemData(self, lst): item = lst.currentItem() o = item.data(QtCore.Qt.UserRole) self.assert_(sys.getrefcount(o), 4) self.assertEqual(o, item._data) self.assert_(sys.getrefcount(o), 2) def testConstructorWithParent(self): lst = QtGui.QListWidget() self.populateList(lst) self.checkCurrentItem(lst) i = lst.item(0) self.assert_(sys.getrefcount(i), 3) del lst self.assert_(sys.getrefcount(i), 2) del i def testIt(self): lst = QtGui.QListWidget() lst.show() slot = lambda : lst.removeItemWidget(lst.currentItem()) lst.addItem(QtGui.QListWidgetItem("foo")) QtCore.QTimer.singleShot(0, slot) QtCore.QTimer.singleShot(0, lst.close) self.app.exec_() self.assertEqual(lst.count(), 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qlistwidgetitem_test.py ================================================ import unittest from PySide import QtGui from helper import UsesQApplication class QListWidgetItemConstructor(UsesQApplication): def setUp(self): super(QListWidgetItemConstructor, self).setUp() self.widgetList = QtGui.QListWidget() def tearDown(self): del self.widgetList super(QListWidgetItemConstructor, self).tearDown() def testConstructorWithParent(self): # Bug 235 - QListWidgetItem constructor not saving ownership QtGui.QListWidgetItem(self.widgetList) item = self.widgetList.item(0) self.assertEqual(item.listWidget(), self.widgetList) def testConstructorWithNone(self): # Bug 452 - QListWidgetItem() not casting NoneType to null correctly. item = QtGui.QListWidgetItem(None, 123) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qmainwindow_test.py ================================================ import unittest import sys import weakref from PySide import QtGui from PySide import QtCore from helper import UsesQApplication class MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.createToolbar() def createToolbar(self): pointerButton = QtGui.QToolButton() pointerToolbar = self.addToolBar("Pointer type") pointerToolbar.addWidget(pointerButton) class MyButton(QtGui.QPushButton): def __init__(self, parent=None): QtGui.QPushButton.__init__(self) self._called = False def myCallback(self): self._called = True class TestMainWindow(UsesQApplication): def testCreateToolbar(self): w = MainWindow() w.show() QtCore.QTimer.singleShot(1000, self.app.quit) self.app.exec_() def objDel(self, obj): self.app.quit() def testRefCountToNull(self): w = QtGui.QMainWindow() c = QtGui.QWidget() self.assertEqual(sys.getrefcount(c), 2) w.setCentralWidget(c) self.assertEqual(sys.getrefcount(c), 3) wr = weakref.ref(c, self.objDel) w.setCentralWidget(None) c = None self.app.exec_() def testRefCountToAnother(self): w = QtGui.QMainWindow() c = QtGui.QWidget() self.assertEqual(sys.getrefcount(c), 2) w.setCentralWidget(c) self.assertEqual(sys.getrefcount(c), 3) c2 = QtGui.QWidget() w.setCentralWidget(c2) self.assertEqual(sys.getrefcount(c2), 3) wr = weakref.ref(c, self.objDel) w.setCentralWidget(None) c = None self.app.exec_() def testSignalDisconect(self): w = QtGui.QMainWindow() b = MyButton("button") b.clicked.connect(b.myCallback) w.setCentralWidget(b) b = MyButton("button") b.clicked.connect(b.myCallback) w.setCentralWidget(b) b.click() self.assertEqual(b._called, True) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qmatrix_test.py ================================================ import unittest from PySide.QtCore import QPoint from PySide.QtGui import QMatrix, QMatrix4x4 def qpointTimesQMatrix(point, matrix): '''As seen in "QPoint QMatrix::map(const QPoint &p) const" C++ implementation.''' return QPoint(matrix.m11() * point.x() + matrix.m21() * point.y() + matrix.dx(), matrix.m12() * point.x() + matrix.m22() * point.y() + matrix.dy()) class QMatrixTest(unittest.TestCase): def testMatrix(self): matrix = QMatrix(11, 12, 21, 22, 100, 200) point = QPoint(3, 3) self.assertEqual(point * matrix, qpointTimesQMatrix(point, matrix)) def testMatrixWithWrongType(self): matrix = QMatrix(11, 12, 21, 22, 100, 200) point = QPoint(3, 3) self.assertRaises(TypeError, matrix.__mul__, point) def testMatrix4x4(self): self.assertRaises(TypeError, QMatrix4x4, [0.0, 1.0, 2.0, 3.0]) self.assertRaises(TypeError, QMatrix4x4, [0.0, 1.0, 2.0, 'I', 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 'N', 11.0, 12.0, 'd', 14.0, 'T']) my_data = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0] my_datac = [0.0, 4.0, 8.0, 12.0, 1.0, 5.0, 9.0, 13.0, 2.0, 6.0, 10.0, 14.0, 3.0, 7.0, 11.0, 15.0] m = QMatrix4x4(my_data) d = m.data() self.assert_(my_datac, d) d = m.copyDataTo() self.assert_(my_data == list(d)) def testMatrixMapping(self): m = QMatrix(1.0, 2.0, 1.0, 3.0, 100.0, 200.0) res = m.map(5, 5) self.assertAlmostEqual(res[0], 5 * 1.0 + 5 * 1.0 + 100.0) self.assertAlmostEqual(res[1], 5 * 2.0 + 5 * 3.0 + 200.0) res = m.map(5.0, 5.0) self.assertAlmostEqual(res[0], 5.0 * 1.0 + 5.0 * 1.0 + 100.0) self.assertAlmostEqual(res[1], 5.0 * 2.0 + 5.0 * 3.0 + 200.0) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qmenu_test.py ================================================ import unittest from PySide.QtGui import QMenu, QKeySequence, QIcon from PySide.QtCore import SLOT from helper import UsesQApplication class QMenuAddAction(UsesQApplication): def setUp(self): super(QMenuAddAction, self).setUp() self.menu = QMenu() def tearDown(self): del self.menu super(QMenuAddAction, self).tearDown() def testAddActionWithoutKeySequenceCallable(self): # bug #280 action = self.menu.addAction(self.app.tr('aaa'), lambda : 1) def testAddActionKeySequenceCallable(self): # bug #228 action = self.menu.addAction(self.app.tr('aaa'), lambda : 1, QKeySequence(self.app.tr('Ctrl+O'))) def testAddActionKeySequenceSlot(self): action = self.menu.addAction('Quit', self.app, SLOT('quit()'), QKeySequence('Ctrl+O')) class QMenuAddActionWithIcon(UsesQApplication): def setUp(self): super(QMenuAddActionWithIcon, self).setUp() self.menu = QMenu() self.icon = QIcon() def tearDown(self): del self.menu del self.icon super(QMenuAddActionWithIcon, self).tearDown() def testAddActionWithoutKeySequenceCallable(self): # bug #280 action = self.menu.addAction(self.icon, self.app.tr('aaa'), lambda : 1) def testAddActionKeySequenceCallable(self): # bug #228 action = self.menu.addAction(self.icon, self.app.tr('aaa'), lambda : 1, QKeySequence(self.app.tr('Ctrl+O'))) def testAddActionKeySequenceSlot(self): action = self.menu.addAction(self.icon, 'Quit', self.app, SLOT('quit()'), QKeySequence('Ctrl+O')) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qmenuadd_test.py ================================================ # -*- coding: utf-8 -*- ''' Test the QMenu.addAction() method''' import unittest import sys from PySide import QtGui from helper import UsesQApplication class QMenuAddAction(UsesQApplication): def openFile(self, *args): self.arg = args def testQMenuAddAction(self): fileMenu = QtGui.QMenu("&File") addNewAction = fileMenu.addAction("&Open...", self.openFile) addNewAction.trigger() self.assertEquals(self.arg, ()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qobject_mi_test.py ================================================ '''Test cases for multiple inheritance from 2 QObjects''' import unittest from PySide.QtCore import QObject from PySide.QtGui import * from helper import UsesQApplication class WidgetValidator(QWidget, QIntValidator): def __init__(self, parent=None): QWidget.__init__(self, parent) QIntValidator.__init__(self, parent) class DoubleQObjectInheritanceTest(UsesQApplication): def testDouble(self): '''Double inheritance from QObject classes''' obj = WidgetValidator() #QObject methods obj.setObjectName('aaaa') self.assertEqual(obj.objectName(), 'aaaa') #QWidget methods obj.setVisible(False) self.assertFalse(obj.isVisible()) #QIntValidator methods state, string, number = obj.validate('aaaa', 0) self.assertEqual(state, QValidator.Invalid) state, string, number = obj.validate('33', 0) self.assertEqual(state, QValidator.Acceptable) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qpainter_test.py ================================================ import unittest from PySide.QtGui import QPainter, QLinearGradient from PySide.QtCore import QLine, QLineF, QPoint, QPointF, QRect, QRectF, Qt class QPainterDrawText(unittest.TestCase): def setUp(self): self.painter = QPainter() self.text = 'teste!' def tearDown(self): del self.text del self.painter def testDrawText(self): # bug #254 rect = self.painter.drawText(100, 100, 100, 100, Qt.AlignCenter | Qt.TextWordWrap, self.text) self.assert_(isinstance(rect, QRect)) def testDrawTextWithRect(self): # bug #225 rect = QRect(100, 100, 100, 100) newRect = self.painter.drawText(rect, Qt.AlignCenter | Qt.TextWordWrap, self.text) self.assert_(isinstance(newRect, QRect)) def testDrawTextWithRectF(self): '''QPainter.drawText(QRectF, ... ,QRectF*) inject code''' rect = QRectF(100, 52.3, 100, 100) newRect = self.painter.drawText(rect, Qt.AlignCenter | Qt.TextWordWrap, self.text) self.assert_(isinstance(newRect, QRectF)) def testDrawOverloads(self): '''Calls QPainter.drawLines overloads, if something is wrong Exception and chaos ensues. Bug #395''' self.painter.drawLines([QLine(QPoint(0,0), QPoint(1,1))]) self.painter.drawLines([QPoint(0,0), QPoint(1,1)]) self.painter.drawLines([QPointF(0,0), QPointF(1,1)]) self.painter.drawLines([QLineF(QPointF(0,0), QPointF(1,1))]) self.painter.drawPoints([QPoint(0,0), QPoint(1,1)]) self.painter.drawPoints([QPointF(0,0), QPointF(1,1)]) self.painter.drawConvexPolygon([QPointF(10.0, 80.0), QPointF(20.0, 10.0), QPointF(80.0, 30.0), QPointF(90.0, 70.0)]) self.painter.drawConvexPolygon([QPoint(10.0, 80.0), QPoint(20.0, 10.0), QPoint(80.0, 30.0), QPoint(90.0, 70.0)]) self.painter.drawPolygon([QPointF(10.0, 80.0), QPointF(20.0, 10.0), QPointF(80.0, 30.0), QPointF(90.0, 70.0)]) self.painter.drawPolygon([QPoint(10.0, 80.0), QPoint(20.0, 10.0), QPoint(80.0, 30.0), QPoint(90.0, 70.0)]) self.painter.drawPolyline([QPointF(10.0, 80.0), QPointF(20.0, 10.0), QPointF(80.0, 30.0), QPointF(90.0, 70.0)]) self.painter.drawPolyline([QPoint(10.0, 80.0), QPoint(20.0, 10.0), QPoint(80.0, 30.0), QPoint(90.0, 70.0)]) class SetBrushWithOtherArgs(unittest.TestCase): '''Using qpainter.setBrush with args other than QBrush''' def testSetBrushGradient(self): painter = QPainter() gradient = QLinearGradient(0, 0, 0, 0) painter.setBrush(gradient) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qpen_test.py ================================================ import unittest from helper import UsesQApplication from PySide.QtCore import Qt, QTimer from PySide.QtGui import QPen, QPainter, QWidget class Painting(QWidget): def __init__(self): QWidget.__init__(self) self.penFromEnum = None self.penFromInteger = None def paintEvent(self, event): painter = QPainter(self) painter.setPen(Qt.NoPen) self.penFromEnum = painter.pen() painter.setPen(int(Qt.NoPen)) self.penFromInteger = painter.pen() class QPenTest(UsesQApplication): def testCtorWithCreatedEnums(self): '''A simple case of QPen creation using created enums.''' width = 0 style = Qt.PenStyle(0) cap = Qt.PenCapStyle(0) join = Qt.PenJoinStyle(0) pen = QPen(Qt.blue, width, style, cap, join) def testSetPenWithPenStyleEnum(self): '''Calls QPainter.setPen with both enum and integer. Bug #511.''' w = Painting() w.show() QTimer.singleShot(1000, self.app.quit) self.app.exec_() self.assertEqual(w.penFromEnum.style(), Qt.NoPen) self.assertEqual(w.penFromInteger.style(), Qt.SolidLine) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qpicture_test.py ================================================ import unittest import os from helper import UsesQApplication from PySide.QtCore import QTimer from PySide.QtGui import QPicture, QPainter, QWidget class MyWidget(QWidget): def paintEvent(self, e): p = QPainter(self) p.drawPicture(0, 0, self._picture) self._app.quit() class QPictureTest(UsesQApplication): def testFromData(self): picture = QPicture() painter = QPainter() painter.begin(picture) painter.drawEllipse(10,20, 80,70) painter.end() data = picture.data() picture2 = QPicture() picture2.setData(data) self.assertEqual(picture2.data(), picture.data()) w = MyWidget() w._picture = picture2 w._app = self.app QTimer.singleShot(300, w.show) self.app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qpixmap_constructor.py ================================================ #!/usr/bin/python import unittest from PySide.QtGui import QLabel, QPixmap from helper import UsesQApplication xpm = [ "27 22 206 2", " c None", ". c #FEFEFE", "+ c #FFFFFF", "@ c #F9F9F9", "# c #ECECEC", "$ c #D5D5D5", "% c #A0A0A0", "& c #767676", "* c #525252", "= c #484848", "- c #4E4E4E", "; c #555555", "> c #545454", ", c #5A5A5A", "' c #4B4B4B", ") c #4A4A4A", "! c #4F4F4F", "~ c #585858", "{ c #515151", "] c #4C4C4C", "^ c #B1B1B1", "/ c #FCFCFC", "( c #FDFDFD", "_ c #C1C1C1", ": c #848484", "< c #616161", "[ c #5E5E5E", "} c #CECECE", "| c #E2E2E2", "1 c #E4E4E4", "2 c #DFDFDF", "3 c #D2D2D2", "4 c #D8D8D8", "5 c #D4D4D4", "6 c #E6E6E6", "7 c #F1F1F1", "8 c #838383", "9 c #8E8E8E", "0 c #8F8F8F", "a c #CBCBCB", "b c #CCCCCC", "c c #E9E9E9", "d c #F2F2F2", "e c #EDEDED", "f c #B5B5B5", "g c #A6A6A6", "h c #ABABAB", "i c #BBBBBB", "j c #B0B0B0", "k c #EAEAEA", "l c #6C6C6C", "m c #BCBCBC", "n c #F5F5F5", "o c #FAFAFA", "p c #B6B6B6", "q c #F3F3F3", "r c #CFCFCF", "s c #FBFBFB", "t c #CDCDCD", "u c #DDDDDD", "v c #999999", "w c #F0F0F0", "x c #2B2B2B", "y c #C3C3C3", "z c #A4A4A4", "A c #D7D7D7", "B c #E7E7E7", "C c #6E6E6E", "D c #9D9D9D", "E c #BABABA", "F c #AEAEAE", "G c #898989", "H c #646464", "I c #BDBDBD", "J c #CACACA", "K c #2A2A2A", "L c #212121", "M c #B7B7B7", "N c #F4F4F4", "O c #737373", "P c #828282", "Q c #4D4D4D", "R c #000000", "S c #151515", "T c #B2B2B2", "U c #D6D6D6", "V c #D3D3D3", "W c #2F2F2F", "X c #636363", "Y c #A1A1A1", "Z c #BFBFBF", "` c #E0E0E0", " . c #6A6A6A", ".. c #050505", "+. c #A3A3A3", "@. c #202020", "#. c #5F5F5F", "$. c #B9B9B9", "%. c #C7C7C7", "&. c #D0D0D0", "*. c #3E3E3E", "=. c #666666", "-. c #DBDBDB", ";. c #424242", ">. c #C2C2C2", ",. c #1A1A1A", "'. c #2C2C2C", "). c #F6F6F6", "!. c #AAAAAA", "~. c #DCDCDC", "{. c #2D2D2D", "]. c #2E2E2E", "^. c #A7A7A7", "/. c #656565", "(. c #333333", "_. c #464646", ":. c #C4C4C4", "<. c #B8B8B8", "[. c #292929", "}. c #979797", "|. c #EFEFEF", "1. c #909090", "2. c #8A8A8A", "3. c #575757", "4. c #676767", "5. c #C5C5C5", "6. c #7A7A7A", "7. c #797979", "8. c #989898", "9. c #EEEEEE", "0. c #707070", "a. c #C8C8C8", "b. c #111111", "c. c #AFAFAF", "d. c #474747", "e. c #565656", "f. c #E3E3E3", "g. c #494949", "h. c #5B5B5B", "i. c #222222", "j. c #353535", "k. c #D9D9D9", "l. c #0A0A0A", "m. c #858585", "n. c #E5E5E5", "o. c #0E0E0E", "p. c #9A9A9A", "q. c #6F6F6F", "r. c #868686", "s. c #060606", "t. c #1E1E1E", "u. c #E8E8E8", "v. c #A5A5A5", "w. c #0D0D0D", "x. c #030303", "y. c #272727", "z. c #131313", "A. c #1F1F1F", "B. c #757575", "C. c #F7F7F7", "D. c #414141", "E. c #080808", "F. c #6B6B6B", "G. c #313131", "H. c #C0C0C0", "I. c #C9C9C9", "J. c #0B0B0B", "K. c #232323", "L. c #434343", "M. c #3D3D3D", "N. c #282828", "O. c #7C7C7C", "P. c #252525", "Q. c #3A3A3A", "R. c #F8F8F8", "S. c #1B1B1B", "T. c #949494", "U. c #3B3B3B", "V. c #242424", "W. c #383838", "X. c #6D6D6D", "Y. c #818181", "Z. c #939393", "`. c #9E9E9E", " + c #929292", ".+ c #7D7D7D", "++ c #ADADAD", "@+ c #DADADA", "#+ c #919191", "$+ c #E1E1E1", "%+ c #BEBEBE", "&+ c #ACACAC", "*+ c #9C9C9C", "=+ c #B3B3B3", "-+ c #808080", ";+ c #A8A8A8", ">+ c #393939", ",+ c #747474", "'+ c #7F7F7F", ")+ c #D1D1D1", "!+ c #606060", "~+ c #5C5C5C", "{+ c #686868", "]+ c #7E7E7E", "^+ c #787878", "/+ c #595959", ". . . + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / . . + + ", ". ( + _ : < [ & } | 1 2 $ 3 4 5 3 6 7 + + 8 9 + . + . ", ". + 0 9 a ( 3 a b c d e c f g h i g j $ k + l m + . + ", "+ 2 8 n o p | ( q r s . # t + + + u ^ v e w + x + + + ", "+ y z . @ A k B 7 n + ( s | p 8 C D 2 E 4 + + F G + . ", "# H I $ J G K L - M N . 2 O P Q R R S T U s s V W j + ", "X Y Z @ o ` _ g ...+.( 4 @.#.m G $.%.7 &.X *.=.-.;.&.", "Q >.C ,.'.} e + ).!.k + . + + . ~.{.> ].x f 7 ^./.k (.", "_.:.4 @ <.[.}.|.1.2.+ + + >.} 4 B + ( @ _ 3.4.5.6.r 7.", "3.8.9.~ 0.+ a.Q b.+ + c.d.#.=.$ |.b #.e.z ^ ; ^. .f.g.", "-.h.+ i.S M + # p j.% n 9.5.k.H l.m.V ^.n.o.M + M p.q.", "7 r.N s.1.R t.<.|.| u.v.~ w.x.E + s y.z.A.B.C.+ 5 D.q ", ").p.2 E.0.9 F.%.O {._ @.+ + i { [ i.G.H.P I.+ s q.} + ", ").p.6 J.R b.K.L.M.A.! b.g.K [.R M k + N.I + + >.O.+ . ", ").8.9.N.P...R R R R E.t.W n.+ Q.R.6 @.| + . + S.+ + . ", "n }.w T.U.B.<.i.@ Y + + U.+ c u V.= B B 7 u.W.c + . + ", "N T.# + }.X.Y.,.8.F.8 Z.[.`. +.+}.4 ++@+O.< ~.+ ( . + ", "d #+1 + _ ~.u.$+b $.y @+| $+%+I.&+k.h W +.9.+ ( . + . ", "w 0 |.*+. >.<.=+++++p a.p -+;+5.k.>+,+@ + . . + . + + ", "q '+9.R.^ I.t b %.I.)+4 $+n.I.,+ .|.+ . . . + . + + + ", ". p !+( + + + + + + E 0. .-+8.f.+ + . . + + . + + + + ", ". ( A ~+{+]+^+l > /+D f.c q . + . . + + . + + + + + + " ] class QStringSequenceTest(UsesQApplication): def testQPixmapConstructor(self): label = QLabel() pixmap1 = QPixmap(xpm) self.assertFalse(pixmap1.isNull()) self.assertEqual(pixmap1.width(), 27) self.assertEqual(pixmap1.height(), 22) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/qpixmap_test.py ================================================ import unittest import os from helper import UsesQApplication from PySide.QtGui import * from PySide.QtCore import * class QPixmapTest(UsesQApplication): def testQVariantConstructor(self): obj = QObject() pixmap = QPixmap() obj.setProperty('foo', pixmap) self.assertEqual(type(obj.property('foo')), QPixmap) def testQSizeConstructor(self): pixmap = QPixmap(QSize(10,20)) self.assert_(pixmap.size().height(), 20) def testQStringConstructor(self): pixmap = QPixmap("Testing!") def testQPixmapLoadFromDataWithQFile(self): f = QFile(os.path.join(os.path.dirname(__file__), 'sample.png')) self.assert_(f.open(QIODevice.ReadOnly)) data = f.read(f.size()) f.close() pixmap = QPixmap() self.assert_(pixmap.loadFromData(data)) def testQPixmapLoadFromDataWithPython(self): data = open(os.path.join(os.path.dirname(__file__),'sample.png'),'rb').read() pixmap = QPixmap() self.assert_(pixmap.loadFromData(data)) class QPixmapToImage(UsesQApplication): def testFilledImage(self): '''QPixmap.fill + toImage + image.pixel''' pixmap = QPixmap(100, 200) pixmap.fill(Qt.red) # Default Qt.white self.assertEqual(pixmap.height(), 200) self.assertEqual(pixmap.width(), 100) image = pixmap.toImage() self.assertEqual(image.height(), 200) self.assertEqual(image.width(), 100) pixel = image.pixel(10,10) self.assertEqual(pixel, QColor(Qt.red).rgba()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qpixmapcache_test.py ================================================ import unittest from helper import UsesQApplication from PySide.QtGui import QPixmapCache, QPixmap class QPixmapCacheTest(UsesQApplication): def testWithString(self): pm1 = QPixmap() ok = QPixmapCache.find('img', pm1) self.assertFalse(ok) self.assertEqual(QPixmapCache.find('img'), None) pm2 = QPixmap() ok = QPixmapCache.insert('img', pm2) self.assertTrue(ok) pm3 = QPixmap() ok = QPixmapCache.find('img', pm3) self.assertTrue(ok) b1 = QPixmapCache.find('img').toImage().bits() b2 = pm3.toImage().bits() self.assertEqual(QPixmapCache.find('img').toImage().bits(), pm3.toImage().bits()) def testWithKey(self): pm1 = QPixmap() ok = QPixmapCache.find(QPixmapCache.Key(), pm1) self.assertFalse(ok) self.assertEqual(QPixmapCache.find(QPixmapCache.Key()), None) pm2 = QPixmap() key = QPixmapCache.insert(pm2) pm3 = QPixmap() ok = QPixmapCache.find(key, pm3) self.assertTrue(ok) self.assertEqual(QPixmapCache.find(key).toImage().bits(), pm3.toImage().bits()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qpolygonf_test.py ================================================ import unittest from PySide.QtCore import * from PySide.QtGui import * class QPolygonFNotIterableTest(unittest.TestCase): """Test if a QPolygonF is iterable""" def testIt(self): p = QPolygonF(4) self.assertEqual(len(p), 4) for i in range(0, 4): p[i] = QPointF(float(i), float(i)) i = 0 for point in p: self.assertEqual(int(point.x()), i) self.assertEqual(int(point.y()), i) i += 1; def testPolygonShiftOperators(self): p = QPolygon() self.assertEqual(len(p), 0) p << QPoint(10, 20) << QPoint(20, 30) << [QPoint(20, 30), QPoint(40, 50)] self.assertEqual(len(p), 4) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qpushbutton_test.py ================================================ import unittest from helper import UsesQApplication from PySide.QtGui import QPushButton, QMenu, QWidget from PySide.QtCore import QTimer class MyWidget(QWidget): def __init__(self): QWidget.__init__(self) m = QMenu(self) b = QPushButton("Hello", self) b.setMenu(m) class QPushButtonTest(UsesQApplication): def createMenu(self, button): m = QMenu() button.setMenu(m) def testSetMenu(self): w = MyWidget() w.show() timer = QTimer.singleShot(100, self.app.quit) self.app.exec_() def buttonCb(self, checked): self._clicked = True def testBoolinSignal(self): b = QPushButton() b.setCheckable(True) self._clicked = False b.toggled[bool].connect(self.buttonCb) b.toggle() self.assert_(self._clicked) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qradialgradient_test.py ================================================ import unittest from PySide.QtGui import QRadialGradient from PySide.QtCore import QPointF class QRadialGradientConstructor(unittest.TestCase): def _compare(self, qptf, tpl): self.assertEqual((qptf.x(), qptf.y()), tpl) def _assertValues(self, grad): self._compare(grad.center(), (1.0, 2.0)) self._compare(grad.focalPoint(), (3.0, 4.0)) self.assertEqual(grad.radius(), 5.0) def testAllInt(self): grad = QRadialGradient(1, 2, 5, 3, 4) self._assertValues(grad) def testQPointF(self): grad = QRadialGradient(QPointF(1, 2), 5, QPointF(3, 4)) self._assertValues(grad) def testSetQPointF(self): grad = QRadialGradient() grad.setCenter(QPointF(1, 2)) self._compare(grad.center(), (1.0, 2.0)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qregion_test.py ================================================ import unittest import sys from PySide.QtGui import QRegion from PySide.QtCore import QPoint from helper import UsesQApplication class QRegionTest(UsesQApplication): def testFunctionUnit(self): r = QRegion(0, 0, 10, 10) r2 = QRegion(5, 5, 10, 10) ru = r.united(r2) self.assert_(ru.contains(QPoint(0,0))) self.assert_(ru.contains(QPoint(5,5))) self.assert_(ru.contains(QPoint(10,10))) self.assert_(ru.contains(QPoint(14,14))) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qshortcut_test.py ================================================ # -*- coding: utf-8 -*- ''' Test the QShortcut constructor''' import unittest import sys from PySide import QtGui, QtCore class Foo(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.ok = False self.copy = False def slot_of_foo(self): self.ok = True def slot_of_copy(self): self.copy = True class MyShortcut(QtGui.QShortcut): def __init__(self, keys, wdg, slot): QtGui.QShortcut.__init__(self, keys, wdg, slot) def emit_signal(self): self.emit(QtCore.SIGNAL("activated()")) class QAppPresence(unittest.TestCase): def testQShortcut(self): self.qapp = QtGui.QApplication([]) f = Foo() self.sc = MyShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return), f, f.slot_of_foo) self.scstd = MyShortcut(QtGui.QKeySequence.Copy, f, f.slot_of_copy) QtCore.QTimer.singleShot(0, self.init); self.qapp.exec_() self.assertEquals(f.ok, True) self.assertEquals(f.copy, True) def init(self): self.sc.emit_signal(); self.scstd.emit_signal(); self.qapp.quit() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qsplitter_test.py ================================================ import unittest from PySide.QtGui import QSplitter from helper import UsesQApplication class QSplitterTest(UsesQApplication): def testGetRange(self): splitter = QSplitter() _min, _max = splitter.getRange(0) self.assert_(isinstance(_min, int)) self.assert_(isinstance(_max, int)) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/qstandarditemmodel_test.py ================================================ import unittest import sys from PySide.QtGui import QStandardItemModel, QWidget, QStandardItem import shiboken from helper import UsesQApplication class QStandardItemModelTest(UsesQApplication): def setUp(self): super(QStandardItemModelTest, self).setUp() self.window = QWidget() self.model = QStandardItemModel(0, 3, self.window) def tearDown(self): del self.window del self.model super(QStandardItemModelTest, self).tearDown() def testInsertRow(self): # bug #227 self.model.insertRow(0) def testClear(self): model = QStandardItemModel() root = model.invisibleRootItem() model.clear() self.assertFalse(shiboken.isValid(root)) class QStandardItemModelRef(UsesQApplication): def testRefCount(self): model = QStandardItemModel(5, 5) items = [] for r in range(5): row = [] for c in range(5): row.append(QStandardItem("%d,%d" % (r,c)) ) self.assertEqual(sys.getrefcount(row[c]), 2) model.insertRow(r, row) for c in range(5): ref_after = sys.getrefcount(row[c]) # check if the ref count was incremented after insertRow self.assertEqual(ref_after, 3) items.append(row) row = None for r in range(3): my_row = model.takeRow(0) my_row = None for c in range(5): # only rest 1 reference self.assertEqual(sys.getrefcount(items[r][c]), 2) my_i = model.item(0,0) # ref(my_i) + parent_ref + items list ref self.assertEqual(sys.getrefcount(my_i), 4) model.clear() # ref(my_i) self.assertEqual(sys.getrefcount(my_i), 3) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qstring_qkeysequence_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Tests conversions of QString to and from QKeySequence.''' import unittest import py3kcompat as py3k from helper import UsesQApplication from PySide.QtGui import QKeySequence, QAction class QStringQKeySequenceTest(UsesQApplication): '''Tests conversions of QString to and from QKeySequence.''' def testQStringFromQKeySequence(self): '''Creates a QString from a QKeySequence.''' keyseq = 'Ctrl+A' a = QKeySequence(keyseq) self.assertEqual(a, keyseq) def testPythonStringAsQKeySequence(self): '''Passes a Python string to an argument expecting a QKeySequence.''' keyseq = py3k.unicode_('Ctrl+A') action = QAction(None) action.setShortcut(keyseq) shortcut = action.shortcut() self.assert_(isinstance(shortcut, QKeySequence)) self.assertEqual(shortcut.toString(), keyseq) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qstyle_test.py ================================================ import unittest from helper import UsesQApplication from PySide.QtGui import QWidget, QLabel, QFontComboBox, QStyleFactory class SetStyleTest(UsesQApplication): '''Tests setting the same QStyle for all objects in a UI hierarchy.''' def testSetStyle(self): '''All this test have to do is not break with some invalid Python wrapper.''' def setStyleHelper(widget, style): widget.setStyle(style) widget.setPalette(style.standardPalette()) for child in widget.children(): if isinstance(child, QWidget): setStyleHelper(child, style) container = QWidget() # QFontComboBox is used because it has an QLineEdit created in C++ inside it, # and if the QWidget.setStyle(style) steals the ownership of the style # for the C++ originated widget everything will break. fontComboBox = QFontComboBox(container) label = QLabel(container) label.setText('Label') style = QStyleFactory.create(QStyleFactory.keys()[0]) setStyleHelper(container, style) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qtableview_test.py ================================================ import unittest from PySide.QtCore import QAbstractTableModel from PySide.QtGui import QTableWidget from helper import UsesQApplication class QPenTest(UsesQApplication): def testItemModel(self): tv = QTableWidget() self.assertEqual(type(tv.model()), QAbstractTableModel) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qtabwidget_test.py ================================================ import unittest from PySide.QtGui import * from helper import TimedQApplication def makeBug643(tab): button = QPushButton('Foo') tab.insertTab(0, button, 'Foo') class RemoveTabMethod(TimedQApplication): def setUp(self): TimedQApplication.setUp(self) self.tab = QTabWidget() def tearDown(self): del self.tab TimedQApplication.tearDown(self) def testRemoveTabPresence(self): self.assert_(getattr(self.tab, 'removeTab')) def testInsertTab(self): makeBug643(self.tab) self.assertEqual(self.tab.count(), 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qtextdocument_undoredo_test.py ================================================ import unittest from PySide.QtGui import QTextDocument, QTextCursor class QTextDocumentTest(unittest.TestCase): def testUndoRedo(self): text = 'foobar' doc = QTextDocument(text) self.assertFalse(doc.isRedoAvailable()) self.assertTrue(doc.isUndoAvailable()) self.assertEqual(doc.toPlainText(), text) cursor = QTextCursor(doc) doc.undo(cursor) self.assertTrue(doc.isRedoAvailable()) self.assertFalse(doc.isUndoAvailable()) self.assertEqual(doc.toPlainText(), '') doc.redo(cursor) self.assertFalse(doc.isRedoAvailable()) self.assertTrue(doc.isUndoAvailable()) self.assertEqual(doc.toPlainText(), text) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qtextedit_signal_test.py ================================================ from PySide import QtGui, QtCore from helper import UsesQApplication import unittest class MyWindow(QtGui.QMainWindow): appendText = QtCore.Signal(str) @QtCore.Slot() def onButtonPressed(self): self.appendText.emit("PySide") def __init__(self, parent=None): super(MyWindow, self).__init__(parent) self.textEdit = QtGui.QTextEdit() self.btn = QtGui.QPushButton("ClickMe") self.btn.clicked.connect(self.onButtonPressed) self.appendText.connect(self.textEdit.append) def start(self): self.btn.click() def text(self): return self.textEdit.toPlainText() class testSignalWithCPPSlot(UsesQApplication): def testEmission(self): w = MyWindow() w.start() self.assertEqual(w.text(), "PySide") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qtextedit_test.py ================================================ '''Test cases for QTextEdit and ownership problems.''' import unittest from sys import getrefcount from PySide.QtGui import QTextEdit from helper import UsesQApplication class DontTouchReference(UsesQApplication): '''Check if the QTextTable returned by QTextCursor.insertTable() is not referenced by the QTextCursor that returns it.''' def setUp(self): super(DontTouchReference, self).setUp() self.editor = QTextEdit() self.cursor = self.editor.textCursor() self.table = self.cursor.insertTable(1, 1) def testQTextTable(self): # methods which return QTextTable should not increment its reference self.assertEqual(getrefcount(self.table), 2) f = self.cursor.currentFrame() del f self.assertEqual(getrefcount(self.table), 2) # destroying the cursor should not raise any "RuntimeError: internal # C++ object already deleted." when accessing the QTextTable del self.cursor self.assertEqual(getrefcount(self.table), 2) cell = self.table.cellAt(0, 0) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/qtextline_test.py ================================================ import unittest from PySide.QtGui import QTextLayout from helper import UsesQApplication class QTextLineTest(UsesQApplication): def testCursorToX(self): textLayout = QTextLayout() textLayout.beginLayout() line = textLayout.createLine() self.assert_(line.isValid()) x, cursorPos = line.cursorToX(0) self.assertEqual(type(x), float) self.assertEqual(type(cursorPos), int) x, cursorPos = line.cursorToX(1) self.assertEqual(type(x), float) self.assertEqual(type(cursorPos), int) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qtoolbar_test.py ================================================ '''Test cases for QToolbar''' import unittest from PySide.QtGui import QToolBar, QMainWindow, QAction from helper import UsesQApplication class AddActionText(UsesQApplication): '''Test case for calling QToolbar.addAction passing a text''' def setUp(self): #Acquire resources super(AddActionText, self).setUp() self.window = QMainWindow() self.toolbar = QToolBar() self.window.addToolBar(self.toolbar) def tearDown(self): #Release resources super(AddActionText, self).tearDown() del self.toolbar del self.window def testText(self): #QToolBar.addAction(text) - add a QToolButton self.toolbar.addAction('aaaa') self.assertEqual(len(self.toolbar.actions()), 1) action = self.toolbar.actions()[0] self.assert_(isinstance(action, QAction)) self.assertEqual(action.text(), 'aaaa') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qtoolbox_test.py ================================================ import unittest from PySide.QtGui import QToolBox, QWidget, QIcon from helper import UsesQApplication class OwnershipControl(UsesQApplication): def setUp(self): super(OwnershipControl, self).setUp() self.toolbox = QToolBox() def tearDown(self): del self.toolbox super(OwnershipControl, self).tearDown() def testAddItem(self): # Was losing ownership of the widget. index = self.toolbox.addItem(QWidget(), 'item') item = self.toolbox.widget(index) self.assert_(isinstance(item, QWidget)) def testAddItemWithIcon(self): index = self.toolbox.addItem(QWidget(), QIcon(), 'item') item = self.toolbox.widget(index) self.assert_(isinstance(item, QWidget)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qtransform_test.py ================================================ import unittest from PySide.QtCore import QPointF from PySide.QtGui import QTransform, QPolygonF, QPolygonF class QTransformTest(unittest.TestCase): def testMap(self): transform = QTransform() values = (10.0, 20.0) tx, ty = transform.map(*values) self.assert_(isinstance(tx, float)) self.assert_(isinstance(ty, float)) self.assertEqual((tx, ty), values) def testquadToQuad(self): q1 = QPolygonF() q1.append(QPointF(10.0, 10.0)) q1.append(QPointF(20.0, 10.0)) q1.append(QPointF(10.0, -10.0)) q1.append(QPointF(20.0, -10.0)) q2 = QPolygonF() q2.append(QPointF(20.0, 20.0)) q2.append(QPointF(30.0, 20.0)) q2.append(QPointF(20.0, -20.0)) q2.append(QPointF(30.0, -20.0)) t1 = QTransform() r1 = QTransform.quadToQuad(q1, q2, t1) r2 = QTransform.quadToQuad(q1, q2) self.assertTrue(r1) self.assert_(r2) self.assertEqual(t1, r2) def testquadToSquare(self): q1 = QPolygonF() q1.append(QPointF(10.0, 10.0)) q1.append(QPointF(20.0, 10.0)) q1.append(QPointF(10.0, -10.0)) q1.append(QPointF(20.0, -10.0)) t1 = QTransform() r1 = QTransform.quadToSquare(q1, t1) r2 = QTransform.quadToSquare(q1) self.assertTrue(r1) self.assert_(r2) self.assertEqual(t1, r2) def testsquareToQuad(self): q1 = QPolygonF() q1.append(QPointF(10.0, 10.0)) q1.append(QPointF(20.0, 10.0)) q1.append(QPointF(10.0, -10.0)) q1.append(QPointF(20.0, -10.0)) t1 = QTransform() r1 = QTransform.squareToQuad(q1, t1) r2 = QTransform.squareToQuad(q1) self.assertTrue(r1) self.assert_(r2) self.assertEqual(t1, r2) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/qvalidator_test.py ================================================ from PySide.QtCore import * from PySide.QtGui import * import unittest from helper import UsesQApplication class MyValidator1(QValidator): def fixUp(self, input): return "fixed" def validate(self, input, pos): return (QValidator.Acceptable, "fixed", 1) class MyValidator2(QValidator): def fixUp(self, input): return "fixed" def validate(self, input, pos): return (QValidator.Acceptable, "fixed") class MyValidator3(QValidator): def fixUp(self, input): return "fixed" def validate(self, input, pos): return (QValidator.Acceptable,) class MyValidator4(QValidator): def fixUp(self, input): return "fixed" def validate(self, input, pos): return QValidator.Acceptable class QValidatorTest(UsesQApplication): def testValidator1(self): line = QLineEdit() line.setValidator(MyValidator1()) line.show() line.setText("foo") QTimer.singleShot(0, line.close) self.app.exec_() self.assertEqual(line.text(), "fixed") self.assertEqual(line.cursorPosition(), 1) def testValidator2(self): line = QLineEdit() line.setValidator(MyValidator2()) line.show() line.setText("foo") QTimer.singleShot(0, line.close) self.app.exec_() self.assertEqual(line.text(), "fixed") self.assertEqual(line.cursorPosition(), 3) def testValidator3(self): line = QLineEdit() line.setValidator(MyValidator3()) line.show() line.setText("foo") QTimer.singleShot(0, line.close) self.app.exec_() self.assertEqual(line.text(), "foo") self.assertEqual(line.cursorPosition(), 3) def testValidator4(self): line = QLineEdit() line.setValidator(MyValidator4()) line.show() line.setText("foo") QTimer.singleShot(0, line.close) self.app.exec_() self.assertEqual(line.text(), "foo") self.assertEqual(line.cursorPosition(), 3) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qvariant_test.py ================================================ import unittest from PySide.QtCore import * from PySide.QtGui import * class MyDiagram(QGraphicsScene): pass class MyItem(QGraphicsRectItem): def itemChange(self, change, value): return value; class QGraphicsSceneOnQVariantTest(unittest.TestCase): """Test storage ot QGraphicsScene into QVariants""" def testIt(self): app = QApplication([]) s = MyDiagram() i = MyItem() s.addItem(i) self.assertEqual(len(s.items()), 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qwidget_setlayout_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtGui import QWidget, QVBoxLayout, QPushButton, QApplication, QHBoxLayout from helper import UsesQApplication class QWidgetTest(UsesQApplication): def test_setLayout(self): layout = QVBoxLayout() btn1 = QPushButton("button_v1") layout.addWidget(btn1) btn2 = QPushButton("button_v2") layout.addWidget(btn2) layout2 = QHBoxLayout() btn1 = QPushButton("button_h1") layout2.addWidget(btn1) btn2 = QPushButton("button_h2") layout2.addWidget(btn2) layout.addLayout(layout2) widget = QWidget() widget.setLayout(layout) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/qwidget_test.py ================================================ import unittest from PySide.QtGui import QWidget, QMainWindow from helper import UsesQApplication class QWidgetInherit(QMainWindow): def __init__(self): QWidget.__init__(self) class QWidgetTest(UsesQApplication): def testInheritance(self): self.assertRaises(TypeError, QWidgetInherit) class QWidgetVisible(UsesQApplication): def testBasic(self): # Also related to bug #244, on existence of setVisible''' widget = QWidget() self.assert_(not widget.isVisible()) widget.setVisible(True) self.assert_(widget.isVisible()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/reference_count_test.py ================================================ '''Test cases for Reference count when the object is created in c++ side''' import unittest import sys import weakref import gc from PySide.QtCore import Qt, QPointF from PySide.QtGui import QApplication, QGraphicsScene, QGraphicsRectItem, QPolygonF, QGraphicsPolygonItem, QGraphicsRectItem from helper import UsesQApplication destroyedRect = False destroyedPol = False def rect_del(o): global destroyedRect destroyedRect = True def pol_del(o): global destroyedPol destroyedPol = True class ReferenceCount(UsesQApplication): def setUp(self): super(ReferenceCount, self).setUp() self.scene = QGraphicsScene() def tearDown(self): super(ReferenceCount, self).tearDown() def beforeTest(self): points = [QPointF(0, 0), QPointF(100, 100), QPointF(0, 100)] pol = self.scene.addPolygon(QPolygonF(points)) self.assert_(isinstance(pol, QGraphicsPolygonItem)) self.wrp = weakref.ref(pol, pol_del) #refcount need be 3 because one ref for QGraphicsScene, and one to rect obj self.assertEqual(sys.getrefcount(pol), 3) def testReferenceCount(self): global destroyedRect global destroyedPol self.beforeTest() rect = self.scene.addRect(10.0, 10.0, 10.0, 10.0) self.assert_(isinstance(rect, QGraphicsRectItem)) self.wrr = weakref.ref(rect, rect_del) #refcount need be 3 because one ref for QGraphicsScene, and one to rect obj self.assertEqual(sys.getrefcount(rect), 3) del rect #not destroyed because one ref continue in QGraphicsScene self.assertEqual(destroyedRect, False) self.assertEqual(destroyedPol, False) del self.scene #QGraphicsScene was destroyed and this destroy internal ref to rect self.assertEqual(destroyedRect, True) self.assertEqual(destroyedPol, True) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/repr_test.py ================================================ import unittest import PySide from PySide.QtCore import QPoint from PySide.QtGui import QMatrix from PySide.QtGui import QMatrix2x2, QMatrix2x3, QMatrix2x4 from PySide.QtGui import QMatrix3x2, QMatrix3x3, QMatrix3x4 from PySide.QtGui import QMatrix4x2, QMatrix4x3, QMatrix4x4 from PySide.QtGui import QVector2D, QVector3D, QVector4D from PySide.QtGui import QColor, QTransform, QKeySequence, QQuaternion from PySide.QtGui import QPolygon class ReprCopyHelper: def testCopy(self): copy = eval(self.original.__repr__()) self.assert_(copy is not self.original) self.assertEqual(copy, self.original) class QTransformReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QTransform(1, 2, 3, 4, 5, 6, 7, 8) class QKeySequenceReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QKeySequence("Ctrl+P") class QQuaternionReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QQuaternion(1, 2, 3, 4) class QVector2DReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QVector2D(1, 2) class QVector3DReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QVector3D(1, 2, 3) class QVector4DReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QVector4D(1, 2, 3, 4) class QMatrixReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QMatrix(1, 2, 3, 4, 5, 6) # Avoid these tests until get gcc fixed # Related bug: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43247 """ class QMatrix2x2ReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QMatrix2x2([1, 2, 3, 4]) class QMatrix2x3ReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QMatrix2x3([1, 2, 3, 4, 5, 6]) class QMatrix2x4ReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QMatrix2x4([1, 2, 3, 4, 5, 6, 7, 8]) class QMatrix3x2ReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QMatrix3x2([1, 2, 3, 4, 5, 6]) class QMatrix3x3ReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QMatrix3x3([1, 2, 3, 4, 5, 6, 7, 8, 9]) class QMatrix3x4ReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QMatrix3x4([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) class QMatrix4x2ReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QMatrix4x2([1, 2, 3, 4, 5, 6, 7, 8]) class QMatrix4x3ReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QMatrix4x3([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) class QMatrix4x4ReprCopy(ReprCopyHelper, unittest.TestCase): def setUp(self): self.original = QMatrix4x4([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]) """ if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/returnquadruplesofnumbers_test.py ================================================ import unittest from PySide.QtGui import QLayout, QWidget, QGraphicsLayout, QGraphicsLayoutItem, QTextCursor, QPrinter from helper import UsesQApplication class Layout(QLayout): def __init__(self): QLayout.__init__(self) class GraphicsLayout(QGraphicsLayout): def __init__(self): QGraphicsLayout.__init__(self) class GraphicsLayoutItem(QGraphicsLayoutItem): def __init__(self): QGraphicsLayoutItem.__init__(self) class ReturnsQuadruplesOfNumbers(UsesQApplication): def compareTuples(self, ta, tb): for va,vb in zip(ta, tb): if round(va) != round(vb): return False return True def testQGraphicsLayoutGetContentsMargins(self): obj = GraphicsLayout() values = (10.0, 20.0, 30.0, 40.0) obj.setContentsMargins(*values) self.assert_(self.compareTuples(obj.getContentsMargins(), values)) def testQGraphicsLayoutItemGetContentsMargins(self): obj = GraphicsLayoutItem() self.assert_(self.compareTuples(obj.getContentsMargins(), (0.0, 0.0, 0.0, 0.0))) def testQWidgetGetContentsMargins(self): obj = QWidget() values = (10, 20, 30, 40) obj.setContentsMargins(*values) self.assert_(self.compareTuples(obj.getContentsMargins(), values)) def testQLayoutGetContentsMargins(self): obj = Layout() values = (10, 20, 30, 40) obj.setContentsMargins(*values) self.assert_(self.compareTuples(obj.getContentsMargins(), values)) def testQTextCursorSelectedTableCells(self): obj = QTextCursor() self.assertEquals(obj.selectedTableCells(), (-1, -1, -1, -1)) def testQPrinterGetPageMargins(self): # Bug #742 obj = QPrinter() values = (10.0, 20.0, 30.0, 40.0, QPrinter.Point) obj.setPageMargins(*values) self.assert_(self.compareTuples(obj.getPageMargins(QPrinter.Point), values[:-1])) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtGui/standardpixmap_test.py ================================================ import unittest from PySide.QtGui import QPixmap, QStyle from helper import UsesQApplication class StandardPixmapTest(UsesQApplication): def testDefaultOptions(self): # Bug 253 pixmap = self.app.style().standardPixmap(QStyle.SP_DirClosedIcon) self.assert_(isinstance(pixmap, QPixmap)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/test_module_template.py ================================================ from PySide.QtGui import QWidget from PySide.QtCore import QObject class MyQObject(QObject): pass class MyQWidget(QWidget): pass class Sentinel(): value = 10 ================================================ FILE: tests/QtGui/timed_app_test.py ================================================ import unittest from helper import TimedQApplication class TestTimedApp(TimedQApplication): '''Simple test case for TimedQApplication''' def testFoo(self): #Simple test of TimedQApplication self.app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/virtual_protected_inheritance_test.py ================================================ '''Test cases for overriding inherited protected virtual methods''' import unittest from PySide.QtCore import QTimerEvent from PySide.QtGui import QApplication, QSpinBox from helper import UsesQApplication class MySpinButton(QSpinBox): '''Simple example class of overriding QObject.timerEvent''' def __init__(self, max_runs=5, app=None): #Creates a new spinbox that will run and quit super(MySpinButton, self).__init__() if app is None: app = QApplication([]) self.app = app self.max_runs = max_runs self.runs = 0 def timerEvent(self, event): #Timer event method self.runs += 1 self.setValue(self.runs) if self.runs == self.max_runs: self.app.quit() if not isinstance(event, QTimerEvent): raise TypeError('Invalid event type. Must be TimerEvent') class TimerEventTest(UsesQApplication): '''Test case for running QObject.timerEvent from inherited class''' qapplication = True def setUp(self): #Acquire resources super(TimerEventTest, self).setUp() self.widget = MySpinButton(app=self.app) def tearDown(self): #Release resources del self.widget super(TimerEventTest, self).tearDown() def testMethod(self): #QWidget.timerEvent overrinding (protected inherited) timer_id = self.widget.startTimer(0) self.app.exec_() self.widget.killTimer(timer_id) self.assert_(self.widget.runs >= self.widget.max_runs) if __name__ == '__main__': unittest.main() #app = QApplication([]) #widget = MySpinButton(app=app) #widget.startTimer(500) #widget.show() #app.exec_() ================================================ FILE: tests/QtGui/virtual_pure_override_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtGui import QGraphicsScene, QGraphicsRectItem, QGraphicsView, QApplication, QBrush, QColor from PySide.QtCore import QTimer from helper import UsesQApplication qgraphics_item_painted = False class RoundRectItem(QGraphicsRectItem): def __init__(self, x, y, w, h): QGraphicsRectItem.__init__(self, x, y, w, h) def paint(self, painter, qstyleoptiongraphicsitem, qwidget): global qgraphics_item_painted qgraphics_item_painted = True class QGraphicsItemTest(UsesQApplication): def createRoundRect(self, scene): item = RoundRectItem(10, 10, 100, 100) item.setBrush(QBrush(QColor(255, 0, 0))) scene.addItem(item) return item def quit_app(self): self.app.quit() def test_setParentItem(self): global qgraphics_item_painted scene = QGraphicsScene() scene.addText("test") view = QGraphicsView(scene) rect = self.createRoundRect(scene) view.show() QTimer.singleShot(1000, self.quit_app) self.app.exec_() self.assert_(qgraphics_item_painted) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/wrong_return_test.py ================================================ '''Test cases for Virtual functions with wrong return type''' import unittest import py3kcompat as py3k from PySide import QtGui from helper import UsesQApplication import warnings warnings.simplefilter('error') class MyWidget(QtGui.QWidget): def __init__(self, parent=None): super(MyWidget, self).__init__(parent) def sizeHint(self): pass class testCase(UsesQApplication): def testVirtualReturn(self): w = MyWidget() if py3k.IS_PY3K: self.assertWarns(RuntimeWarning, w.show) else: self.assertRaises(RuntimeWarning, w.show) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtGui/x11_symbols_test.py ================================================ ''' Test the presence of X11 symbols in QtGui''' import unittest from PySide.QtGui import * class X11Test(unittest.TestCase): def test(self): qpixmapFuncs = dir(QPixmap) self.assert_('handle' in qpixmapFuncs) self.assert_('x11Info' in qpixmapFuncs) self.assert_('x11PictureHandle' in qpixmapFuncs) self.assert_('x11SetDefaultScreen' in qpixmapFuncs) def testX11Functions(self): qx11infoFuncs = dir(QX11Info) self.assert_('display' in qx11infoFuncs) self.assert_('appVisual' in qx11infoFuncs) self.assert_('visual' in qx11infoFuncs) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtHelp/CMakeLists.txt ================================================ PYSIDE_TEST(help_test.py) ================================================ FILE: tests/QtHelp/help_test.py ================================================ import unittest from PySide.QtHelp import QHelpEngine from helper import UsesQApplication class QHelpEngineCreation(UsesQApplication): def testConstructor(self): helpEngine = QHelpEngine('mycollection.qch') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtMaemo5/CMakeLists.txt ================================================ PYSIDE_TEST(pickselector_test.py) PYSIDE_TEST(qmaemo5import_test.py) ================================================ FILE: tests/QtMaemo5/pickselector_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtMaemo5 import QMaemo5ListPickSelector, QMaemo5ValueButton from helper import UsesQApplication class PickSelectorTest(UsesQApplication): def testOwnership(self): pickselector = QMaemo5ListPickSelector() button = QMaemo5ValueButton("test") button.setPickSelector(pickselector) del pickselector self.assert_(button.pickSelector()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtMaemo5/qmaemo5import_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtMaemo5 import * from PySide import QtGui from helper import UsesQApplication class QtMamo5Test(UsesQApplication): def testObjectCreate(self): bar = QMaemo5EditBar() self.assert_(isinstance(bar, QMaemo5EditBar)) def testGui(self): getattr(QtGui, 'QAbstractKineticScroller') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtMultimedia/CMakeLists.txt ================================================ PYSIDE_TEST(audio_test.py) ================================================ FILE: tests/QtMultimedia/audio_test.py ================================================ '''Test cases for QHttp''' import unittest from PySide.QtCore import * from PySide.QtMultimedia import * class testAudioDevices(unittest.TestCase): def testListDevices(self): valid = False devices = QAudioDeviceInfo.availableDevices(QAudio.AudioOutput) if not len(devices): return valid = True for devInfo in devices: if devInfo.deviceName() == 'null': # skip the test if the only device found is a invalid device if len(devices) == 1: return else: continue fmt = QAudioFormat() for codec in devInfo.supportedCodecs(): fmt.setCodec(codec) for frequency in devInfo.supportedFrequencies(): fmt.setFrequency(frequency) for channels in devInfo.supportedChannels(): fmt.setChannels(channels) for sampleType in devInfo.supportedSampleTypes(): fmt.setSampleType(sampleType) for sampleSize in devInfo.supportedSampleSizes(): fmt.setSampleSize(sampleSize) for endian in devInfo.supportedByteOrders(): fmt.setByteOrder(endian) if devInfo.isFormatSupported(fmt): return self.assert_(False) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtNetwork/CMakeLists.txt ================================================ PYSIDE_TEST(bug_446.py) PYSIDE_TEST(bug_1084.py) PYSIDE_TEST(basic_auth_test.py) PYSIDE_TEST(accessManager_test.py) PYSIDE_TEST(http_test.py) PYSIDE_TEST(tcpserver_test.py) PYSIDE_TEST(udpsocket_test.py) PYSIDE_TEST(qipv6address_test.py) ================================================ FILE: tests/QtNetwork/accessManager_test.py ================================================ '''Test cases for QHttp''' import unittest from PySide.QtCore import * from PySide.QtNetwork import * from helper import UsesQCoreApplication from httpd import TestServer class AccessManagerCase(UsesQCoreApplication): def setUp(self): super(AccessManagerCase, self).setUp() self.httpd = TestServer() self.httpd.start() self.called = False def tearDown(self): super(AccessManagerCase, self).tearDown() if self.httpd: self.httpd.shutdown() self.httpd = None def goAway(self): self.httpd.shutdown() self.app.quit() self.httpd = None def slot_replyFinished(self, reply): self.assertEqual(type(reply), QNetworkReply) self.called = True self.goAway() def testNetworkRequest(self): manager = QNetworkAccessManager() manager.finished.connect(self.slot_replyFinished) manager.get(QNetworkRequest(QUrl("http://127.0.0.1:%s" % self.httpd.port()))) self.app.exec_() self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtNetwork/basic_auth_test.py ================================================ import unittest from PySide.QtCore import * from PySide.QtNetwork import * from helper import UsesQCoreApplication from httpd import TestServer class testAuthenticationSignal(UsesQCoreApplication): def setUp(self): super(testAuthenticationSignal, self).setUp() self.httpd = TestServer(secure=True) self.httpd.start() self._resultOk = False def tearDown(self): if self.httpd: self.httpd.shutdown() del self.httpd super(testAuthenticationSignal, self).tearDown() def goAway(self): self.httpd.shutdown() self.app.quit() self.httpd = None def onAuthRequest(self, hostname, port, auth): self.assertTrue(isinstance(auth, QAuthenticator)) self._resultOk = True self.goAway() def testwaitSignal(self): http = QHttp('127.0.0.1', self.httpd.port()) http.connect(SIGNAL("authenticationRequired(const QString&, quint16, QAuthenticator*)"), self.onAuthRequest) path = QUrl.toPercentEncoding("/index.html", "!$&'()*+,;=:@/") data = http.get(str(path)) self.app.exec_() self.assertTrue(self._resultOk) def testwaitSignal2(self): http = QHttp('127.0.0.1', self.httpd.port()) # Using new signal slot syntax causes a segfault http.authenticationRequired.connect(self.onAuthRequest) path = QUrl.toPercentEncoding("/index.html", "!$&'()*+,;=:@/") data = http.get(str(path)) self.app.exec_() self.assertTrue(self._resultOk) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtNetwork/bug_1084.py ================================================ ''' unit test for BUG #1084 ''' import unittest from PySide import QtNetwork import py3kcompat as py3k class QTcpSocketTestCase(unittest.TestCase): def setUp(self): self.sock = QtNetwork.QTcpSocket() self.sock.connectToHost('127.0.0.1', 25) def testIt(self): self.sock.write(py3k.unicode_('quit')) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtNetwork/bug_446.py ================================================ import unittest from PySide.QtCore import * from PySide.QtNetwork import * from helper import UsesQCoreApplication class HttpSignalsCase(UsesQCoreApplication): '''Test case for launching QHttp signals''' DATA = "PySide rocks" def onError(self): self.assert_(False) def onNewConnection(self): self.serverConnection = self.server.nextPendingConnection() self.serverConnection.error.connect(self.onError) self.serverConnection.write(HttpSignalsCase.DATA) self.server.close() def onReadReady(self): data = self.client.read(100) self.assertEqual(data.size(), len(HttpSignalsCase.DATA)) self.assertEqual(data, HttpSignalsCase.DATA) self.done() def onClientConnect(self): self.client.readyRead.connect(self.onReadReady) def initServer(self): self.server = QTcpServer() self.server.newConnection.connect(self.onNewConnection) self.assert_(self.server.listen()) self.client = QTcpSocket() self.client.connected.connect(self.onClientConnect) self.client.connectToHost(QHostAddress(QHostAddress.LocalHost), self.server.serverPort()) def done(self): self.serverConnection.close() self.client.close() self.app.quit() def testRun(self): self.initServer() self.app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtNetwork/http_test.py ================================================ '''Test cases for QHttp''' import unittest from PySide.QtCore import * from PySide.QtNetwork import * from helper import UsesQCoreApplication from httpd import TestServer class HttpSignalsCase(UsesQCoreApplication): '''Test case for launching QHttp signals''' def setUp(self): super(HttpSignalsCase, self).setUp() self.httpd = TestServer() self.httpd.start() self.http = QHttp("127.0.0.1" , self.httpd.port()) self.called = False def tearDown(self): if self.httpd: self.httpd.shutdown() del self.httpd self.http = None self.httpd = None super(HttpSignalsCase, self).tearDown() def goAway(self): self.httpd.shutdown() self.app.quit() def callback(self, ident): self.called = True self.goAway() def testDefaultArgs(self): #QHttp signal requestStarted signal # @bug 114 self.http.requestStarted.connect(self.callback) self.http.get("index.html") self.app.exec_() self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtNetwork/qipv6address_test.py ================================================ '''Test cases for QIPv6Address''' import unittest from PySide.QtNetwork import * class QIPv6AddressGetItemTest(unittest.TestCase): def testLength(self): ip = QIPv6Address() self.assertEqual(len(ip), 16) def testSetItemNegativeIndex(self): ip = QIPv6Address() ip[-1] = 8 self.assertEqual(ip[-1], 8) def testSetItemLargeIndex(self): ip = QIPv6Address() self.assertRaises(IndexError, ip.__setitem__, 32, 16) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtNetwork/tcpserver_test.py ================================================ '''Test cases for QTCPServer''' import unittest from PySide.QtNetwork import QTcpServer class ListenDefaultArgsCase(unittest.TestCase): '''Test case for TcpServer.listen with default args''' def setUp(self): #Acquire resources self.server = QTcpServer() def tearDown(self): #Release resources del self.server def testDefaultArgs(self): # @bug 108 #Default arguments for QTcpServer.listen self.server.listen() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtNetwork/udpsocket_test.py ================================================ '''Test cases for QUdpSocket''' import unittest from PySide.QtCore import QUrl, QObject, SIGNAL, QCoreApplication, QTimer from PySide.QtNetwork import QUdpSocket, QHostAddress class HttpSignalsCase(unittest.TestCase): '''Test case for bug #124 - readDatagram signature QUdpSocket.readDatagram must return a tuple with the datagram, host and port, while receiving only the max payload size.''' def setUp(self): #Acquire resources self.called = False self.app = QCoreApplication([]) self.socket = QUdpSocket() self.server = QUdpSocket() self.server.bind(QHostAddress(QHostAddress.LocalHost), 45454) def tearDown(self): #Release resources del self.socket del self.server del self.app def sendPackage(self): addr = QHostAddress(QHostAddress.LocalHost) self.socket.writeDatagram('datagram', addr, 45454) def callback(self): while self.server.hasPendingDatagrams(): datagram, host, port = self.server.readDatagram(self.server.pendingDatagramSize()) self.called = True self.app.quit() def testDefaultArgs(self): #QUdpSocket.readDatagram pythonic return # @bug 124 QObject.connect(self.server, SIGNAL('readyRead()'), self.callback) self.sendPackage() self.app.exec_() self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtOpenGL/CMakeLists.txt ================================================ if(${QTVERSION} VERSION_GREATER 4.6.9) PYSIDE_TEST(qglbuffer_test.py) endif() PYSIDE_TEST(qglwidget_test.py) ================================================ FILE: tests/QtOpenGL/qglbuffer_test.py ================================================ #!/usr/bin/python '''Unit tests for QGLBuffer''' import unittest from PySide.QtCore import QByteArray from PySide.QtOpenGL import QGLBuffer, QGLWidget import py3kcompat as py3k from helper import UsesQApplication class QGLBufferTest(UsesQApplication): def testIt(self): w = QGLWidget() w.makeCurrent() b = QGLBuffer() b.setUsagePattern(QGLBuffer.DynamicDraw) self.assertTrue(b.create()) self.assertTrue(b.bufferId() != 0) self.assertTrue(b.bind()) data = QByteArray("12345") b.allocate(data) self.assertEqual(b.size(), data.size()) m = b.map(QGLBuffer.ReadOnly) if m: self.assertEqual(m, py3k.buffer(py3k.b(data.data()))) b.unmap() m = b.map(QGLBuffer.ReadWrite) m[3] = py3k.b('A') b.unmap() result, rdata = b.read(3, 1) self.assertTrue(result) self.assertEqual(py3k.b('A'), rdata.data()) else: print(" memory mapping is not possible in this OpenGL implementation.") b.release() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtOpenGL/qglwidget_test.py ================================================ import unittest from PySide.QtGui import * from PySide.QtOpenGL import * class TestQGLWidget (unittest.TestCase): def testIt(self): """Just test if the bindTexture(*, GLenum, GLint) methods overloads exists""" app = QApplication([]) img = QImage() w = QGLWidget() a = w.bindTexture(img, 0, 0) # ok if it throws nothing.. :-) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtScript/CMakeLists.txt ================================================ PYSIDE_TEST(base_test.py) PYSIDE_TEST(bug_1022.py) PYSIDE_TEST(engine_test.py) PYSIDE_TEST(property_test.py) PYSIDE_TEST(qscriptvalue_test.py) ================================================ FILE: tests/QtScript/base_test.py ================================================ from PySide import QtScript #only test if the module import works fine bug #278 ================================================ FILE: tests/QtScript/bug_1022.py ================================================ import unittest from PySide.QtCore import * from PySide.QtScript import * class QScriptValueTest(unittest.TestCase): def testQScriptValue(self): app = QCoreApplication([]) engine = QScriptEngine() repr(engine.evaluate('1 + 1')) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtScript/engine_test.py ================================================ import unittest from PySide.QtCore import QObject from PySide.QtScript import QScriptEngine class QScriptEngineTest(unittest.TestCase): def testQScriptEngine(self): engine = QScriptEngine() obj = engine.evaluate("({ unitName: 'Celsius', toKelvin: function(x) { return x + 273; } })") toKelvin = obj.property("toKelvin") result = toKelvin.call(obj, [100]) self.assertEqual(result.toNumber(), 373) ================================================ FILE: tests/QtScript/property_test.py ================================================ import unittest from PySide.QtCore import QObject, Property, QCoreApplication from PySide.QtScript import QScriptEngine class MyObject(QObject): def __init__(self, parent = None): QObject.__init__(self, parent) self._p = 100 def setX(self, value): self._p = value def getX(self): return self._p def resetX(self): self._p = 100 def delX(self): self._p = 0 x = Property(int, getX, setX, resetX, delX) class QPropertyTest(unittest.TestCase): def testSimple(self): o = MyObject() self.assertEqual(o.x, 100) o.x = 42 self.assertEqual(o.x, 42) def testHasProperty(self): o = MyObject() o.setProperty("x", 10) self.assertEqual(o.x, 10) self.assertEqual(o.property("x"), 10) def testMetaProperty(self): o = MyObject() m = o.metaObject() found = False for i in range(m.propertyCount()): mp = m.property(i) if mp.name() == "x": found = True break self.assert_(found) def testScriptQProperty(self): qapp = QCoreApplication([]) myEngine = QScriptEngine() obj = MyObject() scriptObj = myEngine.newQObject(obj) myEngine.globalObject().setProperty("obj", scriptObj) myEngine.evaluate("obj.x = 42") self.assertEqual(scriptObj.property("x").toInt32(), 42) self.assertEqual(obj.property("x"), 42) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtScript/qscriptvalue_test.py ================================================ import unittest import PySide from PySide.QtScript import * from helper import UsesQApplication class TestQScriptValue (UsesQApplication): def testOperator(self): engine = QScriptEngine() value = engine.evaluate('x = {"a": 1, "b":2}') self.assertEqual(value['a'], 1) self.assertRaises(KeyError, value.__getitem__, 'c') value = engine.evaluate('x = ["x", "y", "z"]') self.assertEqual(value[2], 'z') self.assertRaises(IndexError, value.__getitem__, 23) def testRepr(self): value = QScriptValue("somePerson = { firstName: 'John', lastName: 'Doe' }") value2 = eval(repr(value)) self.assertEqual(value.toString(), value2.toString()) self.assertEqual(value.toVariant(), value2.toVariant()) def testIteratorProtocol(self): engine = QScriptEngine() value = engine.evaluate('x = {"a": 1, "b":2}') d = {} for k, v in QScriptValueIterator(value): d[k] = v self.assertEqual(d, {'a': 1, 'b': 2}) d = {} for k, v in value: d[k] = v self.assertEqual(d, {'a': 1, 'b': 2}) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtScriptTools/CMakeLists.txt ================================================ PYSIDE_TEST(debugger_test.py) ================================================ FILE: tests/QtScriptTools/debugger_test.py ================================================ import unittest from PySide.QtCore import SIGNAL, QTimer from PySide.QtScript import QScriptEngine from PySide.QtScriptTools import QScriptEngineDebugger from helper import UsesQApplication class DebuggerTest(UsesQApplication): def setUp(self): UsesQApplication.setUp(self) self.engine = QScriptEngine() self.debugger = QScriptEngineDebugger() self.has_suspended = 0 self.has_resumed = 0 self.count = 3 def suspended(self): self.has_suspended += 1 # Will emit evaluationResumed until there are more instructions to be run QTimer.singleShot(100, self.debugger.action(QScriptEngineDebugger.StepIntoAction).trigger) def resumed(self): # Will be called when debugger.state() change from Suspended to Running # except for the first time. self.has_resumed += 1 def testBasic(self): '''Interrupt and resume evaluation with QScriptEngineDebugger''' self.debugger.attachTo(self.engine) self.debugger.setAutoShowStandardWindow(False) self.debugger.connect(SIGNAL('evaluationSuspended()'), self.suspended) self.debugger.connect(SIGNAL('evaluationResumed()'), self.resumed) self.debugger.action(QScriptEngineDebugger.InterruptAction).trigger() self.engine.evaluate("3+4\n2+1\n5+1") self.assert_(self.has_resumed >= 1) self.assert_(self.has_suspended >= 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtSql/CMakeLists.txt ================================================ PYSIDE_TEST(bug_1013.py) PYSIDE_TEST(qsqldatabaseandqueries_test.py) PYSIDE_TEST(qvarianttype_test.py) ================================================ FILE: tests/QtSql/bug_1013.py ================================================ from PySide.QtCore import * from PySide.QtSql import * import unittest class TestBug1013 (unittest.TestCase): def someSlot(self, row, record): record.setValue(0, 2) self._wasCalled = True def testIt(self): app = QCoreApplication([]) db = QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName(':memory:') db.open() query = QSqlQuery() query.exec_('CREATE TABLE "foo" (id INT);') model = QSqlTableModel() model.setTable('foo') self._wasCalled = False model.primeInsert.connect(self.someSlot) model.select() QTimer.singleShot(0,lambda: model.insertRow(0) and app.quit()) app.exec_() self.assertTrue(self._wasCalled) self.assertEqual(model.data(model.index(0, 0)), 2) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtSql/qsqldatabaseandqueries_test.py ================================================ #!/usr/bin/python '''Test cases for QtSql database creation, destruction and queries''' import sys import unittest from PySide import QtSql from PySide.QtCore import * from PySide.QtGui import * class Foo(QWidget): def __init__(self): QWidget.__init__(self) self.model = QtSql.QSqlTableModel() class SqlDatabaseCreationDestructionAndQueries(unittest.TestCase): '''Test cases for QtSql database creation, destruction and queries''' def setUp(self): #Acquire resources self.assertFalse(not QtSql.QSqlDatabase.drivers(), "installed Qt has no DB drivers") self.assertTrue("QSQLITE" in QtSql.QSqlDatabase.drivers(), "\"QSQLITE\" driver not available in this Qt version") self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE") self.db.setDatabaseName(":memory:") self.assertTrue(self.db.open()) def tearDown(self): #Release resources self.db.close() QtSql.QSqlDatabase.removeDatabase(":memory:") del self.db def testTableCreationAndDestruction(self): #Test table creation and destruction query = QtSql.QSqlQuery() query.exec_("CREATE TABLE dummy(id int primary key, dummyfield varchar(20))") query.exec_("DROP TABLE dummy") query.clear() def testTableInsertionAndRetrieval(self): #Test table creation, insertion and retrieval query = QtSql.QSqlQuery() query.exec_("CREATE TABLE person(id int primary key, " "firstname varchar(20), lastname varchar(20))") query.exec_("INSERT INTO person VALUES(101, 'George', 'Harrison')") query.prepare("INSERT INTO person (id, firstname, lastname) " "VALUES (:id, :firstname, :lastname)") query.bindValue(":id", 102) query.bindValue(":firstname", "John") query.bindValue(":lastname", "Lennon") query.exec_() lastname = '' query.exec_("SELECT lastname FROM person where id=101") self.assertTrue(query.isActive()) query.next() lastname = query.value(0) self.assertEqual(lastname, 'Harrison') def testTableModelDeletion(self): app = QApplication([]) bar = Foo() model = bar.model del bar del app if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtSql/qvarianttype_test.py ================================================ '''Test cases for QVariant::Type converter''' import unittest import py3kcompat as py3k from PySide.QtSql import QSqlField class QVariantTypeTest(unittest.TestCase): def testQVariantType(self): f = QSqlField("name", str) self.assertEqual(f.type(), py3k.unicode) f = QSqlField("name", "QString") self.assertEqual(f.type(), py3k.unicode) f = QSqlField("name", "double") self.assertEqual(f.type(), float) f = QSqlField("name", float) self.assertEqual(f.type(), float) f = QSqlField("name", int) self.assertEqual(f.type(), int) if not py3k.IS_PY3K: f = QSqlField("name", long) self.assertEqual(f.type(), int) # long isn't registered in QVariant:Type, just in QMetaType::Type #f = QSqlField("name", QObject) #self.assertEqual(f.type(), None) f = QSqlField("name", None) self.assertEqual(f.type(), None) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtSvg/CMakeLists.txt ================================================ PYSIDE_TEST(qsvggenerator_test.py) PYSIDE_TEST(qsvgrenderer_test.py) PYSIDE_TEST(qsvgwidget_test.py) ================================================ FILE: tests/QtSvg/qsvggenerator_test.py ================================================ #!/usr/bin/python import unittest from sys import getrefcount from PySide.QtCore import QBuffer from PySide.QtSvg import QSvgGenerator class QSvgGeneratorTest(unittest.TestCase): def testRefCountOfTOutputDevice(self): generator = QSvgGenerator() iodevice1 = QBuffer() refcount1 = getrefcount(iodevice1) generator.setOutputDevice(iodevice1) self.assertEqual(generator.outputDevice(), iodevice1) self.assertEqual(getrefcount(generator.outputDevice()), refcount1 + 1) iodevice2 = QBuffer() refcount2 = getrefcount(iodevice2) generator.setOutputDevice(iodevice2) self.assertEqual(generator.outputDevice(), iodevice2) self.assertEqual(getrefcount(generator.outputDevice()), refcount2 + 1) self.assertEqual(getrefcount(iodevice1), refcount1) del generator self.assertEqual(getrefcount(iodevice2), refcount2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtSvg/qsvgrenderer_test.py ================================================ #!/usr/bin/python import unittest, os from PySide.QtCore import * from PySide.QtGui import * from PySide.QtSvg import * class QSvgRendererTest(unittest.TestCase): def testLoad(self): tigerPath = os.path.join(os.path.dirname(__file__), 'tiger.svg') app = QApplication([]) fromFile = QSvgRenderer(tigerPath) self.assertTrue(fromFile.isValid()) tigerFile = QFile(tigerPath) tigerFile.open(QFile.ReadOnly) tigerData = tigerFile.readAll() fromContents = QSvgRenderer(tigerData) self.assertTrue(fromContents.isValid()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtSvg/qsvgwidget_test.py ================================================ #!/usr/bin/python import unittest, os from PySide.QtCore import * from PySide.QtGui import * from PySide.QtSvg import * class QSvgWidgetTest(unittest.TestCase): def testLoad(self): tigerPath = os.path.join(os.path.dirname(__file__), 'tiger.svg') app = QApplication([]) fromFile = QSvgWidget() fromFile.load(tigerPath) self.assertTrue(fromFile.renderer().isValid()) tigerFile = QFile(tigerPath) tigerFile.open(QFile.ReadOnly) tigerData = tigerFile.readAll() fromContents = QSvgWidget() fromContents.load(tigerData) self.assertTrue(fromContents.renderer().isValid()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtTest/CMakeLists.txt ================================================ PYSIDE_TEST(click_test.py) PYSIDE_TEST(eventfilter_test.py) PYSIDE_TEST(touchevent_test.py) ================================================ FILE: tests/QtTest/click_test.py ================================================ '''QtTest mouse click functionalities''' import unittest from PySide.QtCore import Qt, QObject from PySide.QtGui import QPushButton, QLineEdit from PySide.QtTest import QTest from helper import UsesQApplication class MouseClickTest(UsesQApplication): def testBasic(self): '''QTest.mouseClick with QCheckBox''' button = QPushButton() button.setCheckable(True) button.setChecked(False) QTest.mouseClick(button, Qt.LeftButton) self.assert_(button.isChecked()) QTest.mouseClick(button, Qt.LeftButton) self.assertFalse(button.isChecked()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtTest/eventfilter_test.py ================================================ '''Tests for QKeyEvent''' import unittest from PySide.QtCore import * from PySide.QtGui import * from PySide.QtTest import QTest from helper import UsesQApplication class KeyEventFilter(QObject): def __init__(self, widget, eventType, key): QObject.__init__(self) self.widget = widget self.eventType = eventType self.key = key self.processed = False def eventFilter(self, obj, event): if self.widget == obj and event.type() == self.eventType and \ isinstance(event, QKeyEvent) and event.key() == self.key: self.processed = True return True return False class EventFilterTest(UsesQApplication): def testKeyEvent(self): widget = QLineEdit() key = Qt.Key_A eventFilter = KeyEventFilter(widget, QEvent.KeyPress, key) widget.installEventFilter(eventFilter) QTest.keyClick(widget, key) self.assert_(eventFilter.processed) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtTest/touchevent_test.py ================================================ from PySide.QtGui import QWidget from PySide.QtCore import QPoint, QTimer, Qt, QEvent from PySide.QtTest import QTest import unittest from helper import UsesQApplication class MyWidget(QWidget): def __init__(self, parent = None): QWidget.__init__(self, parent) self._sequence = [] self.setAttribute(Qt.WA_AcceptTouchEvents) QTimer.singleShot(200, self.generateEvent) def event(self, e): self._sequence.append(e.type()) return QWidget.event(self, e) def generateEvent(self): o = QTest.touchEvent(self) o.press(0, QPoint(10, 10)) o.commit() del o QTest.touchEvent(self).press(0, QPoint(10, 10)) QTest.touchEvent(self).stationary(0).press(1, QPoint(40, 10)) QTest.touchEvent(self).move(0, QPoint(12, 12)).move(1, QPoint(45, 5)) QTest.touchEvent(self).release(0, QPoint(12, 12)).release(1, QPoint(45, 5)) QTimer.singleShot(200, self.deleteLater) class TouchEventTest(UsesQApplication): def testCreateEvent(self): w = MyWidget() w.show() self.app.exec_() # same values as C++ self.assertEqual(w._sequence.count(QEvent.Type.TouchBegin), 2) self.assertEqual(w._sequence.count(QEvent.Type.TouchUpdate), 2) self.assertEqual(w._sequence.count(QEvent.Type.TouchEnd), 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtUiTools/CMakeLists.txt ================================================ PYSIDE_TEST(bug_360.py) PYSIDE_TEST(bug_376.py) PYSIDE_TEST(bug_392.py) PYSIDE_TEST(bug_426.py) PYSIDE_TEST(bug_552.py) PYSIDE_TEST(bug_797.py) PYSIDE_TEST(bug_909.py) PYSIDE_TEST(bug_913.py) PYSIDE_TEST(bug_958.py) PYSIDE_TEST(bug_965.py) PYSIDE_TEST(bug_1060.py) PYSIDE_TEST(uiloader_test.py) PYSIDE_TEST(ui_test.py) ================================================ FILE: tests/QtUiTools/action.ui ================================================ main_window foo ================================================ FILE: tests/QtUiTools/bug_1060.py ================================================ ''' unit test for BUG #1060 ''' from PySide.QtGui import QApplication from PySide.QtUiTools import QUiLoader from helper import adjust_filename class MyQUiLoader(QUiLoader): def __init__(self): super(MyQUiLoader, self).__init__() def createWidget(self, *args): return super(MyQUiLoader, self).createWidget(*args) if __name__ == "__main__": app = QApplication([]) ui = MyQUiLoader().load(adjust_filename("bug_1060.ui", __file__)) ui.show() ================================================ FILE: tests/QtUiTools/bug_1060.ui ================================================ Dialog 0 0 100 100 Dialog ================================================ FILE: tests/QtUiTools/bug_360.py ================================================ import unittest import os from helper import UsesQApplication from PySide import QtCore, QtGui from PySide.QtUiTools import QUiLoader class MyQUiLoader(QUiLoader): def __init__(self, baseinstance): QUiLoader.__init__(self) self.baseinstance = baseinstance self._widgets = [] def createWidget(self, className, parent=None, name=""): widget = QUiLoader.createWidget(self, className, parent, name) self._widgets.append(widget) if parent is None: return self.baseinstance else: setattr(self.baseinstance, name, widget) return widget class ButTest(UsesQApplication): def testCase(self): w = QtGui.QWidget() loader = MyQUiLoader(w) filePath = os.path.join(os.path.dirname(__file__), 'minimal.ui') ui = loader.load(filePath) self.assertEqual(len(loader._widgets), 1) self.assertEqual(type(loader._widgets[0]), QtGui.QFrame) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtUiTools/bug_376.py ================================================ import unittest import os from helper import UsesQApplication from PySide import QtCore, QtGui from PySide.QtUiTools import QUiLoader class BugTest(UsesQApplication): def testCase(self): w = QtGui.QWidget() loader = QUiLoader() filePath = os.path.join(os.path.dirname(__file__), 'test.ui') result = loader.load(filePath, w) self.assert_(isinstance(result.child_object, QtGui.QFrame)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtUiTools/bug_392.py ================================================ import unittest import os from helper import UsesQApplication from PySide import QtGui from PySide.QtUiTools import QUiLoader class MyWidget(QtGui.QComboBox): def __init__(self, parent=None): QtGui.QComboBox.__init__(self, parent) def isPython(self): return True class BugTest(UsesQApplication): def testCase(self): w = QtGui.QWidget() loader = QUiLoader() filePath = os.path.join(os.path.dirname(__file__), 'action.ui') result = loader.load(filePath, w) self.assert_(isinstance(result.actionFoo, QtGui.QAction)) def testPythonCustomWidgets(self): w = QtGui.QWidget() loader = QUiLoader() loader.registerCustomWidget(MyWidget) filePath = os.path.join(os.path.dirname(__file__), 'pycustomwidget.ui') result = loader.load(filePath, w) self.assert_(isinstance(result.custom, MyWidget)) self.assert_(result.custom.isPython()) def testPythonCustomWidgetsTwice(self): w = QtGui.QWidget() loader = QUiLoader() loader.registerCustomWidget(MyWidget) filePath = os.path.join(os.path.dirname(__file__), 'pycustomwidget2.ui') result = loader.load(filePath, w) self.assert_(isinstance(result.custom, MyWidget)) self.assert_(isinstance(result.custom2, MyWidget)) self.assert_(result.custom.isPython()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtUiTools/bug_426.py ================================================ import sys import os from PySide import QtCore, QtGui from PySide.QtUiTools import QUiLoader class Window(object): def __init__(self): loader = QUiLoader() filePath = os.path.join(os.path.dirname(__file__), 'bug_426.ui') self.widget = loader.load(filePath) self.group = QtGui.QActionGroup(self.widget) self.widget.show() QtCore.QTimer.singleShot(0, self.widget.close) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) win = Window() sys.exit(app.exec_()) ================================================ FILE: tests/QtUiTools/bug_426.ui ================================================ Form 0 0 400 300 Form ================================================ FILE: tests/QtUiTools/bug_552.py ================================================ from helper import adjust_filename from PySide import QtGui, QtCore from PySide.QtUiTools import QUiLoader class View_1(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) loader = QUiLoader() widget = loader.load(adjust_filename('bug_552.ui', __file__), self) self.children = [] for child in widget.findChildren(QtCore.QObject, None): self.children.append(child) self.t = widget.tabWidget self.t.removeTab(0) app = QtGui.QApplication([]) window = View_1() window.show() # If it doesn't crash it works :-) ================================================ FILE: tests/QtUiTools/bug_552.ui ================================================ Form 0 0 400 300 Form 130 80 139 80 0 Tab 1 Tab 2 ================================================ FILE: tests/QtUiTools/bug_797.py ================================================ from PySide import QtUiTools from PySide import QtCore from PySide import QtGui from helper import adjust_filename app = QtGui.QApplication([]) loader = QtUiTools.QUiLoader() file = QtCore.QFile(adjust_filename('bug_552.ui', __file__)) w = QtGui.QWidget() # An exception can't be thrown mainWindow = loader.load(file, w) ================================================ FILE: tests/QtUiTools/bug_909.py ================================================ import sys import unittest from PySide.QtCore import QFile from PySide.QtGui import QTabWidget from PySide.QtUiTools import QUiLoader from helper import UsesQApplication from helper import adjust_filename class TestDestruction(UsesQApplication): def testBug909(self): fileName = QFile(adjust_filename('bug_909.ui', __file__)) loader = QUiLoader() main_win = loader.load(fileName) self.assertEqual(sys.getrefcount(main_win), 2) fileName.close() tw = QTabWidget(main_win) main_win.setCentralWidget(tw) main_win.show() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtUiTools/bug_909.ui ================================================ MainWindow 0 0 800 600 MainWindow 0 0 800 25 ================================================ FILE: tests/QtUiTools/bug_913.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import unittest from helper import adjust_filename from PySide.QtCore import * from PySide.QtGui import * from PySide.QtUiTools import * class TestBug913 (unittest.TestCase): def testIt(self): app = QApplication([]) loader = QUiLoader() widget = loader.load(adjust_filename('bug_913.ui', __file__)) widget.tabWidget.currentIndex() # direct child is available as member widget.le_first.setText('foo') # child of QTabWidget must also be available! if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtUiTools/bug_913.ui ================================================ Form 0 0 400 300 Form Tab 1 First name: Last name: Tab 2 ================================================ FILE: tests/QtUiTools/bug_958.py ================================================ import unittest from PySide import QtGui, QtUiTools from helper import adjust_filename from helper import TimedQApplication class Gui_Qt(QtGui.QMainWindow): def __init__(self, parent=None): super(Gui_Qt, self).__init__(parent) lLoader = QtUiTools.QUiLoader() # this used to cause a segfault because the old inject code used to destroy the parent layout self._cw = lLoader.load(adjust_filename('bug_958.ui', __file__), self) self.setCentralWidget(self._cw) class BugTest(TimedQApplication): def testCase(self): lMain = Gui_Qt() lMain.show() self.app.exec_() if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtUiTools/bug_958.ui ================================================ customWidget 0 0 626 578 500 0 Form 0 &Berechnen ================================================ FILE: tests/QtUiTools/bug_965.py ================================================ from PySide.QtUiTools import QUiLoader import unittest from helper import UsesQApplication from helper import adjust_filename class MyQUiLoader(QUiLoader): def __init__(self): super(MyQUiLoader, self).__init__() def createWidget(self, className, parent=None, name=""): return None class BugTest(UsesQApplication): def testCase(self): loader = MyQUiLoader() self.assertRaises(RuntimeError, loader.load, adjust_filename('bug_965.ui', __file__)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtUiTools/bug_965.ui ================================================ MainWindow MainWindow 0 0 800 600 MainWindow ================================================ FILE: tests/QtUiTools/minimal.ui ================================================ Form ================================================ FILE: tests/QtUiTools/pycustomwidget.ui ================================================ qwidget 0 0 400 300 10 10 79 23 MyWidget QComboBox
customwidget
================================================ FILE: tests/QtUiTools/pycustomwidget2.ui ================================================ qwidget 0 0 400 300 10 10 79 23 10 10 79 23 MyWidget QComboBox
customwidget
================================================ FILE: tests/QtUiTools/test.ui ================================================ Form 0 0 185 133 Form 0 0 181 131 QFrame::StyledPanel QFrame::Raised 50 60 80 25 PushButton ================================================ FILE: tests/QtUiTools/ui_test.py ================================================ import unittest from PySide.QtUiTools import QUiLoader from helper import UsesQApplication class QUiLoaderCreation(UsesQApplication): def testConstructor(self): loader = QUiLoader() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtUiTools/uiloader_test.py ================================================ import unittest import os from helper import UsesQApplication from PySide.QtGui import QWidget from PySide.QtUiTools import QUiLoader def get_file_path(): for path in file_path: if os.path.exists(path): return path return "" class QUioaderTeste(UsesQApplication): def testLoadFile(self): filePath = os.path.join(os.path.dirname(__file__), 'test.ui') loader = QUiLoader() parent = QWidget() w = loader.load(filePath, parent) self.assertNotEqual(w, None) self.assertEqual(len(parent.children()), 1) child = w.findChild(QWidget, "child_object") self.assertNotEqual(child, None) self.assertEqual(w.findChild(QWidget, "grandson_object"), child.findChild(QWidget, "grandson_object")) def testLoadFileUnicodeFilePath(self): filePath = str(os.path.join(os.path.dirname(__file__), 'test.ui')) loader = QUiLoader() parent = QWidget() w = loader.load(filePath, parent) self.assertNotEqual(w, None) self.assertEqual(len(parent.children()), 1) child = w.findChild(QWidget, "child_object") self.assertNotEqual(child, None) self.assertEqual(w.findChild(QWidget, "grandson_object"), child.findChild(QWidget, "grandson_object")) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtWebKit/CMakeLists.txt ================================================ PYSIDE_TEST(bug_448.py) PYSIDE_TEST(bug_694.py) PYSIDE_TEST(bug_803.py) PYSIDE_TEST(bug_899.py) PYSIDE_TEST(bug_959.py) PYSIDE_TEST(qvariantlist_property_test.py) PYSIDE_TEST(qml_plugin_test.py) PYSIDE_TEST(shouldInterruptjavascript_test.py) PYSIDE_TEST(webpage_test.py) PYSIDE_TEST(webview_test.py) PYSIDE_TEST(webframe_test.py) ================================================ FILE: tests/QtWebKit/bug_448.py ================================================ '''Test cases for bug: http://bugs.openbossa.org/show_bug.cgi?id=448''' import unittest import sys from PySide.QtGui import QApplication from PySide.QtWebKit import QWebView class Bug448(unittest.TestCase): def onError(self, erros): pass def testReturnOwnership(self): app = QApplication(sys.argv) webview = QWebView() webview.page().networkAccessManager().sslErrors.connect(self.onError) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtWebKit/bug_694.py ================================================ import sys import unittest from PySide.QtCore import * from PySide.QtGui import * from PySide.QtWebKit import * class ErrorPage (QWebPage): def __init__(self): QWebPage.__init__(self) self.rcv_extension = None self.rcv_url = None self.rcv_url_copy = None self.rcv_option_type = None self.rcv_output_type = None def supportsExtension(self, extension): return extension == QWebPage.ErrorPageExtension def extension(self, extension, option, output): self.rcv_extension = extension self.rcv_url = option.url self.rcv_url_copy = QUrl(option.url) self.rcv_option_type = type(option) self.rcv_output_type = type(output) return True class TestWebPageExtension(unittest.TestCase): def testIt(self): app = QApplication([]) ep = ErrorPage() view = QWebView() view.setPage(ep) view.load("foo://bar") # Some malformmed url view.show() # If the timeout is 0 the webpage isn't even loaded on Qt4.6-i386, so we use 100 :-) QTimer.singleShot(100, app.quit) app.exec_() self.assertEqual(ep.rcv_extension, QWebPage.ErrorPageExtension) self.assertRaises(RuntimeError, ep.rcv_url.__str__) self.assertEqual(ep.rcv_url_copy, "foo://bar") self.assertEqual(ep.rcv_option_type, QWebPage.ErrorPageExtensionOption) self.assertEqual(ep.rcv_output_type, QWebPage.ErrorPageExtensionReturn) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtWebKit/bug_803.py ================================================ import unittest from PySide.QtGui import * from PySide.QtWebKit import * class TestBug803 (unittest.TestCase): def testIt(self): app = QApplication([]) page = QWebPage() frame = page.mainFrame() frame.setHtml("

1

2

") elems = frame.findAllElements("p") self.assertEqual(len(elems), 2) self.assertEqual(elems[0].toPlainText(), "1") self.assertEqual(elems[1].toPlainText(), "2") if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtWebKit/bug_899.py ================================================ import unittest from PySide.QtCore import Property, QObject from PySide.QtWebKit import QWebView from helper import TimedQApplication class TestLambdaPropery(TimedQApplication): def testBug899(self): html = ''' ''' class Obj(object): list1 = ['foo', 'bar', 'baz'] list2 = ['fi', 'fo', 'fum'] obj = Obj() wrapper_dict = {} for name in ('list1', 'list2'): getter = lambda arg=None, name=name: getattr(obj, name) wrapper_dict[name] = Property('QVariantList', getter) wrapper = type('PyObj', (QObject,), wrapper_dict) view = QWebView() view.page().mainFrame().addToJavaScriptWindowObject('py_obj', wrapper()) view.setHtml(html) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtWebKit/bug_959.py ================================================ from PySide.QtCore import QObject, Slot, QTimer from PySide.QtWebKit import QWebView from PySide.QtGui import QApplication from PySide import QtCore import sys import unittest from helper import UsesQApplication functionID = -1 currentWebView = None class JSFuncs(QObject): @Slot(str,result=str) def slot_str_str(self, x): global functionID functionID = 0 return x.upper() @Slot(str,result='QVariant') def slot_str_list(self, x): global functionID functionID = 1 return [x, x] @Slot('QStringList',result=str) def slot_strlist_str(self, x): global functionID functionID = 2 return x[-1] @Slot('QVariant',result=str) def slot_variant_str(self, x): global functionID functionID = 3 return str(x) @Slot('QVariantList',result=str) def slot_variantlist_str(self, x): global functionID functionID = 4 return str(x[-1]) @Slot('QVariantMap',result=str) def slot_variantmap_str(self, x): global functionID functionID = 5 return str(x["foo"]) PAGE_DATA = "data:text/html," FUNCTIONS_LIST = ['jsfuncs.slot_str_str("hello")', 'jsfuncs.slot_str_list("hello")', 'jsfuncs.slot_strlist_str(["hello","world"])', 'jsfuncs.slot_variant_str("hello")', 'jsfuncs.slot_variantlist_str(["hello","world"])', 'jsfuncs.slot_variantmap_str({"foo": "bar"})'] def onLoadFinished( result ): QTimer.singleShot( 100, createNextWebView ) def createNextWebView(): global functionID nListCount = len(FUNCTIONS_LIST) - 1 functionID = functionID + 1 print functionID if functionID < nListCount: createWebView( functionID ) else: QTimer.singleShot(300, QApplication.instance().quit) def createWebView( nIndex ): global functionID global currentWebView functionID = nIndex currentWebView = QWebView() currentWebView._jsfuncs = JSFuncs() currentWebView.page().mainFrame().addToJavaScriptWindowObject("jsfuncs", currentWebView._jsfuncs) QObject.connect( currentWebView, QtCore.SIGNAL('loadFinished( bool )'), onLoadFinished ) currentWebView.load(PAGE_DATA % FUNCTIONS_LIST[ nIndex ]) currentWebView.show() class Bug959(UsesQApplication): def testJavaScriptInWebViewForCrash( self ): # wait for the webview load to be finished before creating the next webview # don't create the webview inside of onLoadFinished # also call onLoadFinished with the correct number of variables createNextWebView() self.app.exec_() if __name__ == "__main__": unittest.main() ================================================ FILE: tests/QtWebKit/fox.html ================================================ Title

The quick brown fox jumps over the lazy dog.

================================================ FILE: tests/QtWebKit/qml_plugin_test.py ================================================ import os import sys import unittest from PySide.QtCore import QUrl, QTimer from PySide.QtGui import QApplication, QLabel from PySide.QtWebKit import QWebPluginFactory, QWebView, QWebSettings from helper import UsesQApplication class PluginFactory(QWebPluginFactory): def plugins(self): plugins = [] mime = self.MimeType() mime.name = 'DummyFile' mime.fileExtensions = ['.pys'] plugin = self.Plugin() plugin.name = 'DummyPlugin' plugin.mimeTypes = [mime] plugins.append(plugin) return plugins def create(self, mimeType, url, argumentNames, argumentValues): if mimeType != 'application/x-dummy': return None for name, value in zip(argumentNames, argumentValues): if name == 'text': text = value else: text = "Webkit plugins!" widget = QLabel(text) return widget class TestPlugin(UsesQApplication): def testPlugin(self): view = QWebView() fac = PluginFactory() view.page().setPluginFactory(fac) QWebSettings.globalSettings().setAttribute(QWebSettings.PluginsEnabled, True) view.load(QUrl(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'qmlplugin', 'index.html'))) view.resize(840, 600) view.show() QTimer.singleShot(500, self.app.quit) self.app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtWebKit/qmlplugin/dummy.pys ================================================ Foobar! ================================================ FILE: tests/QtWebKit/qmlplugin/index.html ================================================

Custom Plugin

================================================ FILE: tests/QtWebKit/qvariantlist_property_test.py ================================================ import unittest from PySide.QtCore import Property, QObject from PySide.QtWebKit import QWebView from helper import TimedQApplication class TestLoadFinished(TimedQApplication): def setUp(self): TimedQApplication.setUp(self, timeout=1000) def tearDown(self): TimedQApplication.tearDown(self) def testQVariantListProperty(self): class Obj(object): list = ['foo', 'bar', 'baz'] obj = Obj() wrapper_dict = {} for name in ['list']: getter = lambda arg=None, name=name: getattr(obj, name) wrapper_dict[name] = Property('QVariantList', getter) wrapper = type('PyObj', (QObject,), wrapper_dict) view = QWebView() frame = view.page().mainFrame() frame.addToJavaScriptWindowObject('py_obj', wrapper()) html = ''' ''' view.setHtml(html) view.show() self.app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtWebKit/shouldInterruptjavascript_test.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from PySide import QtCore, QtWebKit from helper import UsesQApplication class QWebPageHeadless(QtWebKit.QWebPage): # FIXME: This is not working, the slot is not overriden! # http://doc.qt.nokia.com/4.7-snapshot/qwebpage.html#shouldInterruptJavaScript @QtCore.Slot() def shouldInterruptJavaScript(self): self._interrupted = True QtCore.QTimer.singleShot(300, self._app.quit) return True class TestSlotOverride(UsesQApplication): def testFunctionCall(self): page = QWebPageHeadless() page._interrupted = False page._app = self.app page.mainFrame().setHtml('') self.app.exec_() self.assertTrue(page._interrupted) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtWebKit/webframe_test.py ================================================ import unittest import sys from PySide.QtCore import QObject, SIGNAL, QUrl from PySide.QtWebKit import * from PySide.QtNetwork import QNetworkRequest from helper import adjust_filename, UsesQApplication class TestWebFrame(UsesQApplication): def load_finished(self, ok): self.assert_(ok) page = self.view.page() self.assert_(page) frame = page.mainFrame() self.assert_(frame) meta = frame.metaData() self.assertEqual(meta['description'], ['PySide Test METADATA.']) self.app.quit() def testMetaData(self): self.view = QWebView() QObject.connect(self.view, SIGNAL('loadFinished(bool)'), self.load_finished) url = QUrl.fromLocalFile(adjust_filename('fox.html', __file__)) self.view.setUrl(url) self.app.exec_() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtWebKit/webpage_test.py ================================================ '''Test cases for QWebPage''' import unittest from PySide.QtCore import QObject, SIGNAL, QUrl from PySide.QtWebKit import QWebPage from PySide.QtNetwork import QNetworkAccessManager from helper import adjust_filename, TimedQApplication #Define a global timeout because TimedQApplication uses a singleton! #Use a value big enough to run all the tests. TIMEOUT = 1000 class TestFindText(TimedQApplication): '''Test cases for finding text''' def setUp(self): TimedQApplication.setUp(self, timeout=TIMEOUT) self.page = QWebPage() QObject.connect(self.page, SIGNAL('loadFinished(bool)'), self.load_finished) self.called = False def tearDown(self): #Release resources del self.page self.called = False TimedQApplication.tearDown(self) def testFindSelectText(self): url = QUrl.fromLocalFile(adjust_filename('fox.html', __file__)) self.page.mainFrame().load(url) self.app.exec_() self.assert_(self.called) def load_finished(self, ok): #Callback to check if load was successful if ok: self.called = True self.assert_(self.page.findText('fox')) self.assertEqual(self.page.selectedText(), 'fox') self.app.quit() class SetNetworkAccessManagerCase(TimedQApplication): def setUp(self): TimedQApplication.setUp(self, timeout=TIMEOUT) def testSetNetworkAccessManager(self): page = QWebPage() manager = QNetworkAccessManager() page.setNetworkAccessManager(manager) def testNetWorkAccessManager(self): page = QWebPage() a = page.networkAccessManager() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtWebKit/webview_test.py ================================================ '''Test cases for QWebView''' import unittest import py3kcompat as py3k import sys from PySide.QtCore import QObject, SIGNAL, QUrl from PySide.QtWebKit import QWebPage, QWebView from PySide.QtNetwork import QNetworkRequest from helper import adjust_filename, TimedQApplication class testWebPage(QWebPage): def sayMyName(self): return 'testWebPage' class TestLoadFinished(TimedQApplication): '''Test case for signal QWebView.loadFinished(bool)''' def setUp(self): #Acquire resources TimedQApplication.setUp(self, timeout=1000) self.view = QWebView() QObject.connect(self.view, SIGNAL('loadFinished(bool)'), self.load_finished) self.called = False def tearDown(self): #Release resources del self.view self.called = False TimedQApplication.tearDown(self) def testLoadFinishedFromFile(self): url = QUrl.fromLocalFile(adjust_filename('fox.html', __file__)) self.view.setUrl(url) self.app.exec_() self.assert_(self.called) def testSetPageAndGetPage(self): twp = testWebPage() self.view.setPage(twp) del twp p = self.view.page() self.assertEqual(p.sayMyName(), 'testWebPage') # Setting the same webpage should not incref the python obj refCount = sys.getrefcount(p) self.view.setPage(p) self.assertEquals(sys.getrefcount(p), refCount) # Changing the webpage obj should decref the old one twp2 = testWebPage() self.view.setPage(twp2) self.assertEquals(sys.getrefcount(p), refCount - 1) def load_finished(self, ok): #Callback to check if load was successful self.app.quit() if ok: self.called = True if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtXml/CMakeLists.txt ================================================ PYSIDE_TEST(qdomdocument_test.py) PYSIDE_TEST(qxmlsimplereader_test.py) ================================================ FILE: tests/QtXml/qdomdocument_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtCore import QByteArray from PySide.QtXml import QDomDocument, QDomElement class QDomDocumentTest(unittest.TestCase): def setUp(self): self.dom = QDomDocument() self.goodXmlData = QByteArray(''' ''') self.badXmlData = QByteArray(''' ''') def tearDown(self): del self.dom del self.goodXmlData del self.badXmlData def testQDomDocumentSetContentWithBadXmlData(self): '''Sets invalid xml as the QDomDocument contents.''' ok, errorStr, errorLine, errorColumn = self.dom.setContent(self.badXmlData, True) self.assertFalse(ok) self.assertEqual(errorStr, 'tag mismatch') self.assertEqual(errorLine, 4) self.assertEqual(errorColumn, 21) def testQDomDocumentSetContentWithGoodXmlData(self): '''Sets valid xml as the QDomDocument contents.''' ok, errorStr, errorLine, errorColumn = self.dom.setContent(self.goodXmlData, True) self.assert_(ok) self.assertEqual(errorStr, '') self.assertEqual(errorLine, 0) self.assertEqual(errorColumn, 0) def testQDomDocumentData(self): '''Checks the QDomDocument elements for the valid xml contents.''' def checkAttribute(element, attribute, value): self.assert_(isinstance(root, QDomElement)) self.assertFalse(element.isNull()) self.assert_(element.hasAttribute(attribute)) self.assertEqual(element.attribute(attribute), value) ok, errorStr, errorLine, errorColumn = self.dom.setContent(self.goodXmlData, True) root = self.dom.documentElement() self.assertEqual(root.tagName(), 'typesystem') checkAttribute(root, 'package', 'PySide.QtXml') child = root.firstChildElement('value-type') checkAttribute(child, 'name', 'QDomDocument') child = child.nextSiblingElement('value-type') checkAttribute(child, 'name', 'QDomElement') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtXml/qxmlsimplereader_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtXml import QXmlSimpleReader class QXmlSimpleReaderTest(unittest.TestCase): def testQXmlSimpleReaderInstatiation(self): '''QXmlSimpleReader must be a concrete class not an abstract one.''' reader = QXmlSimpleReader() def testQXmlSimpleReaderFeatures(self): '''Calls the QXmlSimpleReader.features method. The features checked (at least the first two) can be found in the QXmlSimpleReader documentation: http://qt.nokia.com/doc/4.6/qxmlsimplereader.html#setFeature ''' reader = QXmlSimpleReader() hasFeature, ok = reader.feature('http://xml.org/sax/features/namespaces') self.assertEqual((hasFeature, ok), (True, True)) hasFeature, ok = reader.feature('http://xml.org/sax/features/namespace-prefixes') self.assertEqual((hasFeature, ok), (False, True)) hasFeature, ok = reader.feature('foobar') self.assertEqual((hasFeature, ok), (False, False)) def testQXmlSimpleReaderProperty(self): '''Tries to get a non existent property.''' reader = QXmlSimpleReader() prop, ok = reader.property('foo') self.assertEqual((prop, ok), (None, False)) reader.setProperty('foo', 'Something') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/QtXmlPatterns/CMakeLists.txt ================================================ PYSIDE_TEST(import_test.py) ================================================ FILE: tests/QtXmlPatterns/import_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtCore import * from PySide.QtXmlPatterns import QXmlSchema from helper import UsesQCoreApplication class QXmlPatternsTest(UsesQCoreApplication): def testSchema(self): data = QByteArray(''' ''') buf = QBuffer(data) buf.open(QIODevice.ReadOnly) schema = QXmlSchema() schema.load(buf) self.assert_(schema.isValid()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/mac/CMakeLists.txt ================================================ PYSIDE_TEST(qmacstyle_test.py) ================================================ FILE: tests/mac/qmacstyle_test.py ================================================ from PySide.QtGui import QApplication, QLabel, QMacStyle from PySide.QtCore import QObject import unittest from helper import UsesQApplication class QMacStyleTest(UsesQApplication): def testWidgetStyle(self): w = QLabel('Hello') self.assertTrue(isinstance(w.style(), QMacStyle)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/manually/README.txt ================================================ To run these tests is necessary some manuall input (most of then not supported by QTest[1]), because of that this is not part of automatic test context. [1]http://bugreports.qt.nokia.com/browse/QTBUG-13397 ================================================ FILE: tests/manually/bug_841.py ================================================ import sys from PySide.QtGui import QStandardItem, QStandardItemModel, QMainWindow, QTreeView, QAbstractItemView, QApplication, QMessageBox class Item(QStandardItem): def __init__(self, text): super(Item, self).__init__() self.setText(text) self.setDragEnabled(True) self.setDropEnabled(True) def clone(self): ret = Item(self.text()) return ret class Project(QStandardItemModel): def __init__(self): super(Project, self).__init__() self.setItemPrototype(Item("Prototype")) # add some items so we have stuff to move around self.appendRow(Item("ABC")) self.appendRow(Item("DEF")) self.appendRow(Item("GHI")) class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.model = Project() self.view = QTreeView(self) self.view.setModel(self.model) self.view.setDragEnabled(True) self.view.setDragDropMode(QAbstractItemView.InternalMove) self.setCentralWidget(self.view) def mousePressEvent(self, e): print e.x(), e.y() return QMainWindow.mousePressEvent(self, e) def main(): app = QApplication(sys.argv) w = MainWindow() w.show() QMessageBox.information(None, "Info", "Just drag and drop the items.") sys.exit(app.exec_()) if __name__ == "__main__": main() ================================================ FILE: tests/phonon/CMakeLists.txt ================================================ if (NOT WIN32 OR NOT ${QTVERSION} VERSION_EQUAL 4.7.1) # Any usage of Phonon::createPath will fail on Win32 and Qt 4.7.1. # Check: http://bugreports.qt.nokia.com/browse/QTBUG-13062 PYSIDE_TEST(basic_playing_test.py) endif() PYSIDE_TEST(bug_328.py) PYSIDE_TEST(bug_786.py) PYSIDE_TEST(capabilities_test.py) PYSIDE_TEST(qobjectdescription_test.py) ================================================ FILE: tests/phonon/basic_playing_test.py ================================================ import os import unittest from PySide.phonon import Phonon from helper import UsesQCoreApplication sample_file = os.path.join(os.path.dirname(__file__), 'tone.wav') def checkBackendCapabilities(func): def function(self, *args, **kw): if Phonon.BackendCapabilities.isMimeTypeAvailable('audio/x-wav'): func(self, *args, **kw) else: print('Wav format not supported! Playback test skipped!') return function class TestSimplePlaying(UsesQCoreApplication): def setUp(self): super(TestSimplePlaying, self).setUp() self.app.setApplicationName('Dummy') self.source = Phonon.MediaSource(sample_file) self.media = Phonon.MediaObject() self.media.setCurrentSource(self.source) self.media.finished.connect(self.app.quit) self.called = False # prevent locking with: # request to play a stream, but no valid audio ... self.output = Phonon.AudioOutput() self.path = Phonon.createPath(self.media, self.output) def tearDown(self): super(TestSimplePlaying, self).tearDown() del self.path del self.output del self.media del self.source @checkBackendCapabilities def testFinishedSignal(self): # Should pass if finished() is called self.media.play() self.app.exec_() def testMediaSource(self): self.assertEqual(self.media.currentSource(), self.source) def testPathCreation(self): # FIXME Both functions below are not exported by PyQt4 self.assertEqual(self.path.sink(), self.output) self.assertEqual(self.path.source(), self.media) def state_cb(self, newState, OldState): self.called = True @checkBackendCapabilities def testStateChanged(self): self.media.stateChanged['Phonon::State', 'Phonon::State'].connect(self.state_cb) self.media.play() self.app.exec_() self.assertTrue(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/phonon/bug_328.py ================================================ #!/usr/bin/python from PySide import QtCore, QtGui from PySide.phonon import Phonon import unittest class TestBug(unittest.TestCase): def myCB(self): pass def testForNotifierSignals(self): # this test only check if the signals are present notifier = Phonon.BackendCapabilities.Notifier() notifier.capabilitiesChanged.connect(self.myCB) notifier.availableAudioOutputDevicesChanged.connect(self.myCB) self.assert_(True) ================================================ FILE: tests/phonon/bug_786.py ================================================ import unittest from PySide.QtGui import * from PySide.phonon import * class TestBug786 (unittest.TestCase): def testIt(self): app = QApplication([]) app.setApplicationName("PySide Phonon Unit Test") devices = Phonon.BackendCapabilities.availableAudioOutputDevices() if len(devices) > 1: if devices[0].index() != devices[0].index(): self.assertNotEqual(devices[0], devices[1]) self.assertEqual(devices[0], devices[0]) effects = Phonon.BackendCapabilities.availableAudioEffects() if len(effects) > 1: self.assertNotEqual(effects[0], effects[1]) self.assertEqual(effects[0], effects[0]) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/phonon/capabilities_test.py ================================================ import unittest import py3kcompat as py3k from PySide import phonon from helper import UsesQCoreApplication class CapabilitiesTest(UsesQCoreApplication): def setUp(self): super(CapabilitiesTest, self).setUp() self.app.setApplicationName("Dummy") def tearDown(self): super(CapabilitiesTest, self).tearDown() def testExists(self): self.assertTrue(phonon.Phonon.BackendCapabilities) def testNotifierIdentity(self): # Notifier is a singleton self.assertEqual(phonon.Phonon.BackendCapabilities.notifier(), phonon.Phonon.BackendCapabilities.notifier()) self.assertTrue(phonon.Phonon.BackendCapabilities.notifier() is phonon.Phonon.BackendCapabilities.notifier()) def testDevices(self): # TODO Improve this test devices = phonon.Phonon.BackendCapabilities.availableAudioOutputDevices() for device in devices: self.assertTrue(isinstance(device, phonon.Phonon.AudioOutputDevice)) def testMimeTypes(self): # TODO Improve this test mimeTypes = phonon.Phonon.BackendCapabilities.availableMimeTypes() for mime in mimeTypes: self.assertTrue(isinstance(mime, py3k.unicode)) def testAudioEffects(self): # TODO Improve this test effects = phonon.Phonon.BackendCapabilities.availableAudioEffects() for effect in effects: self.assertTrue(isinstance(effect, phonon.Phonon.EffectDescription)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/phonon/qobjectdescription_test.py ================================================ import unittest from PySide.QtCore import * from PySide import phonon from helper import UsesQCoreApplication class CapabilitiesTest(UsesQCoreApplication): def testFromIndex(self): devices = phonon.Phonon.BackendCapabilities.availableAudioOutputDevices() for device in devices: self.assert_(isinstance(device, phonon.Phonon.AudioOutputDevice)) other = phonon.Phonon.AudioOutputDevice.fromIndex(device.index()) self.assertEqual(device.name(), other.name()) self.assertEqual(device.index(), other.index()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/CMakeLists.txt ================================================ project(pysidetest) project(testbinding) cmake_minimum_required(VERSION 2.6) set(QT_USE_QTCORE 1) include(${QT_USE_FILE}) add_definitions(${QT_DEFINITIONS}) add_definitions(-DQT_SHARED) add_definitions(-DRXX_ALLOCATOR_INIT_0) set(pysidetest_SRC testobject.cpp testview.cpp hiddenobject.cpp ) set(pysidetest_MOC_HEADERS testobject.h testview.h hiddenobject.h ) qt4_wrap_cpp(pysidetest_MOC_SRC ${pysidetest_MOC_HEADERS}) set(testbinding_SRC ${CMAKE_CURRENT_BINARY_DIR}/testbinding/testobject_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/testbinding/intvalue_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/testbinding/pysidecpp_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/testbinding/pysidecpp_testobjectwithnamespace_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/testbinding/pysidecpp2_testobjectwithoutnamespace_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/testbinding/testview_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/testbinding/testbinding_module_wrapper.cpp ) add_custom_command(OUTPUT ${testbinding_SRC} COMMAND ${SHIBOKEN_BINARY} ${GENERATOR_EXTRA_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/pysidetest_global.h --include-paths=${pyside_BINARY_DIR}${PATH_SEP}${CMAKE_CURRENT_SOURCE_DIR}${PATH_SEP}${QT_INCLUDE_DIR}${PATH_SEP}${QT_QTCORE_INCLUDE_DIR}${PATH_SEP}${QT_QTGUI_INCLUDE_DIR} --typesystem-paths=${CMAKE_CURRENT_SOURCE_DIR}${PATH_SEP}${pyside_SOURCE_DIR}${PATH_SEP}${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR} --output-directory=${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/typesystem_pysidetest.xml WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Running generator for test binding..." ) include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${QT_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} ${pyside_SOURCE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore ${QtGui_BINARY_DIR}/PySide/QtGui ${libpyside_SOURCE_DIR} ${SHIBOKEN_PYTHON_INCLUDE_DIR}) add_library(pysidetest SHARED ${pysidetest_SRC} ${pysidetest_MOC_SRC}) target_link_libraries(pysidetest ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY}) add_library(testbinding MODULE ${testbinding_SRC}) set_property(TARGET testbinding PROPERTY PREFIX "") if(WIN32) set_target_properties(testbinding PROPERTIES SUFFIX ".pyd") endif() target_link_libraries(testbinding pysidetest pyside ${PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${SBK_PYTHON_LIBRARIES}) add_dependencies(testbinding pyside QtCore QtGui libpyside pysidetest) PYSIDE_TEST(application_test.py) PYSIDE_TEST(decoratedslot_test.py) PYSIDE_TEST(delegatecreateseditor_test.py) PYSIDE_TEST(enum_test.py) PYSIDE_TEST(homonymoussignalandmethod_test.py) PYSIDE_TEST(list_signal_test.py) PYSIDE_TEST(modelview_test.py) PYSIDE_TEST(qvariant_test.py) PYSIDE_TEST(signalandnamespace_test.py) PYSIDE_TEST(signalwithdefaultvalue_test.py) PYSIDE_TEST(signalemissionfrompython_test.py) PYSIDE_TEST(version_test.py) PYSIDE_TEST(typedef_signal_test.py) PYSIDE_TEST(bug_1016.py) PYSIDE_TEST(utils_test.py) ================================================ FILE: tests/pysidetest/application_test.py ================================================ #!/usr/bin/python import unittest from testbinding import TestObject from PySide.QtGui import QApplication class QApplicationInstance(unittest.TestCase): def appDestroyed(self): sefl.assert_(False) def testInstanceObject(self): TestObject.createApp() app1 = QApplication.instance() app2 = QApplication.instance() app1.setObjectName("MyApp") self.assertEqual(app1, app2) self.assertEqual(app2.objectName(), app1.objectName()) app1.destroyed.connect(self.appDestroyed) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/bug_1016.py ================================================ from testbinding import * import unittest class TestBug1016 (unittest.TestCase): def testIt(self): obj = getHiddenObject() self.assertEqual(obj.callMe(), None) self.assertTrue(obj.wasCalled()) if __name__ == "__main__": unittest.main() ================================================ FILE: tests/pysidetest/decoratedslot_test.py ================================================ #!/usr/bin/python import unittest from PySide.QtCore import QObject from testbinding import TestObject class Receiver(QObject): def __init__(self): QObject.__init__(self) self.called = False def ReceiverDecorator(func): def decoratedFunction(self, *args, **kw): func(self, *args, **kw) return decoratedFunction # This method with the same name of the internal decorated function # is here to test the binding capabilities. def decoratedFunction(self): pass @ReceiverDecorator def slot(self): self.called = True class DecoratedSlotTest(unittest.TestCase): def testCallingOfDecoratedSlot(self): obj = TestObject(0) receiver = Receiver() obj.staticMethodDouble.connect(receiver.slot) obj.emitStaticMethodDoubleSignal() self.assert_(receiver.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/delegatecreateseditor_test.py ================================================ #!/usr/bin/python import unittest from helper import UsesQApplication from testbinding import TestView from PySide.QtCore import Qt from PySide.QtGui import QAbstractItemDelegate, QComboBox id_text = 'This is me' class DelegateDoesntKeepReferenceToEditor(QAbstractItemDelegate): def createEditor(self, parent, option, index): comboBox = QComboBox(parent) comboBox.addItem(id_text) return comboBox class DelegateKeepsReferenceToEditor(QAbstractItemDelegate): def __init__(self, parent=None): QAbstractItemDelegate.__init__(self, parent) self.comboBox = QComboBox() self.comboBox.addItem(id_text) def createEditor(self, parent, option, index): self.comboBox.setParent(parent) return self.comboBox class EditorCreatedByDelegateTest(UsesQApplication): def testDelegateDoesntKeepReferenceToEditor(self): view = TestView(None) delegate = DelegateDoesntKeepReferenceToEditor() view.setItemDelegate(delegate) editor = view.getEditorWidgetFromItemDelegate() self.assertEqual(type(editor), QComboBox) self.assertEqual(editor.count(), 1) self.assertEqual(editor.itemData(0, Qt.DisplayRole), id_text) editor.metaObject() def testDelegateKeepsReferenceToEditor(self): view = TestView(None) delegate = DelegateKeepsReferenceToEditor() view.setItemDelegate(delegate) editor = view.getEditorWidgetFromItemDelegate() self.assertEqual(type(editor), QComboBox) self.assertEqual(editor.count(), 1) self.assertEqual(editor.itemData(0, Qt.DisplayRole), id_text) editor.metaObject() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/enum_test.py ================================================ # -*- coding: utf-8 -*- import unittest from testbinding import Enum1, TestObjectWithoutNamespace class ListConnectionTest(unittest.TestCase): def testEnumVisibility(self): self.assertEqual(Enum1.Option1, 1) self.assertEqual(Enum1.Option2, 2) self.assertEqual(TestObjectWithoutNamespace.Enum2.Option3, 3) self.assertEqual(TestObjectWithoutNamespace.Enum2.Option4, 4) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/hiddenobject.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "hiddenobject.h" void HiddenObject::callMe() { m_called = true; } bool HiddenObject::wasCalled() { return m_called; } QObject* getHiddenObject() { return new HiddenObject(); } ================================================ FILE: tests/pysidetest/hiddenobject.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef HIDDENOBJECT_H #define HIDDENOBJECT_H #ifdef pysidetest_EXPORTS #define PYSIDE_EXPORTS 1 #endif #include "pysidemacros.h" #include // This class shouldn't be exported! class HiddenObject : public QObject { Q_OBJECT public: HiddenObject() : m_called(false) {} Q_INVOKABLE void callMe(); public slots: bool wasCalled(); private: bool m_called; }; // Return a instance of HiddenObject PYSIDE_API QObject* getHiddenObject(); #endif ================================================ FILE: tests/pysidetest/homonymoussignalandmethod_test.py ================================================ #!/usr/bin/python import unittest from testbinding import TestObject '''Tests the behaviour of homonymous signals and slots.''' class HomonymousSignalAndMethodTest(unittest.TestCase): def setUp(self): self.value = 123 self.called = False self.obj = TestObject(self.value) def tearDown(self): del self.value del self.called del self.obj def testIdValueSignalEmission(self): def callback(idValue): self.assertEqual(idValue, self.value) self.obj.idValue.connect(callback) self.obj.emitIdValueSignal() def testStaticMethodDoubleSignalEmission(self): def callback(): self.called = True self.obj.staticMethodDouble.connect(callback) self.obj.emitStaticMethodDoubleSignal() self.assert_(self.called) def testSignalNotCallable(self): self.assertRaises(TypeError, self.obj.justASignal) def testCallingInstanceMethodWithArguments(self): self.assertRaises(TypeError, TestObject.idValue, 1) def testCallingInstanceMethodWithoutArguments(self): self.assertRaises(TypeError, TestObject.idValue) def testHomonymousSignalAndMethod(self): self.assertEqual(self.obj.idValue(), self.value) def testHomonymousSignalAndStaticMethod(self): self.assertEqual(TestObject.staticMethodDouble(3), 6) def testHomonymousSignalAndStaticMethodFromInstance(self): self.assertEqual(self.obj.staticMethodDouble(4), 8) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/list_signal_test.py ================================================ # -*- coding: utf-8 -*- import unittest from testbinding import TestObject from PySide.QtCore import QObject class ListConnectionTest(unittest.TestCase): def childrenChanged(self, children): self._child = children[0] def testConnection(self): o = TestObject(0) c = QObject() c.setObjectName("child") self._child = None o.childrenChanged.connect(self.childrenChanged) o.addChild(c) self.assertEquals(self._child.objectName(), "child") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/modelview_test.py ================================================ #!/usr/bin/python import unittest import py3kcompat as py3k from testbinding import TestView from PySide.QtCore import QAbstractListModel, QObject, QModelIndex '''Tests model/view relationship.''' object_name = 'test object' class MyObject(QObject): pass class ListModelKeepsReference(QAbstractListModel): def __init__(self, parent=None): QAbstractListModel.__init__(self, parent) self.obj = MyObject() self.obj.setObjectName(object_name) def rowCount(self, parent=QModelIndex()): return 1 def data(self, index, role): return self.obj class ListModelDoesntKeepsReference(QAbstractListModel): def rowCount(self, parent=QModelIndex()): return 1 def data(self, index, role): obj = MyObject() obj.setObjectName(object_name) return obj class ListModelThatReturnsString(QAbstractListModel): def rowCount(self, parent=QModelIndex()): return 1 def data(self, index, role): self.obj = 'string' return self.obj class ModelViewTest(unittest.TestCase): def testListModelDoesntKeepsReference(self): model = ListModelDoesntKeepsReference() view = TestView(model) obj = view.getData() self.assertEqual(type(obj), MyObject) self.assertEqual(obj.objectName(), object_name) obj.metaObject() def testListModelKeepsReference(self): model = ListModelKeepsReference() view = TestView(model) obj = view.getData() self.assertEqual(type(obj), MyObject) self.assertEqual(obj.objectName(), object_name) def testListModelThatReturnsString(self): model = ListModelThatReturnsString() view = TestView(model) obj = view.getData() self.assertEqual(type(obj), py3k.unicode) self.assertEqual(obj, 'string') if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/pysidetest_global.h ================================================ // PySide global.h file #include "pyside_global.h" #include "testobject.h" #include "testview.h" #define PYSIDE_API #include "hiddenobject.h" ================================================ FILE: tests/pysidetest/qvariant_test.py ================================================ import unittest from testbinding import TestObject from PySide.QtCore import Qt from PySide.QtGui import QKeySequence from helper import UsesQApplication class QVariantTest(UsesQApplication): def testQKeySequenceQVariantOperator(self): # bug #775 ks = QKeySequence(Qt.SHIFT, Qt.CTRL, Qt.Key_P, Qt.Key_R) self.assertEqual(TestObject.checkType(ks), 76) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/signalandnamespace_test.py ================================================ #!/usr/bin/python import unittest from testbinding import PySideCPP, TestObjectWithoutNamespace class ModelViewTest(unittest.TestCase): def callback(self, o): self._called = o def testWithoutNamespace(self): self._called = None o = PySideCPP.TestObjectWithNamespace(None) o.emitSignal.connect(self.callback) o.emitSignal.emit(o) self.assert_(o == self._called) self._called = None o = PySideCPP.TestObjectWithNamespace(None) o.emitSignal.connect(self.callback) o.callSignal(o) self.assert_(o == self._called) def testWithNamespace(self): self._called = None o = PySideCPP.TestObjectWithNamespace(None) o.emitSignalWithNamespace.connect(self.callback) o.emitSignalWithNamespace.emit(o) self.assert_(o == self._called) self._called = None o = PySideCPP.TestObjectWithNamespace(None) o.emitSignalWithNamespace.connect(self.callback) o.callSignalWithNamespace(o) self.assert_(o == self._called) def testWithoutNamespace1(self): self._called = None o = TestObjectWithoutNamespace(None) o.emitSignal.connect(self.callback) o.emitSignal.emit(o) self.assert_(o == self._called) self._called = None o = TestObjectWithoutNamespace(None) o.emitSignal.connect(self.callback) o.callSignal(o) self.assert_(o == self._called) def testWithNamespace1(self): self._called = None o = TestObjectWithoutNamespace(None) o.emitSignalWithNamespace.connect(self.callback) o.emitSignalWithNamespace.emit(o) self.assert_(o == self._called) self._called = None o = TestObjectWithoutNamespace(None) o.emitSignalWithNamespace.connect(self.callback) o.callSignalWithNamespace(o) self.assert_(o == self._called) def testTypedfWithouNamespace(self): self._called = None o = PySideCPP.TestObjectWithNamespace(None) o.emitSignalWithTypedef.connect(self.callback) o.emitSignalWithTypedef.emit(10) self.assertEqual(10, self._called) self._called = None o = PySideCPP.TestObjectWithNamespace(None) o.emitSignalWithTypedef.connect(self.callback) o.callSignalWithTypedef(10) self.assertEqual(10, self._called) def testTypedefWithNamespace(self): self._called = None o = TestObjectWithoutNamespace(None) o.emitSignalWithTypedef.connect(self.callback) o.emitSignalWithTypedef.emit(10) self.assertEqual(10, self._called) self._called = None o = TestObjectWithoutNamespace(None) o.emitSignalWithTypedef.connect(self.callback) o.callSignalWithTypedef(10) self.assertEqual(10, self._called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/signalemissionfrompython_test.py ================================================ #!/usr/bin/python import unittest from testbinding import TestObject from PySide.QtCore import QObject, SIGNAL '''Tests the behaviour of signals with default values when emitted from Python.''' class SignalEmissionFromPython(unittest.TestCase): def setUp(self): self.obj1 = TestObject(0) self.obj2 = TestObject(0) self.one_called = 0 self.two_called = 0 def tearDown(self): del self.obj1 del self.obj2 del self.one_called del self.two_called def testConnectNewStyleEmitVoidSignal(self): def callbackOne(): self.one_called += 1 self.obj2.signalWithDefaultValue.emit() def callbackTwo(): self.two_called += 1 self.obj1.signalWithDefaultValue.connect(callbackOne) self.obj2.signalWithDefaultValue.connect(callbackTwo) self.obj1.emitSignalWithDefaultValue_void() self.obj2.emitSignalWithDefaultValue_void() self.assertEqual(self.one_called, 1) self.assertEqual(self.two_called, 2) def testConnectOldStyleEmitVoidSignal(self): def callbackOne(): self.one_called += 1 self.obj2.signalWithDefaultValue.emit() def callbackTwo(): self.two_called += 1 QObject.connect(self.obj1, SIGNAL('signalWithDefaultValue()'), callbackOne) QObject.connect(self.obj2, SIGNAL('signalWithDefaultValue()'), callbackTwo) self.obj1.emitSignalWithDefaultValue_void() self.obj2.emitSignalWithDefaultValue_void() self.assertEqual(self.one_called, 1) self.assertEqual(self.two_called, 2) def testConnectNewStyleEmitBoolSignal(self): def callbackOne(): self.one_called += 1 self.obj2.signalWithDefaultValue[bool].emit(True) def callbackTwo(): self.two_called += 1 self.obj1.signalWithDefaultValue.connect(callbackOne) self.obj2.signalWithDefaultValue.connect(callbackTwo) self.obj1.emitSignalWithDefaultValue_void() self.obj2.emitSignalWithDefaultValue_void() self.assertEqual(self.one_called, 1) self.assertEqual(self.two_called, 2) def testConnectOldStyleEmitBoolSignal(self): def callbackOne(): self.one_called += 1 self.obj2.signalWithDefaultValue[bool].emit(True) def callbackTwo(): self.two_called += 1 QObject.connect(self.obj1, SIGNAL('signalWithDefaultValue()'), callbackOne) QObject.connect(self.obj2, SIGNAL('signalWithDefaultValue()'), callbackTwo) self.obj1.emitSignalWithDefaultValue_void() self.obj2.emitSignalWithDefaultValue_void() self.assertEqual(self.one_called, 1) self.assertEqual(self.two_called, 2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/signalwithdefaultvalue_test.py ================================================ #!/usr/bin/python import unittest from testbinding import TestObject from PySide.QtCore import QObject, SIGNAL '''Tests the behaviour of signals with default values.''' class SignalWithDefaultValueTest(unittest.TestCase): def setUp(self): self.obj = TestObject(0) self.void_called = False self.bool_called = False def tearDown(self): del self.obj del self.void_called del self.bool_called def testConnectNewStyleEmitVoidSignal(self): def callbackVoid(): self.void_called = True def callbackBool(value): self.bool_called = True self.obj.signalWithDefaultValue.connect(callbackVoid) self.obj.signalWithDefaultValue[bool].connect(callbackBool) self.obj.emitSignalWithDefaultValue_void() self.assert_(self.void_called) self.assert_(self.bool_called) def testConnectNewStyleEmitBoolSignal(self): def callbackVoid(): self.void_called = True def callbackBool(value): self.bool_called = True self.obj.signalWithDefaultValue.connect(callbackVoid) self.obj.signalWithDefaultValue[bool].connect(callbackBool) self.obj.emitSignalWithDefaultValue_bool() self.assert_(self.void_called) self.assert_(self.bool_called) def testConnectOldStyleEmitVoidSignal(self): def callbackVoid(): self.void_called = True def callbackBool(value): self.bool_called = True QObject.connect(self.obj, SIGNAL('signalWithDefaultValue()'), callbackVoid) QObject.connect(self.obj, SIGNAL('signalWithDefaultValue(bool)'), callbackBool) self.obj.emitSignalWithDefaultValue_void() self.assert_(self.void_called) self.assert_(self.bool_called) def testConnectOldStyleEmitBoolSignal(self): def callbackVoid(): self.void_called = True def callbackBool(value): self.bool_called = True QObject.connect(self.obj, SIGNAL('signalWithDefaultValue()'), callbackVoid) QObject.connect(self.obj, SIGNAL('signalWithDefaultValue(bool)'), callbackBool) self.obj.emitSignalWithDefaultValue_bool() self.assert_(self.void_called) self.assert_(self.bool_called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/symbols.filter ================================================ { local: _ZSt*; _ZNSt*; _ZNSs*; _ZNKSt*; }; ================================================ FILE: tests/pysidetest/testobject.cpp ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "testobject.h" void TestObject::emitIdValueSignal() { emit idValue(m_idValue); } void TestObject::emitStaticMethodDoubleSignal() { emit staticMethodDouble(); } void TestObject::emitSignalWithDefaultValue_void() { emit signalWithDefaultValue(); } void TestObject::emitSignalWithDefaultValue_bool() { emit signalWithDefaultValue(true); } void TestObject::emitSignalWithTypedefValue(int value) { emit signalWithTypedefValue(TypedefValue(value)); } ================================================ FILE: tests/pysidetest/testobject.h ================================================ /* * This file is part of the PySide project. * * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). * * Contact: PySide team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef TESTOBJECT_H #define TESTOBJECT_H #include #include #include #include #ifdef pysidetest_EXPORTS #define PYSIDE_EXPORTS 1 #endif #include "pysidemacros.h" class IntValue { public: IntValue(int val): value(val){}; IntValue() : value(0) {}; int value; }; typedef IntValue TypedefValue; class PYSIDE_API TestObject : public QObject { Q_OBJECT public: static void createApp() { int argc=0; new QApplication(argc, 0); }; static int checkType(const QVariant& var) { return (int)var.type(); } TestObject(int idValue, QObject* parent = 0) : QObject(parent), m_idValue(idValue) {} int idValue() const { return m_idValue; } static int staticMethodDouble(int value) { return value * 2; } void addChild(QObject* c) { m_children.append(c); emit childrenChanged(m_children); } void emitIdValueSignal(); void emitStaticMethodDoubleSignal(); void emitSignalWithDefaultValue_void(); void emitSignalWithDefaultValue_bool(); void emitSignalWithTypedefValue(int value); signals: void idValue(int newValue); void justASignal(); void staticMethodDouble(); void childrenChanged(const QList&); void signalWithDefaultValue(bool value = false); void signalWithTypedefValue(TypedefValue value); private: int m_idValue; QList m_children; }; typedef int PySideInt; namespace PySideCPP { class PYSIDE_API TestObjectWithNamespace : public QObject { Q_OBJECT public: TestObjectWithNamespace(QObject* parent) : QObject(parent) {} QString name() { return "TestObjectWithNamespace"; } void callSignal(TestObjectWithNamespace* obj) { emitSignal(obj); } void callSignalWithNamespace(TestObjectWithNamespace* obj) { emitSignalWithNamespace(obj); } void callSignalWithTypedef(int val) { emitSignalWithTypedef(val); } signals: void emitSignal(TestObjectWithNamespace* obj); void emitSignalWithNamespace(PySideCPP::TestObjectWithNamespace* obj); void emitSignalWithTypedef(PySideInt val); }; } // Namespace PySideCPP namespace PySideCPP2 { enum Enum1 { Option1 = 1, Option2 = 2 }; typedef long PySideLong; class PYSIDE_API TestObjectWithoutNamespace : public QObject { Q_OBJECT public: enum Enum2 { Option3 = 3, Option4 = 4}; TestObjectWithoutNamespace(QObject* parent) : QObject(parent) {} QString name() { return "TestObjectWithoutNamespace"; } void callSignal(TestObjectWithoutNamespace* obj) { emitSignal(obj); } void callSignalWithNamespace(TestObjectWithoutNamespace* obj) { emitSignalWithNamespace(obj); } void callSignalWithTypedef(long val) { emitSignalWithTypedef(val); } signals: void emitSignal(TestObjectWithoutNamespace* obj); void emitSignalWithNamespace(PySideCPP2::TestObjectWithoutNamespace* obj); void emitSignalWithTypedef(PySideLong val); }; } // Namespace PySideCPP2 #endif // TESTOBJECT_H ================================================ FILE: tests/pysidetest/testview.cpp ================================================ #include "testview.h" #include #include #include #include QVariant TestView::getData() { QModelIndex index; return m_model->data(index); } QWidget* TestView::getEditorWidgetFromItemDelegate() const { if (!m_delegate) return 0; QModelIndex index; QStyleOptionViewItem options; return m_delegate->createEditor(0, options, index); } ================================================ FILE: tests/pysidetest/testview.h ================================================ #ifndef TESTVIEW_H #define TESTVIEW_H #include #ifdef pysidetest_EXPORTS #define PYSIDE_EXPORTS 1 #endif #include "pysidemacros.h" class QWidget; class QAbstractListModel; class QAbstractItemDelegate; class PYSIDE_API TestView : public QObject { Q_OBJECT public: TestView(QAbstractListModel* model, QObject* parent = 0) : QObject(parent), m_model(model) {} QAbstractListModel* model() { return m_model; } QVariant getData(); void setItemDelegate(QAbstractItemDelegate* delegate) { m_delegate = delegate; } QWidget* getEditorWidgetFromItemDelegate() const; private: QAbstractListModel* m_model; QAbstractItemDelegate* m_delegate; }; #endif // TESTVIEW_H ================================================ FILE: tests/pysidetest/typedef_signal_test.py ================================================ import unittest from PySide.QtCore import QObject from testbinding import TestObject class Receiver(QObject): def __init__(self): QObject.__init__(self) self.received = None def slot(self, value): self.received = value class TypedefSignal(unittest.TestCase): def testTypedef(self): obj = TestObject(0) receiver = Receiver() obj.signalWithTypedefValue.connect(receiver.slot) obj.emitSignalWithTypedefValue(2) self.assertEqual(receiver.received.value, 2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/typesystem_pysidetest.xml ================================================ return %CONVERTTOPYTHON[IntValue](%in); IntValue value = %CONVERTTOCPP[IntValue](%in); %out = %OUTTYPE(value); Shiboken::Conversions::registerConverterName(Shiboken::Conversions::PrimitiveTypeConverter<long>(), "PySideLong"); Shiboken::Conversions::registerConverterName(Shiboken::Conversions::PrimitiveTypeConverter<long>(), "PySideCPP2::PySideLong"); qRegisterMetaType<PySideInt>("PySideInt"); qRegisterMetaType<PySideCPP2::PySideLong>("PySideLong"); ================================================ FILE: tests/pysidetest/utils_test.py ================================================ # This file is part of PySide: Python for Qt # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # # Contact: PySide team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public License # version 2 as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA import unittest import sys import os if sys.platform == 'win32': from PySide._utils import _get_win32_case_sensitive_name class Win32UtilsTest(unittest.TestCase): def testWin32CaseSensitiveName(self): from tempfile import mkdtemp caseSensitiveName = 'CaseSensitiveName' tmpdir = mkdtemp(caseSensitiveName) try: path = _get_win32_case_sensitive_name(tmpdir.lower()) self.assertTrue(path.endswith(caseSensitiveName)) finally: if os.path.exists(tmpdir): os.rmdir(tmpdir) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/pysidetest/version_test.py ================================================ #!/usr/bin/python import unittest from PySide import __version_info__, __version__, QtCore class CheckForVariablesTest(unittest.TestCase): def testVesions(self): self.assert_(__version_info__ >= (1, 0, 0)) self.assert_(__version_info__ < (99, 99, 99)) self.assert_(__version__) self.assert_(QtCore.__version_info__ >= (4, 5, 0)) self.assert_(QtCore.__version__) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/run_test.sh ================================================ #!/bin/sh # This is a nasty workaround of a CTest limitation # of setting the environment variables for the test. # $1: LD_LIBRARY_PATH # $2: $PYTHONPATH # $3: python executable # $4: test file export LD_LIBRARY_PATH=$1:$LD_LIBRARY_PATH export PYTHONPATH=$2:$PYTHONPATH $3 $4 ================================================ FILE: tests/signals/CMakeLists.txt ================================================ PYSIDE_TEST(args_dont_match_test.py) PYSIDE_TEST(bug_311.py) PYSIDE_TEST(bug_312.py) PYSIDE_TEST(bug_319.py) PYSIDE_TEST(decorators_test.py) PYSIDE_TEST(disconnect_test.py) PYSIDE_TEST(invalid_callback_test.py) PYSIDE_TEST(lambda_gui_test.py) PYSIDE_TEST(lambda_test.py) PYSIDE_TEST(leaking_signal_test.py) PYSIDE_TEST(multiple_connections_gui_test.py) PYSIDE_TEST(multiple_connections_test.py) PYSIDE_TEST(pysignal_test.py) PYSIDE_TEST(qobject_destroyed_test.py) PYSIDE_TEST(qobject_receivers_test.py) PYSIDE_TEST(qobject_sender_test.py) PYSIDE_TEST(ref01_test.py) PYSIDE_TEST(ref02_test.py) PYSIDE_TEST(ref03_test.py) PYSIDE_TEST(ref04_test.py) PYSIDE_TEST(ref05_test.py) PYSIDE_TEST(ref06_test.py) PYSIDE_TEST(segfault_proxyparent_test.py) PYSIDE_TEST(self_connect_test.py) PYSIDE_TEST(short_circuit_test.py) PYSIDE_TEST(signal2signal_connect_test.py) PYSIDE_TEST(signal_autoconnect_test.py) PYSIDE_TEST(signal_connectiontype_support_test.py) PYSIDE_TEST(signal_emission_gui_test.py) PYSIDE_TEST(signal_emission_test.py) PYSIDE_TEST(signal_func_test.py) PYSIDE_TEST(signal_manager_refcount_test.py) PYSIDE_TEST(signal_number_limit_test.py) PYSIDE_TEST(signal_object_test.py) PYSIDE_TEST(signal_signature_test.py) PYSIDE_TEST(signal_with_primitive_type_test.py) PYSIDE_TEST(slot_reference_count_test.py) PYSIDE_TEST(static_metaobject_test.py) ================================================ FILE: tests/signals/args_dont_match_test.py ================================================ #!/usr/bin/env python import unittest from PySide.QtCore import * class ArgsDontMatch(unittest.TestCase): def callback(self, arg1): self.ok = True def testConnectSignalToSlotWithLessArgs(self): self.ok = False obj1 = QObject() QObject.connect(obj1, SIGNAL('the_signal(int, int, int)'), self.callback) obj1.emit(SIGNAL('the_signal(int, int, int)'), 1, 2, 3) self.assert_(self.ok) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/bug_311.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from PySide import QtCore from helper import UsesQCoreApplication class DerivedDate(QtCore.QDate): def __init__(self,y,m,d): super(DerivedDate,self).__init__(y,m,d) class Emitter(QtCore.QObject): dateSignal1 = QtCore.Signal(QtCore.QDate) dateSignal2 = QtCore.Signal(DerivedDate) tupleSignal = QtCore.Signal(tuple) class SignaltoSignalTest(UsesQCoreApplication): def myCb(self, dt): self._dt = dt def testBug(self): e = Emitter() d = DerivedDate(2010,8,24) self._dt = None e.dateSignal1.connect(self.myCb) e.dateSignal1.emit(d) self.assertEqual(self._dt, d) self._dt = None e.dateSignal2.connect(self.myCb) e.dateSignal2.emit(d) self.assertEqual(self._dt, d) myTuple = (5, 6, 7) self._dt = None e.tupleSignal.connect(self.myCb) e.tupleSignal.emit(myTuple) self.assertEqual(myTuple, self._dt) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/bug_312.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest import sys from PySide.QtCore import QObject, SIGNAL MAX_LOOPS = 5 MAX_OBJECTS = 200 class Dummy(object): def __init__(self, parent): self._parent = parent def callback(self): self._called = True class MultipleSlots(unittest.TestCase): def myCB(self): self._count += 1 """ def testUnboundSignal(self): o = QObject() self._count = 0 for i in range(MAX_OBJECTS): QObject.connect(o, SIGNAL("fire()"), lambda: self.myCB()) o.emit(SIGNAL("fire()")) self.assertEqual(self._count, MAX_OBJECTS) """ def testDisconnectCleanup(self): for c in range(MAX_LOOPS): self._count = 0 self._senders = [] for i in range(MAX_OBJECTS): o = QObject() QObject.connect(o, SIGNAL("fire()"), lambda: self.myCB()) self._senders.append(o) o.emit(SIGNAL("fire()")) self.assertEqual(self._count, MAX_OBJECTS) #delete all senders will disconnect the signals self._senders = [] if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/bug_319.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from PySide import QtCore from helper import UsesQCoreApplication class Listener(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self, None) self._phrase = [] @QtCore.Slot(tuple) def listen(self, words): for w in words: self._phrase.append(w) class Communicate(QtCore.QObject): # create a new signal on the fly and name it 'speak' speak = QtCore.Signal(tuple) class SignaltoSignalTest(UsesQCoreApplication): def testBug(self): someone = Communicate() someone2 = Listener() # connect signal and slot someone.speak.connect(someone2.listen) # emit 'speak' signal talk = ("one","two","three") someone.speak.emit(talk) self.assertEqual(someone2._phrase, list(talk)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/decorators_test.py ================================================ #!/usr/bin/env python import unittest from PySide.QtCore import QObject, Slot, SIGNAL, SLOT class MyObject(QObject): def __init__(self, parent=None): QObject.__init__(self, parent) self._slotCalledCount = 0 @Slot() def mySlot(self): self._slotCalledCount = self._slotCalledCount + 1 @Slot(int) @Slot('QString') def mySlot2(self, arg0): self._slotCalledCount = self._slotCalledCount + 1 @Slot(name='mySlot3') def foo(self): self._slotCalledCount = self._slotCalledCount + 1 @Slot(str, int) def mySlot4(self, a, b): self._slotCalledCount = self._slotCalledCount + 1 @Slot(result=int) def mySlot5(self): self._slotCalledCount = self._slotCalledCount + 1 @Slot(result=QObject) def mySlot6(self): self._slotCalledCount = self._slotCalledCount + 1 class StaticMetaObjectTest(unittest.TestCase): def testSignalPropagation(self): o = MyObject() m = o.metaObject() self.assertTrue(m.indexOfSlot('mySlot()') > 0) self.assertTrue(m.indexOfSlot('mySlot2(int)') > 0) self.assertTrue(m.indexOfSlot('mySlot2(QString)') > 0) self.assertTrue(m.indexOfSlot('mySlot3()') > 0) self.assertTrue(m.indexOfSlot('mySlot4(QString,int)') > 0) def testEmission(self): o = MyObject() o.connect(SIGNAL("mySignal()"), o, SLOT("mySlot()")) o.emit(SIGNAL("mySignal()")) self.assertTrue(o._slotCalledCount == 1) def testResult(self): o = MyObject() mo = o.metaObject() i = mo.indexOfSlot('mySlot5()') m = mo.method(i) self.assertEqual(m.typeName(), "int") def testResultObject(self): o = MyObject() mo = o.metaObject() i = mo.indexOfSlot('mySlot6()') m = mo.method(i) self.assertEqual(m.typeName(), "QObject*") class SlotWithoutArgs(unittest.TestCase): def testError(self): # It should be an error to call the slot without the # arguments, as just @Slot would end up in a slot # accepting argument functions self.assertRaises(TypeError, Slot, lambda: 3) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/disconnect_test.py ================================================ import unittest from PySide.QtCore import * from testbinding import TestObject class Foo(QObject): bar = Signal() class TestDisconnect(unittest.TestCase): def theSlot1(self): self.called1 = True def theSlot2(self): self.called2 = True def testIt(self): self.called1 = False self.called2 = False f = Foo() f.bar.connect(self.theSlot1) f.bar.connect(self.theSlot2) f.bar.emit() self.assertTrue(self.called1) self.assertTrue(self.called2) self.called1 = False self.called2 = False f.bar.disconnect() f.bar.emit() self.assertFalse(self.called1) self.assertFalse(self.called2) def testDuringCallback(self): """ Test to see if the C++ object for a connection is accessed after the method returns. This causes a segfault if the memory that was used by the C++ object has been reused. """ self.called = False obj = TestObject(0) def callback(): obj.signalWithDefaultValue.disconnect(callback) # Connect more callbacks to try to overwrite memory for i in range(1000): obj.signalWithDefaultValue.connect(lambda: None) self.called = True # A non-None return value is needed return True obj.signalWithDefaultValue.connect(callback) obj.signalWithDefaultValue.emit() self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/invalid_callback_test.py ================================================ '''Test cases for passing invalid callbacks to QObject.connect''' import unittest from PySide.QtCore import QObject, SIGNAL class InvalidCallback(unittest.TestCase): '''Test case for passing an invalid callback to QObject.connect''' def setUp(self): #Acquire resources self.obj = QObject() def tearDown(self): #Release resources try: del self.obj except AttributeError: pass def testIntegerCb(self): #Test passing an int as callback to QObject.connect self.assertRaises(TypeError, QObject.connect, self.obj, SIGNAL('destroyed()'), 42) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/lambda_gui_test.py ================================================ '''Connecting lambda to gui signals''' import unittest from PySide.QtCore import QObject, SIGNAL try: from PySide.QtGui import QSpinBox, QPushButton hasQtGui = True except ImportError: hasQtGui = False from helper import UsesQApplication if hasQtGui: class Control: def __init__(self): self.arg = False class QtGuiSigLambda(UsesQApplication): def testButton(self): #Connecting a lambda to a QPushButton.clicked() obj = QPushButton('label') ctr = Control() func = lambda: setattr(ctr, 'arg', True) QObject.connect(obj, SIGNAL('clicked()'), func) obj.click() self.assert_(ctr.arg) QObject.disconnect(obj, SIGNAL('clicked()'), func) def testSpinButton(self): #Connecting a lambda to a QPushButton.clicked() obj = QSpinBox() ctr = Control() arg = 444 func = lambda x: setattr(ctr, 'arg', 444) QObject.connect(obj, SIGNAL('valueChanged(int)'), func) obj.setValue(444) self.assertEqual(ctr.arg, arg) QObject.disconnect(obj, SIGNAL('valueChanged(int)'), func) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/lambda_test.py ================================================ #!/usr/bin/env python '''Connecting lambda to signals''' import sys import unittest from PySide.QtCore import QObject, SIGNAL, QProcess from helper import UsesQCoreApplication class Dummy(QObject): def __init__(self, *args): super(Dummy, self).__init__(*args) class BasicCase(unittest.TestCase): def testSimplePythonSignalNoArgs(self): #Connecting a lambda to a simple python signal without arguments obj = Dummy() QObject.connect(obj, SIGNAL('foo()'), lambda: setattr(obj, 'called', True)) obj.emit(SIGNAL('foo()')) self.assert_(obj.called) def testSimplePythonSignal(self): #Connecting a lambda to a simple python signal witharguments obj = Dummy() arg = 42 QObject.connect(obj, SIGNAL('foo(int)'), lambda x: setattr(obj, 'arg', 42)) obj.emit(SIGNAL('foo(int)'), arg) self.assertEqual(obj.arg, arg) class QtSigLambda(UsesQCoreApplication): qapplication = True def testNoArgs(self): '''Connecting a lambda to a signal without arguments''' proc = QProcess() dummy = Dummy() QObject.connect(proc, SIGNAL('started()'), lambda: setattr(dummy, 'called', True)) proc.start(sys.executable, ['-c', '""']) proc.waitForFinished() self.assert_(dummy.called) def testWithArgs(self): '''Connecting a lambda to a signal with arguments''' proc = QProcess() dummy = Dummy() QObject.connect(proc, SIGNAL('finished(int)'), lambda x: setattr(dummy, 'called', x)) proc.start(sys.executable, ['-c', '""']) proc.waitForFinished() self.assertEqual(dummy.called, proc.exitCode()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/leaking_signal_test.py ================================================ import unittest from PySide import QtCore import weakref class LeakingSignal(unittest.TestCase): def testLeakingSignal(self): # Was segfaulting when the signal was garbage collected. class Emitter(QtCore.QObject): my_signal = QtCore.Signal(object) emitter = Emitter() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/multiple_connections_gui_test.py ================================================ import unittest import random from functools import partial from PySide.QtCore import QObject, SIGNAL try: from PySide.QtGui import QPushButton, QSpinBox hasQtGui = True except ImportError: hasQtGui = False from helper import BasicPySlotCase, UsesQApplication class MultipleSignalConnections(unittest.TestCase): '''Base class for multiple signal connection testing''' def run_many(self, sender, signal, emitter, receivers, args=None): """Utility method to connect a list of receivers to a signal. sender - QObject that will emit the signal signal - string with the signal signature emitter - the callable that will trigger the signal receivers - list of BasicPySlotCase instances args - tuple with the arguments to be sent. """ if args is None: args = tuple() for rec in receivers: rec.setUp() QObject.connect(sender, SIGNAL(signal), rec.cb) rec.args = tuple(args) emitter(*args) for rec in receivers: self.assert_(rec.called) if hasQtGui: class QtGuiMultipleSlots(UsesQApplication, MultipleSignalConnections): '''Multiple connections to QtGui signals''' def testButtonClick(self): """Multiple connections to QPushButton.clicked()""" sender = QPushButton('button') receivers = [BasicPySlotCase() for x in range(30)] self.run_many(sender, 'clicked()', sender.click, receivers) def testSpinBoxValueChanged(self): """Multiple connections to QSpinBox.valueChanged(int)""" sender = QSpinBox() #FIXME if number of receivers if higher than 50, segfaults receivers = [BasicPySlotCase() for x in range(10)] self.run_many(sender, 'valueChanged(int)', sender.setValue, receivers, (1,)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/multiple_connections_test.py ================================================ import sys import unittest from functools import partial from PySide.QtCore import QObject, SIGNAL, QProcess from helper import BasicPySlotCase, UsesQCoreApplication class MultipleSignalConnections(unittest.TestCase): '''Base class for multiple signal connection testing''' def run_many(self, sender, signal, emitter, receivers, args=None): """Utility method to connect a list of receivers to a signal. sender - QObject that will emit the signal signal - string with the signal signature emitter - the callable that will trigger the signal receivers - list of BasicPySlotCase instances args - tuple with the arguments to be sent. """ if args is None: args = tuple() for rec in receivers: rec.setUp() self.assert_(QObject.connect(sender, SIGNAL(signal), rec.cb)) rec.args = tuple(args) emitter(*args) for rec in receivers: self.assert_(rec.called) class PythonMultipleSlots(UsesQCoreApplication, MultipleSignalConnections): '''Multiple connections to python signals''' def testPythonSignal(self): """Multiple connections to a python signal (short-circuit)""" class Dummy(QObject): pass sender = Dummy() receivers = [BasicPySlotCase() for x in range(10)] self.run_many(sender, 'foobar', partial(sender.emit,SIGNAL('foobar')), receivers, (0, )) class QProcessMultipleSlots(UsesQCoreApplication, MultipleSignalConnections): '''Multiple connections to QProcess signals''' def testQProcessStarted(self): '''Multiple connections to QProcess.started()''' sender = QProcess() receivers = [BasicPySlotCase() for x in range(10)] def start_proc(*args): sender.start(sys.executable, ['-c', '""']) sender.waitForFinished() self.run_many(sender, 'started()', start_proc, receivers) def testQProcessFinished(self): '''Multiple connections to QProcess.finished(int)''' sender = QProcess() receivers = [BasicPySlotCase() for x in range(10)] def start_proc(*args): sender.start(sys.executable, ['-c', '""']) sender.waitForFinished() self.run_many(sender, 'finished(int)', start_proc, receivers, (0,)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/pysignal_test.py ================================================ import unittest from PySide.QtCore import QObject, SIGNAL, SLOT, Qt try: from PySide.QtGui import QSpinBox, QApplication, QWidget hasQtGui = True except ImportError: hasQtGui = False from helper import UsesQApplication class Dummy(QObject): """Dummy class used in this test.""" def __init__(self, parent=None): QObject.__init__(self, parent) def callDummy(self): self.emit(SIGNAL("dummy(PyObject)"), "PyObject") def callDummy2(self): lst = [] lst.append("item1") lst.append("item2") lst.append("item3") self.emit(SIGNAL("dummy2(PyObject, PyObject)"), "PyObject0", lst) class PyObjectType(UsesQApplication): def mySlot(self, arg): self.assertEqual(arg, "PyObject") self.called = True self.callCount += 1 def mySlot2(self, arg0, arg1): self.assertEqual(arg0, "PyObject0") self.assertEqual(arg1[0], "item1") self.assertEqual(arg1[1], "item2") self.assertEqual(arg1[2], "item3") self.callCount += 1 if self.running: self.app.quit() def setUp(self): super(PyObjectType, self).setUp() self.callCount = 0 self.running = False def testWithOneArg(self): o = Dummy() o.connect(SIGNAL("dummy(PyObject)"), self.mySlot) o.callDummy() self.assertEqual(self.callCount, 1) def testWithTwoArg(self): o = Dummy() o.connect(SIGNAL("dummy2(PyObject,PyObject)"), self.mySlot2) o.callDummy2() self.assertEqual(self.callCount, 1) def testAsyncSignal(self): self.called = False self.running = True o = Dummy() o.connect(SIGNAL("dummy2(PyObject,PyObject)"), self.mySlot2, Qt.QueuedConnection) o.callDummy2() self.app.exec_() self.assertEqual(self.callCount, 1) def testTwice(self): self.called = False self.running = True o = Dummy() o.connect(SIGNAL("dummy2(PyObject,PyObject)"), self.mySlot2, Qt.QueuedConnection) o.callDummy2() o.callDummy2() self.app.exec_() self.assertEqual(self.callCount, 2) class PythonSigSlot(unittest.TestCase): def setUp(self): self.called = False def tearDown(self): try: del self.args except: pass def callback(self, *args): if tuple(self.args) == args: self.called = True def testNoArgs(self): """Python signal and slots without arguments""" obj1 = Dummy() QObject.connect(obj1, SIGNAL('foo()'), self.callback) self.args = tuple() obj1.emit(SIGNAL('foo()'), *self.args) self.assert_(self.called) def testWithArgs(self): """Python signal and slots with integer arguments""" obj1 = Dummy() QObject.connect(obj1, SIGNAL('foo(int)'), self.callback) self.args = (42,) obj1.emit(SIGNAL('foo(int)'), *self.args) self.assert_(self.called) def testDisconnect(self): obj1 = Dummy() QObject.connect(obj1, SIGNAL('foo(int)'), self.callback) QObject.disconnect(obj1, SIGNAL('foo(int)'), self.callback) self.args = (42, ) obj1.emit(SIGNAL('foo(int)'), *self.args) self.assert_(not self.called) if hasQtGui: class SpinBoxPySignal(UsesQApplication): """Tests the connection of python signals to QSpinBox qt slots.""" def setUp(self): super(SpinBoxPySignal, self).setUp() self.obj = Dummy() self.spin = QSpinBox() self.spin.setValue(0) def tearDown(self): super(SpinBoxPySignal, self).tearDown() del self.obj del self.spin def testValueChanged(self): """Emission of a python signal to QSpinBox setValue(int)""" QObject.connect(self.obj, SIGNAL('dummy(int)'), self.spin, SLOT('setValue(int)')) self.assertEqual(self.spin.value(), 0) self.obj.emit(SIGNAL('dummy(int)'), 4) self.assertEqual(self.spin.value(), 4) def testValueChangedMultiple(self): """Multiple emissions of a python signal to QSpinBox setValue(int)""" QObject.connect(self.obj, SIGNAL('dummy(int)'), self.spin, SLOT('setValue(int)')) self.assertEqual(self.spin.value(), 0) self.obj.emit(SIGNAL('dummy(int)'), 4) self.assertEqual(self.spin.value(), 4) self.obj.emit(SIGNAL('dummy(int)'), 77) self.assertEqual(self.spin.value(), 77) if hasQtGui: class WidgetPySignal(UsesQApplication): """Tests the connection of python signals to QWidget qt slots.""" def setUp(self): super(WidgetPySignal, self).setUp() self.obj = Dummy() self.widget = QWidget() def tearDown(self): super(WidgetPySignal, self).tearDown() del self.obj del self.widget def testShow(self): """Emission of a python signal to QWidget slot show()""" self.widget.hide() QObject.connect(self.obj, SIGNAL('dummy()'), self.widget, SLOT('show()')) self.assert_(not self.widget.isVisible()) self.obj.emit(SIGNAL('dummy()')) self.assert_(self.widget.isVisible()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/qobject_destroyed_test.py ================================================ import unittest from PySide.QtCore import QObject, SIGNAL class QObjectDestroyed(unittest.TestCase): """Very simple test case for the destroyed() signal of QObject""" def setUp(self): self.called = False def destroyed_cb(self): self.called = True def testDestroyed(self): """Emission of QObject.destroyed() to a python slot""" obj = QObject() QObject.connect(obj, SIGNAL('destroyed()'), self.destroyed_cb) del obj self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/qobject_receivers_test.py ================================================ # -*- coding: utf-8 -*- ''' Test case for QObject.receivers()''' import unittest from PySide.QtCore import * def cute_slot(): pass class TestQObjectReceivers(unittest.TestCase): '''Test case for QObject::receivers''' def testBasic(self): sender = QObject() receiver1 = QObject() receiver2 = QObject() self.assertEqual(sender.receivers(SIGNAL("")), 0) sender.connect(sender, SIGNAL("destroyed()"), receiver1, SLOT("deleteLater()")) self.assertEqual(sender.receivers(SIGNAL("destroyed()")), 1) sender.connect(sender, SIGNAL("destroyed()"), receiver2, SLOT("deleteLater()")) self.assertEqual(sender.receivers(SIGNAL("destroyed()")), 2) sender.disconnect(sender, SIGNAL("destroyed()"), receiver2, SLOT("deleteLater()")) self.assertEqual(sender.receivers(SIGNAL("destroyed()")), 1) del receiver2 del receiver1 del sender def testPySlots(self): sender = QObject() receiver = QObject() sender.connect(sender, SIGNAL("destroyed()"), cute_slot) self.assertEqual(sender.receivers(SIGNAL("destroyed( )")), 1) sender.connect(sender, SIGNAL("destroyed()"), receiver, SLOT("deleteLater()")) self.assertEqual(sender.receivers(SIGNAL("destroyed()")), 2) del sender del receiver def testPySignals(self): sender = QObject() receiver = QObject() sender.connect(sender, SIGNAL("some_dynamic_signal()"), cute_slot) self.assertEqual(sender.receivers(SIGNAL("some_dynamic_signal( )")), 1) sender.connect(sender, SIGNAL("some_dynamic_signal()"), receiver, SLOT("deleteLater()")) self.assertEqual(sender.receivers(SIGNAL("some_dynamic_signal( )")), 2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/qobject_sender_test.py ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- '''Test cases for QObject.sender()''' import unittest from PySide.QtCore import * from helper import UsesQCoreApplication class ExtQTimer(QTimer): def __init__(self): QTimer.__init__(self) class Receiver(QObject): def __init__(self): QObject.__init__(self) self.the_sender = None def callback(self): self.the_sender = self.sender() if QCoreApplication.instance(): QCoreApplication.instance().exit() class ObjectSenderTest(unittest.TestCase): '''Test case for QObject.sender() method.''' def testSenderPythonSignal(self): sender = QObject() recv = Receiver() QObject.connect(sender, SIGNAL('foo()'), recv.callback) sender.emit(SIGNAL('foo()')) self.assertEquals(sender, recv.the_sender) class ObjectSenderCheckOnReceiverTest(unittest.TestCase): '''Test case for QObject.sender() method, this one tests the equality on the Receiver object.''' def testSenderPythonSignal(self): sender = QObject() recv = Receiver() QObject.connect(sender, SIGNAL('foo()'), recv.callback) sender.emit(SIGNAL('foo()')) self.assertEquals(sender, recv.the_sender) class ObjectSenderWithQAppTest(UsesQCoreApplication): '''Test case for QObject.sender() method with QApplication.''' def testSenderCppSignal(self): sender = QTimer() sender.setObjectName('foo') recv = Receiver() QObject.connect(sender, SIGNAL('timeout()'), recv.callback) sender.start(10) self.app.exec_() self.assertEquals(sender, recv.the_sender) def testSenderCppSignalSingleShotTimer(self): recv = Receiver() QTimer.singleShot(10, recv.callback) self.app.exec_() self.assertTrue(isinstance(recv.the_sender, QObject)) def testSenderCppSignalWithPythonExtendedClass(self): sender = ExtQTimer() recv = Receiver() QObject.connect(sender, SIGNAL('timeout()'), recv.callback) sender.start(10) self.app.exec_() self.assertEquals(sender, recv.the_sender) class ObjectSenderWithQAppCheckOnReceiverTest(UsesQCoreApplication): '''Test case for QObject.sender() method with QApplication.''' def testSenderCppSignal(self): sender = QTimer() sender.setObjectName('foo') recv = Receiver() QObject.connect(sender, SIGNAL('timeout()'), recv.callback) sender.start(10) self.app.exec_() self.assertEquals(sender, recv.the_sender) def testSenderCppSignalWithPythonExtendedClass(self): sender = ExtQTimer() recv = Receiver() QObject.connect(sender, SIGNAL('timeout()'), recv.callback) sender.start(10) self.app.exec_() self.assertEquals(sender, recv.the_sender) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/ref01_test.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from PySide.QtCore import QObject, Signal class BoundAndUnboundSignalsTest(unittest.TestCase): def setUp(self): self.methods = set(('connect', 'disconnect', 'emit')) def tearDown(self): del self.methods def testUnboundSignal(self): self.assertEqual(type(QObject.destroyed), Signal) self.assertFalse(self.methods.issubset(dir(QObject.destroyed))) def testBoundSignal(self): obj = QObject() self.assertNotEqual(type(obj.destroyed), Signal) self.assert_(self.methods.issubset(dir(obj.destroyed))) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/ref02_test.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from PySide.QtCore import QCoreApplication, QTimeLine from helper import UsesQCoreApplication class NativeSignalsTest(UsesQCoreApplication): def setUp(self): UsesQCoreApplication.setUp(self) self.called = False self.timeline = QTimeLine(100) def tearDown(self): del self.called del self.timeline UsesQCoreApplication.tearDown(self) def testSignalWithIntArgument(self): def valueChangedSlot(value): self.called = True self.assertEqual(type(value), float) self.app.quit() self.timeline.valueChanged.connect(valueChangedSlot) self.timeline.start() self.app.exec_() self.assert_(self.called) def testSignalWithoutArguments(self): def finishedSlot(): self.called = True self.app.quit() self.timeline.finished.connect(finishedSlot) self.timeline.start() self.app.exec_() self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/ref03_test.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from sys import getrefcount from PySide.QtCore import QObject class DisconnectSignalsTest(unittest.TestCase): def setUp(self): self.emitter = QObject() def tearDown(self): del self.emitter def testConnectionRefCount(self): def destroyedSlot(): pass self.assertEqual(getrefcount(destroyedSlot), 2) self.emitter.destroyed.connect(destroyedSlot) self.assertEqual(getrefcount(destroyedSlot), 3) self.emitter.destroyed.disconnect(destroyedSlot) self.assertEqual(getrefcount(destroyedSlot), 2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/ref04_test.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from PySide.QtCore import QObject, Signal class ExtQObject(QObject): mySignal = Signal() def __init__(self): QObject.__init__(self) class UserSignalTest(unittest.TestCase): def setUp(self): self.emitter = ExtQObject() self.counter = 0 def tearDown(self): del self.emitter del self.counter def testConnectEmitDisconnect(self): def slot(): self.counter += 1 self.emitter.mySignal.connect(slot) self.assertEqual(self.counter, 0) self.emitter.mySignal.emit() self.assertEqual(self.counter, 1) self.emitter.mySignal.emit() self.assertEqual(self.counter, 2) self.emitter.mySignal.disconnect(slot) self.emitter.mySignal.emit() self.assertEqual(self.counter, 2) # def testConnectWithConfigureMethod(self): # # def slot(): # self.counter += 1 # # self.emitter.pyqtConfigure(mySignal=slot) # self.assertEqual(self.counter, 0) # self.emitter.mySignal.emit() # self.assertEqual(self.counter, 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/ref05_test.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from PySide.QtCore import QObject, QCoreApplication, QTimeLine, Slot from helper import UsesQCoreApplication class ExtQObject(QObject): def __init__(self): QObject.__init__(self) self.counter = 0 @Slot('qreal') def foo(self, value): self.counter += 1 class UserSlotTest(UsesQCoreApplication): def setUp(self): UsesQCoreApplication.setUp(self) self.receiver = ExtQObject() self.timeline = QTimeLine(100) def tearDown(self): del self.timeline del self.receiver UsesQCoreApplication.tearDown(self) def testUserSlot(self): self.timeline.setUpdateInterval(10) self.timeline.finished.connect(self.app.quit) self.timeline.valueChanged.connect(self.receiver.foo) self.timeline.start() self.app.exec_() self.assert_(self.receiver.counter > 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/ref06_test.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from PySide.QtCore import QObject, QCoreApplication, QTimeLine, Signal, Slot from helper import UsesQCoreApplication class ExtQObject(QObject): signalbetween = Signal('qreal') def __init__(self): QObject.__init__(self) self.counter = 0 @Slot('qreal') def foo(self, value): self.counter += 1 class SignaltoSignalTest(UsesQCoreApplication): def setUp(self): UsesQCoreApplication.setUp(self) self.receiver = ExtQObject() self.timeline = QTimeLine(100) def tearDown(self): del self.timeline del self.receiver UsesQCoreApplication.tearDown(self) def testSignaltoSignal(self): self.timeline.setUpdateInterval(10) self.timeline.finished.connect(self.app.quit) self.timeline.valueChanged.connect(self.receiver.signalbetween) self.receiver.signalbetween.connect(self.receiver.foo) self.timeline.start() self.app.exec_() self.assert_(self.receiver.counter > 1) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/segfault_proxyparent_test.py ================================================ import unittest from PySide.QtCore import QObject, SIGNAL # Description of the problem # After creating an PyObject that inherits from QObject, connecting it, # deleting it and later creating another Python QObject-based object, this # new object will point to the same memory position as the first one. # Somehow the underlying QObject also points to the same position. # In PyQt4, the connection works fine with the same memory behavior, # so it looks like specific to SIP. class Dummy(QObject): def __init__(self, parent=None): QObject.__init__(self, parent) class Joe(QObject): def __init__(self, parent=None): QObject.__init__(self, parent) class SegfaultCase(unittest.TestCase): """Test case for the segfault happening when parent() is called inside ProxyObject""" def setUp(self): self.called = False def tearDown(self): try: del self.args except: pass def callback(self, *args): if tuple(self.args) == args: self.called = True def testSegfault(self): """Regression: Segfault for qobjects in the same memory position.""" obj = Dummy() QObject.connect(obj, SIGNAL('bar(int)'), self.callback) self.args = (33,) obj.emit(SIGNAL('bar(int)'), self.args[0]) self.assert_(self.called) del obj obj = Joe() QObject.connect(obj, SIGNAL('bar(int)'), self.callback) self.args = (33,) obj.emit(SIGNAL('bar(int)'), self.args[0]) self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/self_connect_test.py ================================================ #!/usr/bin/env python '''Using self.connect(signal, method)''' import unittest from PySide.QtCore import QObject, SIGNAL, SLOT from PySide.QtGui import QPushButton, QWidget from helper import UsesQApplication class SelfConnect(UsesQApplication): def testButtonClickClose(self): button = QPushButton() button.connect(button, SIGNAL('clicked()'), SLOT('close()')) button.show() self.assert_(button.isVisible()) button.click() self.assert_(not button.isVisible()) def testWindowButtonClickClose(self): button = QPushButton() window = QWidget() window.connect(button, SIGNAL('clicked()'), SLOT('close()')) window.show() self.assert_(window.isVisible()) button.click() self.assert_(not window.isVisible()) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/short_circuit_test.py ================================================ import unittest from PySide.QtCore import QObject, SIGNAL, SLOT class Dummy(QObject): """Dummy class used in this test.""" def __init__(self, parent=None): QObject.__init__(self, parent) class ShortCircuitSignals(unittest.TestCase): def setUp(self): self.called = False def tearDown(self): try: del self.args except: pass def callback(self, *args): if tuple(self.args) == args: self.called = True def testNoArgs(self): """Short circuit signal without arguments""" obj1 = Dummy() QObject.connect(obj1, SIGNAL('foo'), self.callback) self.args = tuple() obj1.emit(SIGNAL('foo'), *self.args) self.assert_(self.called) def testWithArgs(self): """Short circuit signal with integer arguments""" obj1 = Dummy() QObject.connect(obj1, SIGNAL('foo'), self.callback) self.args = (42,) obj1.emit(SIGNAL('foo'), *self.args) self.assert_(self.called) def testMultipleArgs(self): """Short circuit signal with multiple arguments""" obj1 = Dummy() QObject.connect(obj1, SIGNAL('foo'), self.callback) self.args = (42,33,'char') obj1.emit(SIGNAL('foo'), *self.args) self.assert_(self.called) def testComplexArgs(self): """Short circuit signal with complex arguments""" obj1 = Dummy() QObject.connect(obj1, SIGNAL('foo'), self.callback) self.args = (42, obj1) obj1.emit(SIGNAL('foo'), *self.args) self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal2signal_connect_test.py ================================================ # -*- coding: utf-8 -*- ''' Test case for signal to signal connections.''' import unittest from PySide.QtCore import * def cute_slot(): pass class TestSignal2SignalConnect(unittest.TestCase): '''Test case for signal to signal connections''' def setUp(self): #Set up the basic resources needed self.sender = QObject() self.forwarder = QObject() self.args = None self.called = False def tearDown(self): #Delete used resources try: del self.sender except: pass try: del self.forwarder except: pass del self.args def callback_noargs(self): #Default callback without arguments self.called = True def callback_args(self, *args): #Default callback with arguments if args == self.args: self.called = True else: raise TypeError("Invalid arguments") def callback_qobject(self, *args): #Default callback for QObject as argument if args[0].objectName() == self.args[0]: self.called = True else: raise TypeError("Invalid arguments") def testSignalWithoutArguments(self): QObject.connect(self.sender, SIGNAL("destroyed()"), self.forwarder, SIGNAL("forward()")) QObject.connect(self.forwarder, SIGNAL("forward()"), self.callback_noargs) del self.sender self.assert_(self.called) def testSignalWithOnePrimitiveTypeArgument(self): QObject.connect(self.sender, SIGNAL("mysignal(int)"), self.forwarder, SIGNAL("mysignal(int)")) QObject.connect(self.forwarder, SIGNAL("mysignal(int)"), self.callback_args) self.args = (19,) self.sender.emit(SIGNAL('mysignal(int)'), *self.args) self.assert_(self.called) def testSignalWithMultiplePrimitiveTypeArguments(self): QObject.connect(self.sender, SIGNAL("mysignal(int,int)"), self.forwarder, SIGNAL("mysignal(int,int)")) QObject.connect(self.forwarder, SIGNAL("mysignal(int,int)"), self.callback_args) self.args = (23, 29) self.sender.emit(SIGNAL('mysignal(int,int)'), *self.args) self.assert_(self.called) def testSignalWithOneStringArgument(self): QObject.connect(self.sender, SIGNAL("mysignal(QString)"), self.forwarder, SIGNAL("mysignal(QString)")) QObject.connect(self.forwarder, SIGNAL("mysignal(QString)"), self.callback_args) self.args = ('myargument',) self.sender.emit(SIGNAL('mysignal(QString)'), *self.args) self.assert_(self.called) def testSignalWithOneQObjectArgument(self): QObject.connect(self.sender, SIGNAL('destroyed(QObject*)'), self.forwarder, SIGNAL('forward(QObject*)')) QObject.connect(self.forwarder, SIGNAL('forward(QObject*)'), self.callback_qobject) obj_name = 'sender' self.sender.setObjectName(obj_name) self.args = (obj_name, ) del self.sender self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal_autoconnect_test.py ================================================ # -*- coding: utf-8 -*- import unittest from PySide.QtCore import * from PySide.QtGui import * class MyObject(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self._method_called = False @Slot() def on_button_clicked(self): self._method_called = True class AutoConnectionTest(unittest.TestCase): def testConnection(self): app = QApplication([]) win = MyObject() btn = QPushButton("click", win) btn.setObjectName("button") QMetaObject.connectSlotsByName(win) btn.click() self.assert_(win._method_called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal_connectiontype_support_test.py ================================================ import unittest from PySide.QtCore import QObject, SIGNAL, Qt class Dummy(QObject): """Dummy class used in this test.""" def __init__(self, parent=None): QObject.__init__(self, parent) class TestConnectionTypeSupport(unittest.TestCase): def callback(self, *args): if tuple(self.args) == args: self.called = True def testNoArgs(self): """Connect signal using a Qt.ConnectionType as argument""" obj1 = Dummy() QObject.connect(obj1, SIGNAL('foo'), self.callback, Qt.DirectConnection) self.args = tuple() obj1.emit(SIGNAL('foo'), *self.args) self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal_emission_gui_test.py ================================================ #!/usr/bin/env python """Tests covering signal emission and receiving to python slots""" import unittest from PySide.QtCore import QObject, SIGNAL, SLOT try: from PySide.QtGui import QSpinBox, QPushButton hasQtGui = True except ImportError: hasQtGui = False from helper import BasicPySlotCase, UsesQApplication if hasQtGui: class ButtonPySlot(UsesQApplication, BasicPySlotCase): """Tests the connection of python slots to QPushButton signals""" def testButtonClicked(self): """Connection of a python slot to QPushButton.clicked()""" button = QPushButton('Mylabel') QObject.connect(button, SIGNAL('clicked()'), self.cb) self.args = tuple() button.emit(SIGNAL('clicked(bool)'), False) self.assert_(self.called) def testButtonClick(self): """Indirect qt signal emission using the QPushButton.click() method """ button = QPushButton('label') QObject.connect(button, SIGNAL('clicked()'), self.cb) self.args = tuple() button.click() self.assert_(self.called) if hasQtGui: class SpinBoxPySlot(UsesQApplication, BasicPySlotCase): """Tests the connection of python slots to QSpinBox signals""" def setUp(self): super(SpinBoxPySlot, self).setUp() self.spin = QSpinBox() def tearDown(self): del self.spin super(SpinBoxPySlot, self).tearDown() def testSpinBoxValueChanged(self): """Connection of a python slot to QSpinBox.valueChanged(int)""" QObject.connect(self.spin, SIGNAL('valueChanged(int)'), self.cb) self.args = [3] self.spin.emit(SIGNAL('valueChanged(int)'), *self.args) self.assert_(self.called) def testSpinBoxValueChangedImplicit(self): """Indirect qt signal emission using QSpinBox.setValue(int)""" QObject.connect(self.spin, SIGNAL('valueChanged(int)'), self.cb) self.args = [42] self.spin.setValue(self.args[0]) self.assert_(self.called) def atestSpinBoxValueChangedFewArgs(self): """Emission of signals with fewer arguments than needed""" # XXX: PyQt4 crashes on the assertRaises QObject.connect(self.spin, SIGNAL('valueChanged(int)'), self.cb) self.args = (554,) self.assertRaises(TypeError, self.spin.emit, SIGNAL('valueChanged(int)')) if hasQtGui: class QSpinBoxQtSlots(UsesQApplication): """Tests the connection to QSpinBox qt slots""" qapplication = True def testSetValueIndirect(self): """Indirect signal emission: QSpinBox using valueChanged(int)/setValue(int)""" spinSend = QSpinBox() spinRec = QSpinBox() spinRec.setValue(5) QObject.connect(spinSend, SIGNAL('valueChanged(int)'), spinRec, SLOT('setValue(int)')) self.assertEqual(spinRec.value(), 5) spinSend.setValue(3) self.assertEqual(spinRec.value(), 3) self.assertEqual(spinSend.value(), 3) def testSetValue(self): """Direct signal emission: QSpinBox using valueChanged(int)/setValue(int)""" spinSend = QSpinBox() spinRec = QSpinBox() spinRec.setValue(5) spinSend.setValue(42) QObject.connect(spinSend, SIGNAL('valueChanged(int)'), spinRec, SLOT('setValue(int)')) self.assertEqual(spinRec.value(), 5) self.assertEqual(spinSend.value(), 42) spinSend.emit(SIGNAL('valueChanged(int)'), 3) self.assertEqual(spinRec.value(), 3) #Direct emission shouldn't change the value of the emitter self.assertEqual(spinSend.value(), 42) spinSend.emit(SIGNAL('valueChanged(int)'), 66) self.assertEqual(spinRec.value(), 66) self.assertEqual(spinSend.value(), 42) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal_emission_test.py ================================================ #!/usr/bin/env python """Tests covering signal emission and receiving to python slots""" import sys import unittest import functools from PySide.QtCore import QObject, SIGNAL, SLOT, QProcess, QTimeLine from helper import BasicPySlotCase, UsesQCoreApplication class ArgsOnEmptySignal(UsesQCoreApplication): '''Trying to emit a signal without arguments passing some arguments''' def testArgsToNoArgsSignal(self): '''Passing arguments to a signal without arguments''' process = QProcess() self.assertRaises(TypeError, process.emit, SIGNAL('started()'), 42) class MoreArgsOnEmit(UsesQCoreApplication): '''Trying to pass more args than needed to emit (signals with args)''' def testMoreArgs(self): '''Passing more arguments than needed''' process = QProcess() self.assertRaises(TypeError, process.emit, SIGNAL('finished(int)'), 55, 55) class Dummy(QObject): '''Dummy class''' pass class PythonSignalToCppSlots(UsesQCoreApplication): '''Connect python signals to C++ slots''' def testWithoutArgs(self): '''Connect python signal to QTimeLine.toggleDirection()''' timeline = QTimeLine() dummy = Dummy() QObject.connect(dummy, SIGNAL('dummy()'), timeline, SLOT('toggleDirection()')) orig_dir = timeline.direction() dummy.emit(SIGNAL('dummy()')) new_dir = timeline.direction() if orig_dir == QTimeLine.Forward: self.assertEqual(new_dir, QTimeLine.Backward) else: self.assertEqual(new_dir, QTimeLine.Forward) def testWithArgs(self): '''Connect python signals to QTimeLine.setCurrentTime(int)''' timeline = QTimeLine() dummy = Dummy() QObject.connect(dummy, SIGNAL('dummy(int)'), timeline, SLOT('setCurrentTime(int)')) current = timeline.currentTime() dummy.emit(SIGNAL('dummy(int)'), current+42) self.assertEqual(timeline.currentTime(), current+42) class CppSignalsToCppSlots(UsesQCoreApplication): '''Connection between C++ slots and signals''' def testWithoutArgs(self): '''Connect QProcess.started() to QTimeLine.togglePaused()''' process = QProcess() timeline = QTimeLine() QObject.connect(process, SIGNAL('finished(int, QProcess::ExitStatus)'), timeline, SLOT('toggleDirection()')) orig_dir = timeline.direction() process.start(sys.executable, ['-c', '"print 42"']) process.waitForFinished() new_dir = timeline.direction() if orig_dir == QTimeLine.Forward: self.assertEqual(new_dir, QTimeLine.Backward) else: self.assertEqual(new_dir, QTimeLine.Forward) called = False def someSlot(args=None): global called called = True class DynamicSignalsToFuncPartial(UsesQCoreApplication): def testIt(self): global called called = False o = QObject() o.connect(o, SIGNAL("ASignal"), functools.partial(someSlot, "partial ..")) o.emit(SIGNAL("ASignal")) self.assertTrue(called) class EmitUnknownType(UsesQCoreApplication): def testIt(self): a = QObject() a.connect(SIGNAL('foobar(Dummy)'), lambda x: 42) # Just connect with an unknown type self.assertRaises(TypeError, a.emit, SIGNAL('foobar(Dummy)'), 22) class EmitEnum(UsesQCoreApplication): """Test emission of enum arguments""" def slot(self, arg): self.arg = arg def testIt(self): self.arg = None p = QProcess() p.stateChanged.connect(self.slot) p.stateChanged.emit(QProcess.NotRunning) self.assertEqual(self.arg, QProcess.NotRunning) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal_func_test.py ================================================ # -*- coding: utf-8 -*- import unittest from PySide.QtCore import SIGNAL, SLOT class SIGNALSLOTTests(unittest.TestCase): '''Test the output of SIGNAL and SLOT.''' def testSIGNAL(self): #SIGNAL function a = "foobar" self.assertEqual(str(SIGNAL(a)), "2foobar") def testSLOT(self): #SLOT function a = "foobar" self.assertEqual(str(SLOT(a)), "1foobar") if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal_manager_refcount_test.py ================================================ #!/usr/bin/python from sys import getrefcount import unittest from PySide.QtCore import QObject, SIGNAL class SignalManagerRefCount(unittest.TestCase): """Simple test case to check if the signal_manager is erroneously incrementing the object refcounter""" def testObjectRefcount(self): """Emission of QObject.destroyed() to a python slot""" def callback(): pass obj = QObject() refcount = getrefcount(obj) QObject.connect(obj, SIGNAL('destroyed()'), callback) self.assertEqual(refcount, getrefcount(obj)) QObject.disconnect(obj, SIGNAL('destroyed()'), callback) self.assertEqual(refcount, getrefcount(obj)) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal_number_limit_test.py ================================================ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from PySide import QtCore class Emitter(QtCore.QObject): s1 = QtCore.Signal() s2 = QtCore.Signal() s3 = QtCore.Signal() s4 = QtCore.Signal() s5 = QtCore.Signal() s6 = QtCore.Signal() s7 = QtCore.Signal() s8 = QtCore.Signal() s9 = QtCore.Signal() s10 = QtCore.Signal() s11 = QtCore.Signal() s12 = QtCore.Signal() s13 = QtCore.Signal() s14 = QtCore.Signal() class SignalNumberLimitTest(unittest.TestCase): def myCb(self): self._count += 1 def testBug(self): e = Emitter() e.s1.connect(self.myCb) e.s2.connect(self.myCb) e.s3.connect(self.myCb) e.s4.connect(self.myCb) e.s5.connect(self.myCb) e.s6.connect(self.myCb) e.s7.connect(self.myCb) e.s8.connect(self.myCb) e.s9.connect(self.myCb) e.s10.connect(self.myCb) e.s11.connect(self.myCb) e.s12.connect(self.myCb) e.s13.connect(self.myCb) e.s14.connect(self.myCb) self._count = 0 e.s1.emit() e.s2.emit() e.s3.emit() e.s4.emit() e.s5.emit() e.s6.emit() e.s7.emit() e.s8.emit() e.s9.emit() e.s10.emit() e.s11.emit() e.s12.emit() e.s13.emit() e.s14.emit() self.assertEqual(self._count, 14) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal_object_test.py ================================================ #!/usr/bin/env python import unittest from PySide.QtCore import QTimer, Signal, QObject, Slot, Qt from helper import UsesQCoreApplication class MyObject(QTimer): sig1 = Signal() sig2 = Signal(int, name='rangeChanged') sig3 = Signal(int) sig4 = Signal((int,), (str,)) sig5 = Signal((str,), (int,)) sig6 = Signal(QObject) @Slot(int) def myRange(self, r): self._range = r def slot1(self): self._called = True def slotString(self, s): self._s = s def slotObject(self, o): self._o = o class SignalObjectTest(UsesQCoreApplication): def cb(self): self._cb_called = True self.app.exit() def testsingleConnect(self): o = MyObject() o.sig1.connect(o.slot1) o.sig1.emit() self.assertTrue(o._called) def testSignalWithArgs(self): o = MyObject() o.sig3.connect(o.myRange) o.sig3.emit(10) self.assertEqual(o._range, 10) def testSignatureParse(self): o = MyObject() o.sig2.connect(o.myRange) o.sig2.emit(10) def testDictOperator(self): o = MyObject() o.sig4[str].connect(o.slotString) o.sig4[str].emit("PySide") self.assertEqual(o._s, "PySide") def testGeneretedSignal(self): o = MyObject() o.timeout.connect(self.cb) o.start(100) self.app.exec_() self.assertTrue(self._cb_called) def testConnectionType(self): o = MyObject() o.timeout.connect(self.cb, type=Qt.DirectConnection) o.start(100) self.app.exec_() self.assertTrue(self._cb_called) def testSignalWithSignal(self): o = MyObject() o.sig2.connect(o.myRange) o.sig5.connect(o.sig2) o.sig5[int].emit(10) self.assertEqual(o._range, 10) def testSignalWithObject(self): o = MyObject() o.sig6.connect(o.slotObject) arg = QObject() o.sig6.emit(arg) self.assertEqual(arg, o._o) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal_signature_test.py ================================================ # -*- coding: utf-8 -*- '''Test case for signal signature received by QObject::connectNotify().''' import unittest from PySide.QtCore import * from helper import UsesQCoreApplication class Obj(QObject): def __init__(self): QObject.__init__(self) self.signal = '' def connectNotify(self, signal): self.signal = signal def callback(arg=None): pass class TestConnectNotifyWithNewStyleSignals(UsesQCoreApplication): '''Test case for signal signature received by QObject::connectNotify().''' def testOldStyle(self): sender = Obj() receiver = QObject() sender.connect(SIGNAL('destroyed()'), receiver, SLOT('deleteLater()')) self.assertEqual(sender.signal, SIGNAL('destroyed()')) def testOldStyleWithPythonCallback(self): sender = Obj() sender.connect(SIGNAL('destroyed()'), callback) self.assertEqual(sender.signal, SIGNAL('destroyed()')) def testNewStyle(self): sender = Obj() sender.destroyed.connect(callback) self.assertEqual(sender.signal, SIGNAL('destroyed()')) sender.destroyed[QObject].connect(callback) self.assertEqual(sender.signal, SIGNAL('destroyed(QObject*)')) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/signal_with_primitive_type_test.py ================================================ # -*- coding: utf-8 -*- import unittest from PySide.QtCore import * class SignalPrimitiveTypeTest(unittest.TestCase): def signalValueChanged(self, v): self.called = True self._app.quit() def createTimeLine(self): self.called = False tl = QTimeLine(10000) QObject.connect(tl, SIGNAL("valueChanged(qreal)"), self.signalValueChanged) return tl def testTimeLine(self): self._valueChangedCount = 0 self._app = QCoreApplication([]) tl = self.createTimeLine() tl.start() self._app.exec_() self.assert_(self.called) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/slot_reference_count_test.py ================================================ ''' Forced disconnection: Delete one end of the signal connection''' import unittest from sys import getrefcount from PySide.QtCore import QObject, SIGNAL, SLOT class Dummy(QObject): def dispatch(self): self.emit(SIGNAL('foo()')) class PythonSignalRefCount(unittest.TestCase): def setUp(self): self.emitter = Dummy() def tearDown(self): self.emitter def testRefCount(self): def cb(*args): pass self.assertEqual(getrefcount(cb), 2) QObject.connect(self.emitter, SIGNAL('foo()'), cb) self.assertEqual(getrefcount(cb), 3) QObject.disconnect(self.emitter, SIGNAL('foo()'), cb) self.assertEqual(getrefcount(cb), 2) class CppSignalRefCount(unittest.TestCase): def setUp(self): self.emitter = QObject() def tearDown(self): self.emitter def testRefCount(self): def cb(*args): pass self.assertEqual(getrefcount(cb), 2) QObject.connect(self.emitter, SIGNAL('destroyed()'), cb) self.assertEqual(getrefcount(cb), 3) QObject.disconnect(self.emitter, SIGNAL('destroyed()'), cb) self.assertEqual(getrefcount(cb), 2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/signals/static_metaobject_test.py ================================================ #!/usr/bin/env python """Tests covering signal emission and receiving to python slots""" import unittest from PySide.QtCore import QObject, SIGNAL from helper import UsesQCoreApplication class MyObject(QObject): def __init__(self, parent=None): QObject.__init__(self, parent) self._slotCalledCount = 0 def mySlot(self): self._slotCalledCount = self._slotCalledCount + 1 class StaticMetaObjectTest(UsesQCoreApplication): def testSignalPropagation(self): o = MyObject() o2 = MyObject() # SIGNAL foo not created yet self.assertEqual(o.metaObject().indexOfSignal("foo()"), -1) o.connect(SIGNAL("foo()"), o2.mySlot) # SIGNAL foo create after connect self.assert_(o.metaObject().indexOfSignal("foo()") > 0) # SIGNAL does not propagate to others objects of the same type self.assertEqual(o2.metaObject().indexOfSignal("foo()"), -1) del o del o2 o = MyObject() # The SIGNAL was destroyed with old objects self.assertEqual(o.metaObject().indexOfSignal("foo()"), -1) def testSharedSignalEmission(self): o = QObject() m = MyObject() o.connect(SIGNAL("foo2()"), m.mySlot) m.connect(SIGNAL("foo2()"), m.mySlot) o.emit(SIGNAL("foo2()")) self.assertEqual(m._slotCalledCount, 1) del o m.emit(SIGNAL("foo2()")) self.assertEqual(m._slotCalledCount, 2) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/tools/list-class-hierarchy.py ================================================ #!/usr/bin/python # This file is part of PySide: Python for Qt # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # # Contact: PySide team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # version 2 as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA # This is a small script printing out Qt binding class hierarchies # for comparison purposes. # # Usage: # # ./list-class-hierarchy.py PySide > pyside.list # ./list-class-hierarchy.py PyQt4 > pyqt4.list # # meld pyside.list pyqt4.list import sys import pdb from inspect import isclass ignore = ["staticMetaObject", "pyqtConfigure", "registerUserData", "thread", ] def recurse_into(el,obj): #s = el.split('.')[-1] #pdb.set_trace() symbols = [] for item in sorted(dir(obj)): if item[0]=='_': continue mel = el + '.' + item try: mobj = eval(mel) except Exception: continue if item in ignore: continue else: symbols.append(mel) if isclass(mobj): symbols += recurse_into(mel,mobj) return symbols if __name__=='__main__': modules = [ 'QtCore', 'QtGui', 'QtHelp', #'QtMultimedia', 'QtNetwork', 'QtOpenGL', 'QtScript', 'QtScriptTools', 'QtSql', 'QtSvg', 'QtTest', #'QtUiTools', 'QtWebKit', 'QtXml', 'QtXmlPatterns' ] libraries = ["PySide", "PyQt4"] librarySymbols = {} for l in libraries: dictionary = [] if l =="PyQt4": import sip sip.setapi('QDate',2) sip.setapi('QDateTime',2) sip.setapi('QString',2) sip.setapi('QTextStream',2) sip.setapi('QTime',2) sip.setapi('QUrl',2) sip.setapi('QVariant',2) for m in modules: exec "from %s import %s" % (l,m) in globals(), locals() dictionary += recurse_into(m, eval(m)) librarySymbols[l] = dictionary print "PyQt4: ", len(librarySymbols["PyQt4"]), " PySide: ", len(librarySymbols["PySide"]) for symbol in librarySymbols["PyQt4"]: if not (symbol in librarySymbols["PySide"]): print "Symbol not found in PySide:", symbol ================================================ FILE: tests/util/color.py ================================================ '''Function to print a colored line to terminal''' RED='\033[0;31m%s\033[m' def print_colored(message, color=RED): print color % message if __name__ == '__main__': print '42 - the answer' print_colored("But what's the question?") print 'Hum?' ================================================ FILE: tests/util/helper/__init__.py ================================================ '''Helper classes and functions''' import os import unittest from random import randint from PySide.QtCore import QCoreApplication, QTimer try: from PySide.QtGui import QApplication except ImportError: has_gui = False else: has_gui = True def adjust_filename(filename, orig_mod_filename): dirpath = os.path.dirname(os.path.abspath(orig_mod_filename)) return os.path.join(dirpath, filename) class NoQtGuiError(Exception): def __init__(self): Exception.__init__(self, 'No QtGui found') class BasicPySlotCase(object): '''Base class that tests python slots and signal emissions. Python slots are defined as any callable passed to QObject.connect(). ''' def setUp(self): self.called = False def tearDown(self): try: del self.args except: pass def cb(self, *args): '''Simple callback with arbitrary arguments. The test function must setup the 'args' attribute with a sequence containing the arguments expected to be received by this slot. Currently only a single connection is supported. ''' if tuple(self.args) == args: self.called = True else: raise ValueError('Invalid arguments for callback') _instance = None _timed_instance = None if has_gui: class UsesQApplication(unittest.TestCase): '''Helper class to provide QApplication instances''' qapplication = True def setUp(self): '''Creates the QApplication instance''' # Simple way of making instance a singleton super(UsesQApplication, self).setUp() global _instance if _instance is None: _instance = QApplication([]) self.app = _instance def tearDown(self): '''Deletes the reference owned by self''' del self.app super(UsesQApplication, self).tearDown() class TimedQApplication(unittest.TestCase): '''Helper class with timed QApplication exec loop''' def setUp(self, timeout=100): '''Setups this Application. timeout - timeout in milisseconds''' global _timed_instance if _timed_instance is None: _timed_instance = QApplication([]) self.app = _timed_instance QTimer.singleShot(timeout, self.app.quit) def tearDown(self): '''Delete resources''' del self.app else: class UsesQApplication(unittest.TestCase): def setUp(self): raise NoQtGuiError() class TimedQapplication(unittest.TestCase): def setUp(self): raise NoQtGuiError() _core_instance = None class UsesQCoreApplication(unittest.TestCase): '''Helper class for test cases that require an QCoreApplication Just connect or call self.exit_app_cb. When called, will ask self.app to exit. ''' def setUp(self): '''Set up resources''' global _core_instance if _core_instance is None: _core_instance = QCoreApplication([]) self.app = _core_instance def tearDown(self): '''Release resources''' del self.app def exit_app_cb(self): '''Quits the application''' self.app.exit(0) def random_string(size=5): '''Generate random string with the given size''' return ''.join(map(chr, [randint(33, 126) for x in range(size)])) ================================================ FILE: tests/util/helper/docmodifier.py ================================================ '''Helper metaclass do 'decorate' docstrings from base test case classes''' import types def copy_func(func): '''Helper function to copy a function object (except docstring)''' return types.FunctionType(func.func_code, func.func_globals, func.func_name, func.func_defaults, func.func_closure) class DocModifier(type): '''Metaclass for modifiying method documentation. It allows the managed class to modify the method documentation, adding prefixes and suffixes to a given set of methods. For example, you have some unittest.TestCases that run on different set of data. These methods could be written once in a base class and the inheriting class just setup different setUp/tearDown methods with the proper data. To differentiate the methods when using docstrings, you can add a suffix or prefix to the docstring. Variables in the implementing class: doc_prefix - The prefix to the docstring doc_suffix - The suffix to the docstring doc_filter - The function to filter the methods. If not provided, this no docstrings are changed.''' def __new__(mcs, name, bases, dct): # FIXME currently we have to define doc_filter on each subclass filter_function = dct.get('doc_filter') if not filter_function: filter_function = lambda x: False for base in bases: for attr in [x for x in base.__dict__ if filter_function(x)]: original = getattr(base, attr) if original.__doc__: copy = copy_func(original) copy.__doc__ = (dct.get('doc_prefix', '') + original.__doc__ + dct.get('doc_suffix', '')) dct[attr] = copy return type.__new__(mcs, name, bases, dct) def __init__(mcs, name, bases, dct): super(DocModifier, mcs).__init__(name, bases, dct) if __name__ == '__main__': # tests class BaseTest(object): __metaclass__ = DocModifier def testBase(self): '''base''' def testWithoutDoc(self): pass class Implementing(BaseTest): doc_filter = lambda x: x.startswith('test') doc_prefix = 'prefix' doc_suffix = 'suffix' class OnlyPrefix(BaseTest): doc_filter = lambda x: x.startswith('test') doc_prefix = 'prefix' class OnlySuffix(BaseTest): doc_filter = lambda x: x.startswith('test') doc_suffix = 'suffix' assert(Implementing.testBase.__doc__ == 'prefixbasesuffix') assert(Implementing.testWithoutDoc.__doc__ == None) assert(OnlySuffix.testBase.__doc__ == 'basesuffix') assert(OnlySuffix.testWithoutDoc.__doc__ == None) assert(OnlyPrefix.testBase.__doc__ == 'prefixbase') assert(OnlyPrefix.testWithoutDoc.__doc__ == None) ================================================ FILE: tests/util/httpd.py ================================================ import os import sys import threading import select import random import py3kcompat as py3k if py3k.IS_PY3K: import socketserver as SocketServer import http.server as BaseHTTPServer else: import SocketServer import BaseHTTPServer class TestHandler(BaseHTTPServer.BaseHTTPRequestHandler): DATA = "PySide Server" allow_reuse_address = True def do_GET(self): self.send_head() self.wfile.write(TestHandler.DATA) def do_HEAD(self): self.send_head() def send_head(self): self.send_response(200) self.send_header("Content-type", "text/plain") self.send_header("Content-Length", str(len(TestHandler.DATA))) self.end_headers() class TestSecureHandler(BaseHTTPServer.BaseHTTPRequestHandler): DATA = "PySide" allow_reuse_address = True def do_GET(self): self.send_head() self.wfile.write(py3k.b(TestHandler.DATA)) def do_HEAD(self): self.send_head() def send_head(self): try: handler = self.marshall_handler() handler.do_request(self) except: self.send_response(401) self.send_header("WWW-Authenticate", "Basic realm='Secure Area'") self.send_header("Content-type", "text/plain") self.send_header("Content-Length", str(len(TestHandler.DATA))) self.end_headers() # Workaround for the missing shutdown method in python2.5 class CompatTCPServer(SocketServer.TCPServer): def __init__(self, server_address, RequestHandlerClass): SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass) self.isPy25 = sys.version_info[0] == 2 and sys.version_info[1] == 5 if self.isPy25: self.__is_shut_down = threading.Event() self.__serving = False def serve_forever(self, poll_interval=0.5): """Handle one request at a time until shutdown. Polls for shutdown every poll_interval seconds. Ignores self.timeout. If you need to do periodic tasks, do them in another thread. """ if self.isPy25: self.__serving = True self.__is_shut_down.clear() while self.__serving: # XXX: Consider using another file descriptor or # connecting to the socket to wake this up instead of # polling. Polling reduces our responsiveness to a # shutdown request and wastes cpu at all other times. r, w, e = select.select([self], [], [], poll_interval) if r: self.py25_handle_request_noblock() self.__is_shut_down.set() else: SocketServer.TCPServer.serve_forever(self, poll_interval) def py25_handle_request_noblock(self): """Handle one request, without blocking. I assume that select.select has returned that the socket is readable before this function was called, so there should be no risk of blocking in get_request(). """ if self.isPy25: try: request, client_address = self.get_request() except socket.error: return if self.verify_request(request, client_address): try: self.process_request(request, client_address) except: self.handle_error(request, client_address) self.close_request(request) def shutdown(self): """Stops the serve_forever loop. Blocks until the loop has finished. This must be called while serve_forever() is running in another thread, or it will deadlock. """ if self.isPy25: self.__serving = False if not self.__is_shut_down: self.__is_shut_down.wait() else: SocketServer.TCPServer.shutdown(self) class TestServer(threading.Thread): def __init__(self, secure=False): threading.Thread.__init__(self) self._port = int(os.getenv("PYSIDE_TESTSERVER_PORT") or 12321) self.keep_running = True if secure: handle = TestSecureHandler else: handle = TestHandler while True: try: self.httpd = CompatTCPServer(('' , self._port), handle) break except: self._port = self._port + random.randint(1, 100) def port(self): return self._port def run(self): self.httpd.serve_forever() def shutdown(self): self.httpd.shutdown() self.join() ================================================ FILE: tests/util/module_wrapper/PySide/QtAssistant.py ================================================ from PyQt4.QtAssistant import * ================================================ FILE: tests/util/module_wrapper/PySide/QtCore.py ================================================ from PyQt4.QtCore import * ================================================ FILE: tests/util/module_wrapper/PySide/QtDesigner.py ================================================ from PyQt4.QtDesigner import * ================================================ FILE: tests/util/module_wrapper/PySide/QtGui.py ================================================ from PyQt4.QtGui import * ================================================ FILE: tests/util/module_wrapper/PySide/QtHelp.py ================================================ from PyQt4.QtHelp import * ================================================ FILE: tests/util/module_wrapper/PySide/QtNetwork.py ================================================ from PyQt4.QtNetwork import * ================================================ FILE: tests/util/module_wrapper/PySide/QtScript.py ================================================ from PyQt4.QtScript import * ================================================ FILE: tests/util/module_wrapper/PySide/QtSql.py ================================================ from PyQt4.QtSql import * ================================================ FILE: tests/util/module_wrapper/PySide/QtSvg.py ================================================ from PyQt4.QtSvg import * ================================================ FILE: tests/util/module_wrapper/PySide/QtTest.py ================================================ from PyQt4.QtTest import * ================================================ FILE: tests/util/module_wrapper/PySide/QtWebKit.py ================================================ from PyQt4.QtWebKit import * ================================================ FILE: tests/util/module_wrapper/PySide/QtXml.py ================================================ from PyQt4.QtXml import * ================================================ FILE: tests/util/module_wrapper/PySide/QtXmlPatterns.py ================================================ from PyQt4.QtXmlPatterns import * ================================================ FILE: tests/util/module_wrapper/PySide/__init__.py ================================================ ================================================ FILE: tests/util/module_wrapper/PySide/phonon.py ================================================ from PyQt4.phonon import * ================================================ FILE: tests/util/processtimer.py ================================================ #!/usr/bin/env python import time,os class TimeoutException(Exception): def __init__(self, msg): self.msg = msg def __str__(self): return repr(self.msg) class ProcessTimer(object): '''Timeout function for controlling a subprocess.Popen instance. Naive implementation using busy loop, see later other means of doing this. ''' def __init__(self, proc, timeout): self.proc = proc self.timeout = timeout def waitfor(self): time_passed = 0 while(self.proc.poll() is None and time_passed < self.timeout): time_passed = time_passed + 1 time.sleep(1) if time_passed >= self.timeout: raise TimeoutException("Timeout expired, possible deadlock") if __name__ == "__main__": #simple example from subprocess import Popen proc = Popen(['sleep','10']) t = ProcessTimer(proc,5) try: t.waitfor() except TimeoutException: print "timeout - PID: %d" % (t.proc.pid) #TODO: detect SO and kill accordingly #Linux os.kill(t.proc.pid, 9) #Windows (not tested) #subprocess.Popen("taskkill /F /T /PID %i"%handle.pid , shell=True) print "exit code: %d" % (t.proc.poll()) ================================================ FILE: tests/util/py2xfunctions.py ================================================ def b(s): return s def l(n): return long(n) def unicode_(s): if type(s) == str: import codecs c = codecs.lookup('utf-8') s2 = c.decode(s, 'ignore') return s2[0] return u'%s' % s unicode = unicode unichr = unichr long = long buffer = buffer ================================================ FILE: tests/util/py3kcompat.py ================================================ # -*- coding: utf-8 -*- # # This file is part of the Shiboken Python Bindings Generator project. # # Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). # # Contact: PySide team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public License # version 2.1 as published by the Free Software Foundation. Please # review the following information to ensure the GNU Lesser General # Public License version 2.1 requirements will be met: # http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. # # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA import sys IS_PY3K = sys.version_info[0] == 3 if IS_PY3K: from py3xfunctions import b, l, unicode_, unicode, unichr, long, unichr, buffer else: from py2xfunctions import b, l, unicode_, unicode, unichr, long, unichr, buffer ================================================ FILE: tests/util/py3xfunctions.py ================================================ def b(s): if type(s) == bytes: return s return bytes(s, "UTF8") def buffer_(s): if s == None: return None elif type(s) == str: return bytes(s, "UTF8") elif type(s) == bytes: return s else: memoryview(s) def l(n): return n def unicode_(s): return s unicode = str unichr = chr long = int unichr = chr buffer = buffer_ ================================================ FILE: tests/util/pyqt_diff.py ================================================ '''Script to show the difference between PyQt4 and ours''' import sys from color import print_colored def check_module_diff(module_name): '''Difference between PySide and PyQt4 versions of qt bindings. Returns a tuple with the members present only on PySide and only on PyQt4''' boost_module = getattr(__import__('PySide.' + module_name), module_name) orig_module = getattr(__import__('PyQt4.' + module_name), module_name) boost_set = set(dir(boost_module)) orig_set = set(dir(orig_module)) return sorted(boost_set - orig_set), sorted(orig_set - boost_set) def main(argv=None): if argv is None: argv = sys.argv module_name = argv[1] if len(argv) >= 2 else 'QtCore' only_boost, only_orig = check_module_diff(module_name) print_colored('Only on Boost version') print only_boost print_colored('Only on SIP version') print only_orig if __name__ == '__main__': main() ================================================ FILE: tests/util/pyqtcheck.py ================================================ #!/usr/bin/env python import sys from optparse import OptionParser import PyQt4 from PyQt4 import QtCore, QtGui, QtNetwork modules = [QtCore, QtGui, QtNetwork] def search(klass, method=None): for module in modules: try: klass_obj = getattr(module, klass) print "%s *found* on module %s" % (klass, module.__name__) except AttributeError: print "%s not found on module %s" % (klass, module.__name__) continue if method is None: continue try: meth_obj = getattr(klass_obj, method) meth_name = ".".join([klass, method]) klass_name = ".".join([module.__name__, klass]) print "\"%s\" *found* on class %s" % (meth_name, klass_name) except AttributeError: print "\"%s\" not found on class %s" % (method, klass) def main(argv=None): if argv is None: argv = sys.argv[1:] try: klass, method = argv[0].split(".") except: klass = argv[0] method = None search(klass, method) if __name__ == '__main__': main() ================================================ FILE: tests/util/rename_imports.sh ================================================ #!/bin/bash # Rename import statements from .py script to use a specific module name set -e if [ $# -lt 3 ]; then echo "Usage: $0 " exit 1 fi old_name=$1; shift new_name=$1; shift find "$@" -name "*.py" -exec sed -ri "s/(import|from) $old_name/\1 $new_name/" '{}' \; ================================================ FILE: tests/util/test_processtimer.py ================================================ 'Tests for processtimer.py' import unittest import os from subprocess import Popen, PIPE from processtimer import TimeoutException, ProcessTimer class TimeoutTest(unittest.TestCase): def tearDown(self): try: os.kill(self.proc.pid, 9) except OSError: pass def testRaise(self): self.proc = Popen(['python2.5', '-c', 'while True: pass' ], stdout=PIPE, stderr=PIPE) timer = ProcessTimer(self.proc, 1) self.assertRaises(TimeoutException, timer.waitfor) class SimpleTest(unittest.TestCase): def tearDown(self): try: os.kill(self.proc.pid, 9) except OSError: pass def testSimple(self): self.proc = Popen(['python2.5', '-c', '"print"'], stdout=PIPE, stderr=PIPE) timer = ProcessTimer(self.proc, 10) timer.waitfor() class TestEchoOutput(unittest.TestCase): def tearDown(self): try: os.kill(self.proc.pid, 9) except OSError: pass def testOutput(self): self.proc = Popen(['python2.5', '-c', 'print 1',], stdout=PIPE, stderr=PIPE) timer = ProcessTimer(self.proc, 1) timer.waitfor() self.assertEqual(self.proc.stdout.read().strip(), '1') class TestRetCode(unittest.TestCase): def tearDown(self): try: os.kill(self.proc.pid, 9) except OSError: pass def testSimple(self): self.proc = Popen(['python2.5', '-c', 'print 1'], stdout=PIPE, stderr=PIPE) timer = ProcessTimer(self.proc, 10) timer.waitfor() self.assertEqual(self.proc.poll(), 0) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/util/use_pyqt4.sh ================================================ OLD_PYTHONPATH=$PYTHONPATH PYTHONPATH=`pwd`/util/module_wrapper:$PYTHONPATH ================================================ FILE: tests/util/use_pyside.sh ================================================ PYTHONPATH=$OLD_PYTHONPATH unset OLD_PYTHONPATH ================================================ FILE: tests/util/valgrind-python.supp ================================================ # # This is a valgrind suppression file that should be used when using valgrind. # # Here's an example of running valgrind: # # cd python/dist/src # valgrind --tool=memcheck --suppressions=Misc/valgrind-python.supp \ # ./python -E -tt ./Lib/test/regrtest.py -u bsddb,network # # You must edit Objects/obmalloc.c and uncomment Py_USING_MEMORY_DEBUGGER # to use the preferred suppressions with Py_ADDRESS_IN_RANGE. # # If you do not want to recompile Python, you can uncomment # suppressions for PyObject_Free and PyObject_Realloc. # # See Misc/README.valgrind for more information. # all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 fun:Py_ADDRESS_IN_RANGE } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 fun:Py_ADDRESS_IN_RANGE } { ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64) Memcheck:Value8 fun:Py_ADDRESS_IN_RANGE } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond fun:Py_ADDRESS_IN_RANGE } # # Leaks (including possible leaks) # Hmmm, I wonder if this masks some real leaks. I think it does. # Will need to fix that. # { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:realloc fun:_PyObject_GC_Resize fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING } { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:malloc fun:_PyObject_GC_New fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING } { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:malloc fun:_PyObject_GC_NewVar fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING } # # Non-python specific leaks # { Handle pthread issue (possibly leaked) Memcheck:Leak fun:calloc fun:allocate_dtv fun:_dl_allocate_tls_storage fun:_dl_allocate_tls } { Handle pthread issue (possibly leaked) Memcheck:Leak fun:memalign fun:_dl_allocate_tls_storage fun:_dl_allocate_tls } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 fun:PyObject_Free } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 fun:PyObject_Free } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond fun:PyObject_Free } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 fun:PyObject_Realloc } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 fun:PyObject_Realloc } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond fun:PyObject_Realloc } ### ### All the suppressions below are for errors that occur within libraries ### that Python uses. The problems to not appear to be related to Python's ### use of the libraries. ### { Generic gentoo ld problems Memcheck:Cond obj:/lib/ld-2.3.4.so obj:/lib/ld-2.3.4.so obj:/lib/ld-2.3.4.so obj:/lib/ld-2.3.4.so } { DBM problems, see test_dbm Memcheck:Param write(buf) fun:write obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 fun:dbm_close } { DBM problems, see test_dbm Memcheck:Value8 fun:memmove obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 fun:dbm_store fun:dbm_ass_sub } { DBM problems, see test_dbm Memcheck:Cond obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 fun:dbm_store fun:dbm_ass_sub } { DBM problems, see test_dbm Memcheck:Cond fun:memmove obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 obj:/usr/lib/libdb1.so.2 fun:dbm_store fun:dbm_ass_sub } { GDBM problems, see test_gdbm Memcheck:Param write(buf) fun:write fun:gdbm_open } { ZLIB problems, see test_gzip Memcheck:Cond obj:/lib/libz.so.1.2.3 obj:/lib/libz.so.1.2.3 fun:deflate } { Avoid problems w/readline doing a putenv and leaking on exit Memcheck:Leak fun:malloc fun:xmalloc fun:sh_set_lines_and_columns fun:_rl_get_screen_size fun:_rl_init_terminal_io obj:/lib/libreadline.so.4.3 fun:rl_initialize } ### ### These occur from somewhere within the SSL, when running ### test_socket_sll. They are too general to leave on by default. ### ###{ ### somewhere in SSL stuff ### Memcheck:Cond ### fun:memset ###} ###{ ### somewhere in SSL stuff ### Memcheck:Value4 ### fun:memset ###} ### ###{ ### somewhere in SSL stuff ### Memcheck:Cond ### fun:MD5_Update ###} ### ###{ ### somewhere in SSL stuff ### Memcheck:Value4 ### fun:MD5_Update ###} # # All of these problems come from using test_socket_ssl # { from test_socket_ssl Memcheck:Cond fun:BN_bin2bn } { from test_socket_ssl Memcheck:Cond fun:BN_num_bits_word } { from test_socket_ssl Memcheck:Value4 fun:BN_num_bits_word } { from test_socket_ssl Memcheck:Cond fun:BN_mod_exp_mont_word } { from test_socket_ssl Memcheck:Cond fun:BN_mod_exp_mont } { from test_socket_ssl Memcheck:Param write(buf) fun:write obj:/usr/lib/libcrypto.so.0.9.7 } { from test_socket_ssl Memcheck:Cond fun:RSA_verify } { from test_socket_ssl Memcheck:Value4 fun:RSA_verify } { from test_socket_ssl Memcheck:Value4 fun:DES_set_key_unchecked } { from test_socket_ssl Memcheck:Value4 fun:DES_encrypt2 } { from test_socket_ssl Memcheck:Cond obj:/usr/lib/libssl.so.0.9.7 } { from test_socket_ssl Memcheck:Value4 obj:/usr/lib/libssl.so.0.9.7 } { from test_socket_ssl Memcheck:Cond fun:BUF_MEM_grow_clean } { from test_socket_ssl Memcheck:Cond fun:memcpy fun:ssl3_read_bytes } { from test_socket_ssl Memcheck:Cond fun:SHA1_Update } { from test_socket_ssl Memcheck:Value4 fun:SHA1_Update }