- Qt参考文档
- Qt的类
- Qt的主要类
- Annotated Class Index
- 分组的类
- Member Function Index
- 关于Qt
- Qt的版本
- FAQs
- Window System-specific Notes
- 安装
- 如何学习Qt
- Qt教程一 —— 共十四步
- Qt教程二
- Examples
- Step-by-step Examples
- Key Features in Qt 3.0
- Porting to Qt 3.x
- 简体中文汉化日志
- Class Inheritance Hierarchy
- Qt Class Chart
- Header File Index
- 关于模块
- 画布模块
- 图标视图模块
- Network Module
- Qt OpenGL 三维绘图
- SQL模块
- 表格模块
- 工作区模块
- XML Module
- 概述与HOWTO
- Qt对象模型
- 信号和槽
- 窗口几何结构
- 事件和事件过滤器
- 以Qt国际化
- 调试技术
- Qt中的线程支持
- Qt插件HOWTO
- Pictures of Most Qt Widgets
- Company Information
- 如何报告bug
- Mailing Lists
- Qt的工具
- Qt翻译工具指南
- Qt助手和Qt参考文档
- qmake用户手册
- Standard Accelerator Keys
- Qt Free Edition License Agreement
- GNU General Public License
- Licenses for Code Used in Qt
- 抽象窗口部件类
- Analog Clock
- Walkthrough: A Tiny Editor Illustrating QActionGroup
- A Tiny Example Featuring QActionGroup
- Simple Addressbook
- Advanced Widgets
- Widget Appearance and Style
- Setting the Application Icon
- Main Window and Related Classes
- 介绍
- Qt参考文档介绍
- The 1 Minute Guide to using Qt Assistant
- Qt Assistant in More Detail
- Basic Widgets
- Biff (UNIX only)
- 如何生成大的稀疏QTable
- Buttons and Groupboxes
- A Complete Canvas Application
- Canvas Example
- Listviews with Checkable Items
- A small client-server example
- Collection Classes
- 坐标系统
- Cursors
- 写你自己的布局管理器
- Customized Layoutmanager
- Style overview
- Database Classes
- Format of the QDataStream Operators
- Digital Clock
- Qt Demo
- Qt 设计器
- Reference: Menu Options
- Reference: Toolbar Buttons
- Reference: Dialogs
- Reference: Wizards
- Reference: Windows
- Reference: The .ui File Format
- Creating a Qt Application
- Creating Main Windows with Actions, Toolbars and Menus
- The Designer Approach
- Subclassing and Dynamic Dialogs
- Creating Custom Widgets
- Creating Database Applications
- Customizing and Integrating Qt Designer
- Reference: Key Bindings
- Painting on the Desktop
- Dialog Classes
- A Directory Browser
- 拖放
- Drag And Drop Classes
- Drag and Drop
- Draw Demo
- Connect the Points
- Adding an accelerated graphics driver to Qt/Embedded
- Qt/Embedded Case Study - Cassiopeia E-100
- Character input in Qt/Embedded
- The Qt/Embedded-specific classes
- Qt/Embedded environment variables
- The Feature Definition File
- Fonts in Qt/Embedded
- Enabling the Linux Framebuffer
- Installing Qt/Embedded
- Qt/Embedded Performance Tuning
- Qt/Embedded Pointer Handling
- Porting your applications to Qt/Embedded
- Qt/嵌入式的虚拟帧缓冲
- Running Qt/Embedded applications
- Qt/Embedded as a VNC Server
- Environment Classes
- Event Classes
- Simple Filemanager
- 键盘焦点概述
- A Rectangle Draw "Benchmark"
- An FTP client
- Layout Management
- Grapher Plugin
- Graphics Classes
- Books about GUI
- Hello, World
- Help System
- Simple HTML Help Browser
- Internationalization
- Iconview
- iconview/simple_dd/main.cpp Example File
- iconview/simple_dd/main.h Example File
- Image Processing Classes
- Qt参考文档
- 安装Qt/Windows
- 安装Qt/X11
- Input/Output and Networking
- 布局类
- Layout Managers
- Conway's Game of Life
- Line Edits
- 介绍
- 发布管理器
- Translators
- Programmers
- Listboxes and Comboboxes
- Listbox Example
- Listviews
- A simple mail client
- Editors in a Motif form
- Editors in a Qt main window
- Editors in an Xt form
- makeqpf
- A MDI Application
- Using menus
- 元对象系统
- Miscellaneous Classes
- 使用元对象编译器
- Movies or the Story of the Animated GIF file
- Multimedia Classes
- Network Examples
- A simple NNTP implementation
- Qt-based LiveConnect Plugins
- LiveConnect Examples
- Object Model
- 对象树和对象所有权
- OpenGL Examples
- How to use X11 overlays with the Qt OpenGL extension
- Organizers
- Outliner to show use of DOM
- Picture
- Plugins
- Popup Widgets
- Table of Prime Numbers 2-9999
- Starting processes with IO redirection
- Progress Bar
- Progress Bar and Dialog Example
- 属性
- QAccel类
- qaccel.h包含文件
- QAccel成员列表
- QAccessible Class
- qaccessible.h Include File
- QAccessibleInterface Class
- QAccessibleInterface Member List
- QAccessible Member List
- QAccessibleObject Class
- QAccessibleObject Member List
- QAction类
- A Complete Application Window with Actions
- QAction Examples
- QActionGroup类
- QActionGroup成员列表
- qaction.h包含文件
- QAction成员列表
- QApplication类
- qapplication.h包含文件
- QApplication成员列表
- QAsciiCache Class
- qasciicache.h Include File
- QAsciiCacheIterator Class
- QAsciiCacheIterator Member List
- QAsciiCache Member List
- QAsciiDict Class
- qasciidict.h Include File
- QAsciiDictIterator Class
- QAsciiDictIterator Member List
- QAsciiDict Member List
- qasyncimageio.h Include File
- QAsyncIO Class
- qasyncio.h Include File
- QBitArray类
- qbitarray.h包含文件
- QBitArray成员列表
- QBitmap Class
- qbitmap.h Include File
- QBitmap Member List
- QBitVal Class
- QBitVal Member List
- QBoxLayout Class
- QBoxLayout Member List
- QBrush Class
- qbrush.h Include File
- QBrush Member List
- QBuffer类
- qbuffer.h包含文件
- QBuffer成员列表
- QButton类
- QButtonGroup类
- qbuttongroup.h包含文件
- QButtonGroup成员列表
- qbutton.h包含文件
- QButton成员列表
- QByteArray类
- QByteArray成员列表
- QCache Class
- qcache.h Include File
- QCacheIterator Class
- QCacheIterator Member List
- QCache Member List
- QCanvas Class
- QCanvasEllipse Class
- QCanvasEllipse Member List
- qcanvas.h Include File
- QCanvasItem Class
- QCanvasItemList Class
- QCanvasItemList Member List
- QCanvasItem Member List
- QCanvasLine Class
- QCanvasLine Member List
- QCanvas Member List
- QCanvasPixmap Class
- QCanvasPixmapArray Class
- QCanvasPixmapArray Member List
- QCanvasPixmap Member List
- QCanvasPolygon Class
- QCanvasPolygonalItem Class
- QCanvasPolygonalItem Member List
- QCanvasPolygon Member List
- QCanvasRectangle Class
- QCanvasRectangle Member List
- QCanvasSpline Class
- QCanvasSpline Member List
- QCanvasSprite Class
- QCanvasSprite Member List
- QCanvasText Class
- QCanvasText Member List
- QCanvasView Class
- QCanvasView Member List
- QCDEStyle Class
- qcdestyle.h Include File
- QCDEStyle Member List
- QChar Class
- QChar Member List
- QCharRef Class
- QCharRef Member List
- QCheckBox类
- qcheckbox.h包含文件
- QCheckBox成员列表
- QCheckListItem Class
- QCheckListItem Member List
- QCheckTableItem类
- QCheckTableItem成员列表
- QChildEvent Class
- QChildEvent Member List
- QClipboard类
- qclipboard.h包含文件
- QClipboard成员列表
- QCloseEvent Class
- QCloseEvent Member List
- QColor Class
- QColorDialog类
- qcolordialog.h包含文件
- QColorDialog成员列表
- QColorDrag Class
- QColorDrag Member List
- QColorGroup Class
- QColorGroup Member List
- qcolor.h Include File
- QColor Member List
- QComboBox Class
- qcombobox.h Include File
- QComboBox Member List
- QComboTableItem类
- QComboTableItem成员列表
- QCommonStyle Class
- qcommonstyle.h Include File
- QCommonStyle Member List
- QConstString Class
- QConstString Member List
- QContextMenuEvent Class
- QContextMenuEvent Member List
- QCopChannel Class
- qcopchannel_qws.h Include File
- QCopChannel Member List
- QCString类
- qcstring.h包含文件
- QCString成员列表
- QCursor Class
- qcursor.h Include File
- QCursor Member List
- QCustomEvent Class
- QCustomEvent Member List
- QCustomMenuItem Class
- QCustomMenuItem Member List
- QDataBrowser Class
- qdatabrowser.h Include File
- QDataBrowser Member List
- QDataPump Class
- QDataPump Member List
- QDataSink Class
- QDataSource Class
- QDataSource Member List
- QDataStream类
- qdatastream.h包含文件
- QDataStream成员列表
- QDataTable Class
- qdatatable.h Include File
- QDataTable Member List
- QDataView Class
- qdataview.h Include File
- QDataView Member List
- QDate类
- QDateEdit Class
- QDateEdit Member List
- QDate成员列表
- QDateTime类
- QDateTimeEdit Class
- qdatetimeedit.h Include File
- QDateTimeEdit Member List
- qdatetime.h包含文件
- QDateTime成员列表
- QDesktopWidget Class
- qdesktopwidget.h Include File
- QDesktopWidget Member List
- QDial Class
- qdial.h Include File
- QDial Member List
- QDialog类
- qdialog.h包含文件
- QDialog成员列表
- QDict Class
- qdict.h Include File
- QDictIterator Class
- QDictIterator Member List
- QDict Member List
- QDir类
- QDirectPainter Class
- qdirectpainter_qws.h Include File
- QDirectPainter Member List
- QDir
- qdir.h包含文件
- QDir成员列表
- QDns Class
- qdns.h Include File
- QDns Member List
- QDockArea类
- qdockarea.h包含文件
- QDockArea成员列表
- QDockWindow类
- qdockwindow.h包含文件
- QDockWindow成员列表
- QDomAttr Class
- QDomAttr Member List
- QDomCDATASection Class
- QDomCDATASection Member List
- QDomCharacterData Class
- QDomCharacterData Member List
- QDomComment Class
- QDomComment Member List
- QDomDocument Class
- QDomDocumentFragment Class
- QDomDocumentFragment Member List
- QDomDocument Member List
- QDomDocumentType Class
- QDomDocumentType Member List
- QDomElement Class
- QDomElement Member List
- QDomEntity Class
- QDomEntity Member List
- QDomEntityReference Class
- QDomEntityReference Member List
- qdom.h Include File
- QDomImplementation Class
- QDomImplementation Member List
- QDomNamedNodeMap Class
- QDomNamedNodeMap Member List
- QDomNode Class
- QDomNodeList Class
- QDomNodeList Member List
- QDomNode Member List
- QDomNotation Class
- QDomNotation Member List
- QDomProcessingInstruction Class
- QDomProcessingInstruction Member List
- QDomText Class
- QDomText Member List
- QDoubleValidator类
- QDoubleValidator成员列表
- QDragEnterEvent Class
- QDragEnterEvent Member List
- QDragLeaveEvent Class
- QDragLeaveEvent Member List
- QDragMoveEvent Class
- QDragMoveEvent Member List
- QDragObject Class
- qdragobject.h Include File
- QDragObject Member List
- qdrawutil.h Include File
- QDropEvent Class
- QDropEvent Member List
- QDropSite Class
- qdropsite.h Include File
- QEditorFactory Class
- qeditorfactory.h Include File
- QEditorFactory Member List
- QEmbed - File and Image Embedder
- QErrorMessage类
- qerrormessage.h包含文件
- QErrorMessage成员列表
- QEucJpCodec Class
- qeucjpcodec.h Include File
- QEucJpCodec Member List
- QEucKrCodec Class
- qeuckrcodec.h Include File
- QEucKrCodec Member List
- QEvent类
- qevent.h包含文件
- QEvent成员列表
- Font Displayer
- QFile类
- QFileDialog类
- qfiledialog.h包含文件
- QFileDialog成员列表
- qfile.h包含文件
- QFileIconProvider Class
- QFileIconProvider Member List
- QFileInfo Class
- qfileinfo.h Include File
- QFileInfo Member List
- QFile成员列表
- QFilePreview Class
- QFilePreview Member List
- QFocusData Class
- qfocusdata.h Include File
- QFocusData Member List
- QFocusEvent Class
- QFocusEvent Member List
- QFont Class
- QFontDatabase Class
- qfontdatabase.h Include File
- QFontDatabase Member List
- QFontDialog类
- qfontdialog.h包含文件
- QFontDialog成员列表
- QFont Examples
- qfont.h Include File
- QFontInfo Class
- qfontinfo.h Include File
- QFontInfo Member List
- QFontManager Class
- qfontmanager_qws.h Include File
- QFontManager Member List
- QFont Member List
- QFontMetrics Class
- qfontmetrics.h Include File
- QFontMetrics Member List
- QFrame类
- qframe.h包含文件
- QFrame成员列表
- QFtp类
- qftp.h包含文件
- QFtp成员列表
- QGb18030Codec Class
- qgb18030codec.h Include File
- QGb18030Codec Member List
- QGbkCodec Class
- QGbkCodec Member List
- qgfx_qws.h Include File
- QGL Class
- QGLayoutIterator Class
- QGLayoutIterator Member List
- QGLColormap Class
- qglcolormap.h Include File
- QGLColormap Member List
- QGLContext Class
- QGLContext Member List
- QGLFormat Class
- QGLFormat Member List
- qgl.h Include File
- QGL Member List
- qglobal.h Include File
- QGLWidget Class
- QGLWidget Member List
- QGrid类
- qgrid.h包含文件
- QGridLayout Class
- QGridLayout Member List
- QGrid成员列表
- QGridView Class
- qgridview.h Include File
- QGridView Member List
- QGroupBox类
- qgroupbox.h包含文件
- QGroupBox成员列表
- QGuardedPtr类
- qguardedptr.h包含文件
- QGuardedPtr成员列表
- QHBox Class
- qhbox.h Include File
- QHBoxLayout Class
- QHBoxLayout Member List
- QHBox Member List
- QHButtonGroup类
- qhbuttongroup.h包含文件
- QHButtonGroup成员列表
- QHeader类
- qheader.h包含文件
- QHeader成员列表
- QHebrewCodec Class
- QHebrewCodec Member List
- QHGroupBox类
- qhgroupbox.h包含文件
- QHGroupBox成员列表
- QHideEvent Class
- QHideEvent Member List
- QHostAddress Class
- qhostaddress.h Include File
- QHostAddress Member List
- QHttp Class
- qhttp.h Include File
- QHttp Member List
- QIconDrag Class
- QIconDragItem Class
- QIconDragItem Member List
- QIconDrag Member List
- QIconSet Class
- qiconset.h Include File
- QIconSet Member List
- QIconView Class
- qiconview.h Include File
- QIconViewItem Class
- QIconViewItem Member List
- QIconView Member List
- QImage Class
- QImageConsumer Class
- QImageConsumer Member List
- QImageDecoder Class
- QImageDecoder Member List
- QImageDrag Class
- QImageDrag Member List
- QImageFormat Class
- QImageFormat Member List
- QImageFormatPlugin Class
- qimageformatplugin.h Include File
- QImageFormatPlugin Member List
- QImageFormatType Class
- QImageFormatType Member List
- qimage.h Include File
- QImageIO Class
- QImageIO Member List
- QImage Member List
- QIMEvent Class
- QIMEvent Member List
- QInputDialog类
- qinputdialog.h包含文件
- QInputDialog成员列表
- QIntCache Class
- qintcache.h Include File
- QIntCacheIterator Class
- QIntCacheIterator Member List
- QIntCache Member List
- QIntDict Class
- qintdict.h Include File
- QIntDictIterator Class
- QIntDictIterator Member List
- QIntDict Member List
- QIntValidator类
- QIntValidator成员列表
- QIODevice类
- qiodevice.h包含文件
- QIODevice成员列表
- QIODeviceSource Class
- QJisCodec Class
- qjiscodec.h Include File
- QJisCodec Member List
- qkeyboard_qws.h Include File
- QKeyEvent Class
- QKeyEvent Member List
- QKeySequence Class
- qkeysequence.h Include File
- QKeySequence Member List
- QLabel Class
- qlabel.h Include File
- QLabel Member List
- QLayout Class
- qlayout.h Include File
- QLayoutItem Class
- QLayoutItem Member List
- QLayoutIterator Class
- QLayoutIterator Member List
- QLayout Member List
- QLCDNumber Class
- qlcdnumber.h Include File
- QLCDNumber Member List
- QLibrary Class
- qlibrary.h Include File
- QLibrary Member List
- QLineEdit Class
- qlineedit.h Include File
- QLineEdit Member List
- QListBox Class
- qlistbox.h Include File
- QListBoxItem Class
- QListBoxItem Member List
- QListBox Member List
- QListBoxPixmap Class
- QListBoxPixmap Member List
- QListBoxText Class
- QListBoxText Member List
- QListView Class
- qlistview.h Include File
- QListViewItem Class
- QListViewItemIterator Class
- QListViewItemIterator Member List
- QListViewItem Member List
- QListView Member List
- QLocalFs Class
- qlocalfs.h Include File
- QLocalFs Member List
- QLock Class
- qlock_qws.h Include File
- QLock Member List
- QMag
- QMainWindow类
- qmainwindow.h包含文件
- QMainWindow成员列表
- qmake的介绍
- 安装qmake
- 10分钟学会使用qmake
- qmake教程
- qmake概念
- qmake高级概念
- qmake Command Reference
- QMap Class
- QMapConstIterator Class
- QMapConstIterator Member List
- qmap.h Include File
- QMapIterator Class
- QMapIterator Member List
- QMap Member List
- QMemArray类
- qmemarray.h包含文件
- QMemArray成员列表
- QMenuBar Class
- qmenubar.h Include File
- QMenuBar Member List
- QMenuData Class
- qmenudata.h Include File
- QMenuData Member List
- QMessageBox类
- qmessagebox.h包含文件
- QMessageBox成员列表
- QMetaObject Class
- qmetaobject.h Include File
- QMetaObject Member List
- QMetaProperty Class
- QMetaProperty Member List
- qmime.h Include File
- QMimeSource Class
- QMimeSourceFactory Class
- QMimeSourceFactory Member List
- QMimeSource Member List
- QMotifPlusStyle Class
- qmotifplusstyle.h Include File
- QMotifPlusStyle Member List
- QMotifStyle Class
- qmotifstyle.h Include File
- QMotifStyle Member List
- QMouseEvent Class
- QMouseEvent Member List
- QMoveEvent Class
- QMoveEvent Member List
- QMovie Class
- qmovie.h Include File
- QMovie Member List
- QMultiLineEdit Class
- qmultilineedit.h Include File
- QMultiLineEdit Member List
- QMutex类
- qmutex.h包含文件
- QMutex成员列表
- qnamespace.h Include File
- qnetwork.h Example File
- QNetworkOperation Class
- QNetworkOperation Member List
- QNetworkProtocol Class
- qnetworkprotocol.h Include File
- QNetworkProtocol Member List
- qnp.h Include File
- QNPInstance Class
- QNPInstance Member List
- QNPlugin Class
- QNPlugin Member List
- QNPStream Class
- QNPStream Member List
- QNPWidget Class
- QNPWidget Member List
- QObject类
- QObjectCleanupHandler Class
- qobjectcleanuphandler.h Include File
- QObjectCleanupHandler Member List
- qobject.h包含文件
- QObjectList类
- qobjectlist.h包含文件
- QObjectListIt类
- QObjectListIt成员列表
- QObjectList成员列表
- QObject成员列表
- QPaintDevice类
- qpaintdevice.h包含文件
- QPaintDevice成员列表
- QPaintDeviceMetrics Class
- qpaintdevicemetrics.h Include File
- QPaintDeviceMetrics Member List
- QPainter类
- qpainter.h包含文件
- QPainter成员列表
- QPaintEvent Class
- QPaintEvent Member List
- QPair Class
- qpair.h Include File
- QPair Member List
- QPalette Class
- qpalette.h Include File
- QPalette Member List
- QPen Class
- qpen.h Include File
- QPen Member List
- QPicture Class
- qpicture.h Include File
- QPicture Member List
- QPixmap Class
- QPixmapCache Class
- qpixmapcache.h Include File
- QPixmapCache Member List
- qpixmap.h Include File
- QPixmap Member List
- QPlatinumStyle Class
- qplatinumstyle.h Include File
- QPlatinumStyle Member List
- QPNGImagePacker Class
- QPNGImagePacker Member List
- qpngio.h Include File
- QPoint类
- QPointArray Class
- qpointarray.h Include File
- QPointArray Member List
- qpoint.h包含文件
- QPoint成员列表
- QPopupMenu Class
- qpopupmenu.h Include File
- QPopupMenu Member List
- QPrinter Class
- qprinter.h Include File
- QPrinter Member List
- QProcess Class
- QProcess Examples
- qprocess.h Include File
- QProcess Member List
- QProgressBar Class
- qprogressbar.h Include File
- QProgressBar Member List
- QProgressDialog类
- qprogressdialog.h包含文件
- QProgressDialog成员列表
- QPtrCollection类
- qptrcollection.h包含文件
- QPtrCollection成员列表
- QPtrDict Class
- qptrdict.h Include File
- QPtrDictIterator Class
- QPtrDictIterator Member List
- QPtrDict Member List
- QPtrList类
- qptrlist.h包含文件
- QPtrListIterator类
- QPtrListIterator成员列表
- QPtrList成员列表
- QPtrQueue类
- qptrqueue.h包含文件
- QPtrQueue成员列表
- QPtrStack类
- qptrstack.h包含文件
- QPtrStack成员列表
- QPtrVector类
- qptrvector.h包含文件
- QPtrVector成员列表
- QPushButton类
- qpushbutton.h包含文件
- QPushButton成员列表
- QRadioButton Class
- qradiobutton.h Include File
- QRadioButton Member List
- QRangeControl类
- qrangecontrol.h包含文件
- QRangeControld成员列表
- QRect类
- qrect.h包含文件
- QRect成员列表
- QRegExp Class
- qregexp.h Include File
- QRegExp Member List
- QRegExpValidator Class
- QRegExpValidator Member List
- QRegion Class
- qregion.h Include File
- QRegion Member List
- QResizeEvent Class
- QResizeEvent Member List
- qrtlcodec.h Include File
- QScreen Class
- QScreen Member List
- QScrollBar类
- qscrollbar.h包含文件
- QScrollBar成员列表
- QScrollView类
- qscrollview.h包含文件
- QScrollView成员列表
- QSemaphore类
- qsemaphore.h包含文件
- QSemaphore成员列表
- QServerSocket Class
- qserversocket.h Include File
- QServerSocket Member List
- QSessionManager Class
- qsessionmanager.h Include File
- QSessionManager Member List
- QSettings Class
- qsettings.h Include File
- QSettings Member List
- QSGIStyle Class
- qsgistyle.h Include File
- QSGIStyle Member List
- QShowEvent Class
- QShowEvent Member List
- QSignal Class
- qsignal.h Include File
- QSignalMapper Class
- qsignalmapper.h Include File
- QSignalMapper Member List
- QSignal Member List
- QSimpleRichText Class
- qsimplerichtext.h Include File
- QSimpleRichText Member List
- QSize类
- QSizeGrip Class
- qsizegrip.h Include File
- QSizeGrip Member List
- qsize.h包含文件
- QSize成员列表
- QSizePolicy Class
- qsizepolicy.h Include File
- QSizePolicy Member List
- QSjisCodec Class
- qsjiscodec.h Include File
- QSjisCodec Member List
- QSlider Class
- qslider.h Include File
- QSlider Member List
- QSocket类
- QSocketDevice Class
- qsocketdevice.h Include File
- QSocketDevice Member List
- qsocket.h包含文件
- QSocket成员列表
- QSocketNotifier Class
- qsocketnotifier.h Include File
- QSocketNotifier Member List
- QSortedList Class
- qsortedlist.h Include File
- QSortedList Member List
- QSound类
- qsound.h包含文件
- QSound成员列表
- QSpacerItem Class
- QSpacerItem Member List
- QSpinBox Class
- qspinbox.h Include File
- QSpinBox Member List
- QSplitter Class
- qsplitter.h Include File
- QSplitter Member List
- QSql类
- QSqlCursor Class
- qsqlcursor.h Include File
- QSqlCursor Member List
- QSqlDatabase Class
- qsqldatabase.h Include File
- QSqlDatabase Member List
- QSqlDriver Class
- qsqldriver.h Include File
- QSqlDriver Member List
- QSqlDriverPlugin Class
- qsqldriverplugin.h Include File
- QSqlDriverPlugin Member List
- QSqlEditorFactory Class
- qsqleditorfactory.h Include File
- QSqlEditorFactory Member List
- QSqlError Class
- qsqlerror.h Include File
- QSqlError Member List
- QSqlField Class
- qsqlfield.h Include File
- QSqlFieldInfo Class
- QSqlFieldInfo Member List
- QSqlField Member List
- QSqlForm Class
- qsqlform.h Include File
- QSqlForm Member List
- qsql.h包含文件
- QSqlIndex Class
- qsqlindex.h Include File
- QSqlIndex Member List
- QSql成员列表
- QSqlPropertyMap Class
- qsqlpropertymap.h Include File
- QSqlPropertyMap Member List
- QSqlQuery类
- qsqlquery.h 包含文件
- QSqlQuery成员列表
- QSqlRecord Class
- qsqlrecord.h Include File
- QSqlRecordInfo Class
- QSqlRecordInfo Member List
- QSqlRecord Member List
- QSqlResult Class
- qsqlresult.h Include File
- QSqlResult Member List
- QStatusBar类
- qstatusbar.h包含文件
- QStatusBar成员列表
- QStoredDrag Class
- QStoredDrag Member List
- QStrIList Class
- QStrIList Member List
- QString类
- qstring.h包含文件
- QStringList Class
- qstringlist.h Include File
- QStringList Member List
- QString成员列表
- QStrList Class
- qstrlist.h Include File
- QStrListIterator Class
- QStrListIterator Member List
- QStrList Member List
- QStyle Class
- QStyleFactory Class
- qstylefactory.h Include File
- QStyleFactory Member List
- qstyle.h Include File
- QStyle Member List
- QStyleOption Class
- QStyleOption Member List
- QStylePlugin Class
- qstyleplugin.h Include File
- QStylePlugin Member List
- QStyleSheet Class
- qstylesheet.h Include File
- QStyleSheetItem Class
- QStyleSheetItem Member List
- QStyleSheet Member List
- Qt类
- QTab Class
- QTabBar Class
- qtabbar.h Include File
- QTabBar Member List
- QTabDialog类
- qtabdialog.h包含文件
- QTabDialog成员列表
- QTable类
- qtable.h包含文件
- QTableItem类
- QTableItem成员列表
- QTable成员列表
- QTableSelection类
- QTableSelection成员列表
- QTabletEvent Class
- QTabletEvent Member List
- QTab Member List
- QTabWidget Class
- qtabwidget.h Include File
- QTabWidget Member List
- QTextBrowser Class
- qtextbrowser.h Include File
- QTextBrowser Member List
- QTextCodec Class
- qtextcodec.h Include File
- QTextCodec Member List
- QTextCodecPlugin Class
- qtextcodecplugin.h Include File
- QTextCodecPlugin Member List
- QTextDecoder Class
- QTextDecoder Member List
- QTextDrag Class
- QTextDrag Member List
- QTextEdit类
- qtextedit.h包含文件
- QTextEdit成员列表
- QTextEncoder Class
- QTextEncoder Member List
- QTextIStream类
- QTextIStream成员列表
- QTextOStream类
- QTextOStream成员列表
- QTextStream类
- qtextstream.h包含文件
- QTextStream成员列表
- QTextView Class
- qtextview.h Include File
- QTextView Member List
- QThread类
- qthread.h包含文件
- QThread成员列表
- Display Images in Qt-supported Formats
- QTime类
- QTimeEdit Class
- QTimeEdit Member List
- QTime成员列表
- QTimer类
- QTimerEvent类
- QTimerEvent成员列表
- qtimer.h包含文件
- QTimer成员列表
- Qt模板库类
- Qt Member List
- QtMultiLineEdit Class
- qtmultilineedit.h Include File
- QtMultiLineEdit Member List
- QToolBar类
- qtoolbar.h包含文件
- QToolBar成员列表
- QToolButton类
- qtoolbutton.h包含文件
- QToolButton成员列表
- QToolTip Class
- QToolTipGroup Class
- QToolTipGroup Member List
- qtooltip.h Include File
- QToolTip Member List
- QTranslator Class
- qtranslator.h Include File
- QTranslator Member List
- QTranslatorMessage Class
- QTranslatorMessage Member List
- QTsciiCodec Class
- qtsciicodec.h Include File
- QTsciiCodec Member List
- QtTableView Class
- qttableview.h Include File
- QtTableView Member List
- Qt模板库
- QUriDrag Class
- QUriDrag Member List
- QUrl Class
- qurl.h Include File
- QUrlInfo Class
- qurlinfo.h Include File
- QUrlInfo Member List
- QUrl Member List
- QUrlOperator Class
- qurloperator.h Include File
- QUrlOperator Member List
- QValidator类
- qvalidator.h包含文件
- QValidator成员列表
- QVariant Class
- qvariant.h Include File
- QVariant Member List
- QVBox Class
- qvbox.h Include File
- QVBoxLayout Class
- QVBoxLayout Member List
- QVBox Member List
- QVButtonGroup类
- qvbuttongroup.h包含文件
- QVButtonGroup成员列表
- QVGroupBox类
- qvgroupbox.h包含文件
- QVGroupBox成员列表
- QWaitCondition类
- qwaitcondition.h包含文件
- QWaitCondition成员列表
- Simple HTML Browser
- QWhatsThis类
- qwhatsthis.h包含文件
- QWhatsThis成员列表
- QWheelEvent Class
- QWheelEvent Member List
- QWidget类
- QWidgetFactory Class
- qwidgetfactory.h Include File
- QWidgetFactory Member List
- qwidget.h包含文件
- QWidgetItem Class
- QWidgetItem Member List
- QWidget成员列表
- QWidgetPlugin Class
- qwidgetplugin.h Include File
- QWidgetPlugin Member List
- QWidgetStack类
- qwidgetstack.h包含文件
- QWidgetStack成员列表
- qwindowdefs.h Include File
- QWindowsMime Class
- QWindowsMime Member List
- QWindowsStyle Class
- qwindowsstyle.h Include File
- QWindowsStyle Member List
- qwindowsystem_qws.h Include File
- QWizard类
- qwizard.h包含文件
- QWizard成员列表
- QWMatrix Class
- qwmatrix.h Include File
- QWMatrix Member List
- QWorkspace类
- qworkspace.h包含文件
- QWorkspace成员列表
- Qt/Embedded
- QWSDecoration Class
- qwsdecoration_qws.h Include File
- QWSDecoration Member List
- QWSKeyboardHandler Class
- QWSKeyboardHandler Member List
- qwsmouse_qws.h Include File
- QWSMouseHandler Class
- QWSMouseHandler Member List
- QWSServer Class
- QWSServer Member List
- QWSWindow Class
- QWSWindow Member List
- QXmlAttributes Class
- QXmlAttributes Member List
- QXmlContentHandler Class
- QXmlContentHandler Member List
- QXmlDeclHandler Class
- QXmlDeclHandler Member List
- QXmlDefaultHandler Class
- QXmlDefaultHandler Member List
- QXmlDTDHandler Class
- QXmlDTDHandler Member List
- QXmlEntityResolver Class
- QXmlEntityResolver Member List
- QXmlErrorHandler Class
- QXmlErrorHandler Member List
- qxml.h Include File
- QXmlInputSource Class
- QXmlInputSource Member List
- QXmlLexicalHandler Class
- QXmlLexicalHandler Member List
- QXmlLocator Class
- QXmlLocator Member List
- QXmlNamespaceSupport Class
- QXmlNamespaceSupport Member List
- QXmlParseException Class
- QXmlParseException Member List
- QXmlReader Class
- QXmlSimpleReader Class
- QXmlSimpleReader Member List
- QXtApplication Class
- QXtApplication Member List
- qxt.h Include File
- QXtWidget Class
- QXtWidget Member List
- Range controls
- Richtext
- Rot13
- Simple Painting Application
- Qt的文本引擎
- Scrollview
- Session Management
- Implicitly and Explicitly Shared Classes
- Shared Classes
- Show Image
- Drag and Drop (Simple)
- Walkthrough: A Simple Application
- Walkthrough: A Simple Application with Actions
- A Complete Application Window
- A simple demonstration of QFont member functions
- Walkthrough: A simple QFont demonstration
- 小表格样例
- Sound Example
- Splitter
- SQL Module - Drivers
- Qt SQL Examples
- sql/overview/basicbrowsing2/main.cpp Example File
- sql/overview/basicbrowsing/main.cpp Example File
- sql/overview/basicdatamanip/main.cpp Example File
- sql/overview/connect1/main.cpp Example File
- sql/overview/create_connections/main.cpp Example File
- sql/overview/custom1/main.cpp Example File
- sql/overview/custom1/main.h Example File
- sql/overview/del/main.cpp Example File
- sql/overview/extract/main.cpp Example File
- sql/overview/form1/main.cpp Example File
- sql/overview/form2/main.h Example File
- sql/overview/insert/main.cpp Example File
- sql/overview/navigating/main.cpp Example File
- sql/overview/order1/main.cpp Example File
- sql/overview/order2/main.cpp Example File
- sql/overview/retrieve1/main.cpp Example File
- sql/overview/retrieve2/main.cpp Example File
- sql/overview/subclass1/main.cpp Example File
- sql/overview/subclass2/main.cpp Example File
- sql/overview/subclass2/main.h Example File
- sql/overview/subclass3/main.cpp Example File
- sql/overview/subclass3/main.h Example File
- sql/overview/subclass4/main.cpp Example File
- sql/overview/subclass4/main.h Example File
- sql/overview/subclass5/main.cpp Example File
- sql/overview/subclass5/main.h Example File
- sql/overview/table1/main.cpp Example File
- sql/overview/table2/main.cpp Example File
- sql/overview/table3/main.cpp Example File
- sql/overview/table3/main.h Example File
- sql/overview/table4/main.cpp Example File
- sql/overview/table4/main.h Example File
- sql/overview/update/main.cpp Example File
- SQL Table
- 表格样例
- t10/cannon.cpp Example File
- t10/cannon.h Example File
- t10/lcdrange.cpp Example File
- t10/lcdrange.h Example File
- t10/main.cpp Example File
- t11/cannon.cpp Example File
- t11/cannon.h Example File
- t11/lcdrange.cpp Example File
- t11/lcdrange.h Example File
- t11/main.cpp Example File
- t12/cannon.cpp Example File
- t12/cannon.h Example File
- t12/lcdrange.cpp Example File
- t12/lcdrange.h Example File
- t12/main.cpp Example File
- t13/cannon.cpp Example File
- t13/cannon.h Example File
- t13/gamebrd.cpp Example File
- t13/gamebrd.h Example File
- t13/lcdrange.cpp Example File
- t13/lcdrange.h Example File
- t13/main.cpp Example File
- t14/cannon.cpp Example File
- t14/cannon.h Example File
- t14/gamebrd.cpp Example File
- t14/gamebrd.h Example File
- t14/lcdrange.cpp Example File
- t14/lcdrange.h Example File
- t14/main.cpp Example File
- t7/lcdrange.cpp Example File
- t7/lcdrange.h Example File
- t7/main.cpp Example File
- t8/cannon.cpp Example File
- t8/cannon.h Example File
- t8/lcdrange.cpp Example File
- t8/lcdrange.h Example File
- t8/main.cpp Example File
- t9/cannon.cpp Example File
- t9/cannon.h Example File
- t9/lcdrange.cpp Example File
- t9/lcdrange.h Example File
- t9/main.cpp Example File
- Tabdialog
- table/bigtable/main.cpp Example File
- 表格例程
- Tablet Example
- A tiny SAX2 parser
- Demonstration of SAX2 features
- 为什么Qt不用模板来实现信号和槽?
- Tetrix
- Text Related Classes
- Text Edit Example
- Themes (Styles)
- 线程
- Tic Tac Toe
- 时间和日期
- 定时器
- A Tiny Example Featuring a Toggle Action
- Non-GUI Classes
- Advanced use of tool tips
- Trivial Example
- Qt教程一 —— 第一章:Hello, World!
- Qt教程一 —— 第二章:调用退出
- Qt教程一 —— 第三章:家庭价值
- Qt教程一 —— 第四章:使用窗口部件
- Qt教程一 —— 第五章:组装积木
- Qt教程一 —— 第六章:组装丰富的积木!
- Qt教程一 —— 第七章:一个事物领导另一个
- Qt教程一 —— 第八章:准备战斗
- Qt教程一 —— 第九章:你可以使用加农炮了
- Qt教程一 —— 第十章:像丝一样滑
- Qt教程一 —— 第十一章:给它一个炮弹
- Qt教程一 —— 第十一章:悬在空中的砖
- Qt教程一 —— 第十三章:游戏结束
- Qt教程一 —— 第十四章:面对墙壁
- 介绍
- 大图片
- 数据元素
- 主体很容易
- 实现图形用户界面
- 画布控制
- 文件处理
- 获得数据
- 设置选项
- 项目文件
- 完成
- User Interface Compiler (uic)
- 关于Unicode
- Widgets Example
- Wizard
- wizard/wizard.cpp Example File
- wizard/wizard.h Example File
- Transformed Graphics Demo
- Qt XML Examples
- Walkthrough: Using SAX2 features with the Qt XML classes
- Walkthrough: How to use the Qt SAX2 classes
- XML
- Qt Xt/Motif Support Extension
- 适应2000年问题声明
Programmers
Support for multiple languages is extremely simple in Qt applications and adds little overhead to the programmer's workload.
Qt minimizes the performance cost of using translations by translating the phrases for each window as they are created. In most applications the main window is created just once. Dialogs are often created once and then shown and hidden as required. Once the initial translation has taken place there is no further runtime overhead for the translated windows. Only those windows that are created, destroyed and subsequently created will have a translation performance cost -- although the overhead is still very low.
Creating applications that can switch language at runtime is possible with Qt, but requires a certain amount of programmer intervention and will of course incur some runtime performance cost.
Making the Application Translation Aware
Programmers should make their application look for and load the appropriate translation file and mark user-visible text and Ctrl keyboard accelerators as targets for translation.
Each piece of text that requires translating requires context to help the translator identify where in the program the text occurs. In the case of multiple identical texts that require different translations the translator also requires some information to disambiguate the source texts. Marking text for translation will automatically cause the class name to be used as basic context information. In some cases the programmer may be required to add additional information to help the translator.
Creating Translation Files
Translation files consist of all the user-visible text and Ctrl key accelerators in an application and translations of that text. Translation files are created as follows:
Run lupdate initially to generate the first set of .ts translation source files with all the user-visible text but no translations.
The .ts files are given to the translator who adds translations using Qt Linguist. Qt Linguist takes care of any changed or deleted source text.
Run lupdate to incorporate any new text added to the application. lupdate synchronizes the user-visible text from the application with the translations; it does not destroy any data.
Steps 2 and 3 are repeated as often as necessary.
When a release of the application is needed lrelease is run to read the .ts files and produce the .qm files used by the application at runtime.
For lupdate to work successfully, it must know which translation files to produce. The files are simply listed in the application's .pro Qt project file, for example:
TRANSLATIONS = tt2_fr.ts \ tt2_nl.ts
See the "lupdate" and "lrelease" sections.
Loading Translations
int main( int argc, char **argv ) { QApplication app( argc, argv );
This is how a simple main() function of a Qt application begins.
int main( int argc, char **argv ) { QApplication app( argc, argv ); QTranslator translator( 0 ); translator.load( "tt1_la", "." ); app.installTranslator( &translator );
For a translation-aware application a translator object is created, a translation is loaded and the translator object installed into the application.
int main( int argc, char **argv ) { QApplication app( argc, argv ); QTranslator translator( 0 ); translator.load( QString( "tt2_" ) + QTextCodec::locale(), "." ); app.installTranslator( &translator );
In production applications a more flexible approach, for example, loading translations according to locale, might be more appropriate. If the .ts files are all named according to a convention such as appname_locale, e.g. tt2_fr, tt2_de etc, then the code above will load the current locale's translation at runtime.
If there is no translation file for the current locale the application will fall back to using the original source text.
Making the Application Translate User-Visible Strings
User-visible strings are marked as translation targets by wrapping them in a tr() call, for example:
button = new QPushButton( "&Quit", this );
would become
button = new QPushButton( tr( "&Quit" ), this);
All QObject subclasses that use the Q_OBJECT macro have a reimplementation of the tr() function.
Although the tr() call is normally made directly since it is usually called as a member function of a QObject subclass, in other cases an explicit class name can be supplied, for example:
QPushButton::tr( "&Quit" )
or
QObject::tr( "&Quit" )
Distinguishing Identical Strings That Require Different Translations
The lupdate program automatically provides a context for every source text. This context is the class name of the class that contains the tr() call. This is sufficient in the vast majority of cases. Sometimes however, the translator will need further information to uniquely identify a source text; for example, a dialog that contained two separate frames, each of which contained an "Enabled" option would need each identified because in some languages the translation would differ between the two. This is easily achieved using the two argument form of the tr() call, e.g.
rbc = new QRadioButton( tr( "Enabled", "Color frame" ), this);
and
rbh = new QRadioButton( tr( "Enabled", "Hue frame" ), this);
Ctrl key accelerators are also translatable:
file->insertItem( tr( "E&xit" ), qApp, SLOT(quit()), QAccel::stringToKey( tr("Ctrl+Q", "Quit") ) );
It is strongly recommended that the two argument form of tr() is used for Ctrl key accelerators. The second argument is the only clue the translator has as to the function performed by the accelerator.
Helping The Translator With Navigation Information
In large complex applications it may be difficult for the translator to see where a particular source text comes from. This problem can be solved by adding a comment using the keyword TRANSLATOR which describes the navigation steps to reach the text in question; e.g.
/* TRANSLATOR FindDialog Choose Edit|Find from the menu bar or press Ctrl+F to pop up the Find dialog. */
These comments are particularly useful for widget classes.
Coping With C++ Namespaces
C++ namespaces and the using namespace statement can confuse lupdate. It will interpret MyClass::tr() as meaning just that, not as MyNamespace::MyClass::tr(), even if MyClass is defined in the MyNamespace namespace. Run-time translation of these strings will fail because of that.
You can work around this limitation by putting a TRANSLATOR comment at the beginning of the source files that use MyClass::tr():
/* TRANSLATOR MyNamespace::MyClass */
After the comment, all references to MyClass::tr() will be understood as meaning MyNamespace::MyClass::tr().
Translating Text that is Outside of a QObject subclass
Using QApplication::translate()
If the quoted text is not in a member function of a QObject subclass, use either the tr() function of an appropriate class, or the QApplication::translate() function directly:
void some_global_function( LoginWidget *logwid ) { QLabel *label = new QLabel( LoginWidget::tr("Password:"), logwid ); } void same_global_function( LoginWidget *logwid ) { QLabel *label = new QLabel( qApp->translate("LoginWidget", "Password:"), logwid ); }
Using QT_TR_NOOP and QT_TRANSLATE_NOOP
If you need to have translatable text completely outside a function, there are two macros to help: QT_TR_NOOP() and QT_TRANSLATE_NOOP(). These macros merely mark the text for extraction by lupdate. The macros expand to just the text (without the context).
Example of QT_TR_NOOP():
QString FriendlyConversation::greeting( int greet_type ) { static const char* greeting_strings[] = { QT_TR_NOOP( "Hello" ), QT_TR_NOOP( "Goodbye" ) }; return tr( greeting_strings[greet_type] ); }
Example of QT_TRANSLATE_NOOP():
static const char* greeting_strings[] = { QT_TRANSLATE_NOOP( "FriendlyConversation", "Hello" ), QT_TRANSLATE_NOOP( "FriendlyConversation", "Goodbye" ) }; QString FriendlyConversation::greeting( int greet_type ) { return tr( greeting_strings[greet_type] ); } QString global_greeting( int greet_type ) { return qApp->translate( "FriendlyConversation", greeting_strings[greet_type] ); }
Tutorials
Three tutorials are presented. The first demonstrates the creation of a QTranslator object. It also shows the simplest use of the tr() function to mark user-visible source text for translation. The second tutorial explains how to make the application load the translation file applicable to the current locale. It also shows the use of the two-argument form of tr() which provides additional information to the translator. The third tutorial explains how identical source texts can be distinguished even when they occur in the same context. This tutorial also discusses how the translation tools help minimize the translator's work when an application is upgraded.
Tutorial 1: Loading and Using Translations
Tutorial 1 Screenshot, English version
TEMPLATE = app CONFIG += qt warn_on SOURCES = main.cpp TRANSLATIONS = tt1_la.ts
tt1.pro
/**************************************************************** ** ** Translation tutorial 1 ** ****************************************************************/ #include <qapplication.h> #include <qpushbutton.h> #include <qtranslator.h> int main( int argc, char **argv ) { QApplication app( argc, argv ); QTranslator translator( 0 ); translator.load( "tt1_la", "." ); app.installTranslator( &translator ); QPushButton hello( QPushButton::tr( "Hello world!" ), 0 ); app.setMainWidget( &hello ); hello.show(); return app.exec(); }
main.cpp
This example is a reworking of the "hello-world" example from Tutorial #1, with a Latin translation. The Tutorial 1 Screenshot, English version, above, shows the English version.
Line by Line Walk-through
#include <qtranslator.h>
This line includes the definition of the QTranslator class. Objects of this class provide translations for user-visible text.
QTranslator translator( 0 );
Creates a QTranslator object without a parent.
translator.load( "tt1_la", "." );
Try to load a file called tt1_la.qm (the .qm file extension is implicit) that contains Latin translations for the source texts used in the program. No error will occur if the file is not found.
app.installTranslator( &translator );
Add the translations from tt1_la.qm to the pool of translations used by the program. No error will occur if the file is not found.
QPushButton hello( QPushButton::tr( "Hello world!" ), 0 );
Creates a push button that displays "Hello world!". If tt1_la.qm was found and contains a translation for "Hello world!", the translation appears; if not, the source text appears.
All classes that inherit QObject have a tr() function. Inside a member function of a QObject class, we simply write tr("Hello world!") instead of QPushButton::tr("Hello world!") or QObject::tr("Hello world!").
Running the Application in English
Since we haven't made the translation file tt1_la.qm, the source text is shown when we run the application:
Tutorial 1 Screenshot, English version
Creating a Latin Message File
The first step is to create a project file, tt1.pro, that lists all the source files for the project. The project file can be a qmake project file, or even an ordinary makefile. Any file that contains
SOURCES = main.cpp TRANSLATIONS = tt1_la.ts
will work. TRANSLATIONS specifies the message files we want to maintain. In this example, we just maintain one set of translations, namely Latin.
Note that the file extension is .ts, not .qm. The .ts translation source format is designed for use during the application's development. Programmers or release managers run the lupdate program to generate and update .ts files with the source text that is extracted from the source code. Translators read and update the .ts files using Qt Linguist adding and editing their translations.
The .ts format is human-readable XML that can be emailed directly and is easy to put under version control. If you edit this file manually, be aware that the default encoding for XML is UTF-8, not Latin-1 (ISO 8859-1). One way to type in a Latin-1 character such as 'ø' (Norwegian o with slash) is to use an XML entity: "ø". This will work for any Unicode character.
Once the translations are complete the lrelease program is used to convert the .ts files into the .qm Qt message file format. The .qm format is a compact binary format designed to deliver very fast lookup performance. Both lupdate and lrelease read all the project's source and header files (as specified in the HEADERS and SOURCES lines of the project file) and extract the strings that appear in tr() function calls.
lupdate is used to create and update the message files (tt1_la.ts in this case) to keep them in sync with the source code. It is safe to run lupdate at any time, as lupdate does not remove any information. For example, you can put it in the makefile, so the .ts files are updated whenever the source changes.
Try running lupdate right now, like this:
lupdate tt1.pro
You should now have a file tt1_la.ts in the current directory, containing this
<!DOCTYPE TS><TS> <context> <name>QPushButton</name> <message> <source>Hello world!</source> <translation type="unfinished"></translation> </message> </context> </TS>
You don't need to understand the file format since it is read and updated using tools, e.g. lupdate and Qt Linguist.
Translating to Latin with Qt Linguist
We will use Qt Linguist to provide the translation, although you can use any XML or plain text editor to enter a translation into a .ts file.
To start Qt Linguist, type
linguist tt1_la.ts
You should now see the text "QPushButton" in the top left pane. Double-click it, then click on "Hello world!" and enter "Orbis, te saluto!" in the Translation pane (the middle right of the window). Don't forget the exclamation mark!
Click the Done checkbox and choose File|Save from the menu bar. The .ts file will no longer contain
<translation type='unfinished'></translation>
but instead will have
<translation>Orbis, te saluto!</translation>
Running the Application in Latin
To see the application running in Latin, we have to generate a .qm file from the .ts file. Generating a .qm file can be achieved either from within Qt Linguist (for a single .ts file), or by using the command line program lrelease which will produce one .qm file for each of the .ts files listed in the project file. Generate tt1_la.qm from tt1_la.ts by choosing File|Release from Qt Linguist's menu bar and pressing Save in the file save dialog that pops up. Now run the tt1 example program again. This time the button will be labelled "Orbis, te saluto!".
Tutorial 1 Screenshot, Latin version
Tutorial 2: Using Two or More Languages
Tutorial 2 Screenshot, English version
TEMPLATE = app CONFIG += qt warn_on HEADERS = arrowpad.h \ mainwindow.h SOURCES = arrowpad.cpp \ main.cpp \ mainwindow.cpp TRANSLATIONS = tt2_fr.ts \ tt2_nl.ts
tt2.pro
This example is a slightly more involved and introduces a key Qt Linguist concept: "contexts".
arrowpad.h contains the definition of ArrowPad, a custom widget;
arrowpad.cpp contains the implementation of ArrowPad;
mainwindow.h contains the definition of MainWindow, a subclass of QMainWindow
mainwindow.cpp contains the implementation of MainWindow;
main.cpp contains main().
We will use two translations, French and Dutch, although there is no effective limit on the number of possible translations that can be used with an application. The relevant lines of tt2.pro are
HEADERS = arrowpad.h \ mainwindow.h SOURCES = arrowpad.cpp \ main.cpp \ mainwindow.cpp TRANSLATIONS = tt2_fr.ts \ tt2_nl.ts
Run lupdate; it should produce two identical message files tt2_fr.ts and tt2_nl.ts. These files will contain all the source texts marked for translation with tr() calls and their contexts.
Line by Line Walk-through
In arrowpad.h we define the ArrowPad subclass which is a subclass of QWidget. In the Tutorial 2 Screenshot, English version, above, the central widget with the four buttons is an ArrowPad.
class ArrowPad : public QGrid
When lupdate is run it not only extracts the source texts but it also groups them into contexts. A context is the name of the class in which the source text appears. Thus, in this example, "ArrowPad" is a context: it is the context of the texts in the ArrowPad class. The Q_OBJECT macro defines tr(x) in ArrowPad like this
qApp->translate( "ArrowPad", x )
Knowing which class each source text appears in enables Qt Linguist to group texts that are logically related together, e.g. all the text in a dialog will have the context of the dialog's class name and will be shown together. This provides useful information for the translator since the context in which text appears may influence how it should be translated. For some translations keyboard accelerators may need to be changed and having all the source texts in a particular context (class) grouped together makes it easier for the translator to perform any accelerator changes without introducing conflicts.
In arrowpad.cpp we implement the ArrowPad class.
(void) new QPushButton( tr( "&Up" ), this );
We call ArrowPad::tr() for each button's label since the labels are user-visible text.
Tutorial 2 Screenshot, English version
class MainWindow : public QMainWindow { Q_OBJECT
In the Tutorial 2 Screenshot, English version, above, the whole window is a MainWindow. This is defined in the mainwindow.h header file. Here too, we use Q_OBJECT, so that MainWindow will become a context in Qt Linguist.
In the implementation of MainWindow, mainwindow.cpp, we create an instance of our ArrowPad class
ArrowPad *ap = new ArrowPad( this, "arrow pad" );
We also call MainWindow::tr() twice, once for the menu item and once for the accelerator.
file->insertItem( tr( "E&xit" ), qApp, SLOT(quit()), QAccel::stringToKey( tr( "Ctrl+Q", "Quit" ) ) );
Note the use of QAccel::stringToKey() to support different keys in other languages. "Ctrl+Q" is a good choice for Quit in English, but a Dutch translator might want to use "Ctrl+A" (for Afsluiten) and a German translator "Strg+E" (for Beenden). When using tr() for Ctrl key accelerators the two argument form should be used with the second argument describing the function that the accelerator performs.
Our main() function is defined in main.cpp as usual.
QTranslator translator( 0 ); translator.load( QString( "tt2_" ) + QTextCodec::locale(), "." ); app.installTranslator( &translator );
We choose which translation to use according to the current locale. QTextCodec::locale() can be influenced by setting the LANG environment variable, for example. Notice that the use of a naming convention that incorporates the locale for .qm message files, (and .ts files), makes it easy to implement choosing the translation file according to locale.
If there is no .qm message file for the locale chosen the original source text will be used and no error raised.
Translating to French and Dutch
We'll begin by translating the example application into French. Start Qt Linguist with tt2_fr.ts. You should get the seven source texts ("&Up", "&Left", etc.) grouped in two contexts ("ArrowPad" and "MainWindow").
Now, enter the following translations:
ArrowPad
&Up - &Haut
&Left - &Gauche
&Right - &Droite
&Down - &Bas
MainWindow
E&xit - &Quitter
Ctrl+Q - Ctrl+Q
&File - &Fichier
It's quickest to press Alt+D (which clicks the Done & Next button) after typing each translation, since this marks the translation as done and moves on to the next source text.
Save the file and do the same for Dutch working with tt2_nl.ts:
ArrowPad
&Up - &Boven
&Left - &Links
&Right - &Rechts
&Down - &Onder
MainWindow
E&xit - &Afsluiten
Ctrl+Q - Ctrl+A
File - &Bestand
We have to convert the tt1_fr.ts and tt1_nl.ts translation source files into .qm files. We could use Qt Linguist as we've done before; however using the command line tool lrelease ensures that all the .qm files for the application are created without us having to remember to load and File|Release each one individually from Qt Linguist.
In practice we would include calls to lupdate and lrelease in the application's makefile to ensure that the latest translations are used.
Type
lrelease tt2.pro
This should create both tt2_fr.qm and tt2_nl.qm. Set the LANG environment variable to fr. In Unix, one of the two following commands should work
export LANG=fr setenv LANG fr
In Windows, either modify autoexec.bat or run
set LANG=fr
When you run the program, you should now see the French version:
Tutorial 2 Screenshot, French version
Try the same with Dutch, by setting LANG=nl. Now the Dutch version should appear:
Tutorial 2 Screenshot, Dutch version
Exercises
Mark one of the translations in Qt Linguist as not done, i.e. by unchecking the "done" checkbox; run lupdate, then lrelease, then the example. What effect did this change have?
Set LANG=fr_CA (French Canada) and run the example program again. Explain why the result is the same as with LANG=fr.
Change one of the accelerators in the Dutch translation to eliminate the conflict between &Bestand and &Boven.
Tutorial 3: Disambiguating Identical Strings
Tutorial 3 Screenshot, "Troll Print 1.0", English version
TEMPLATE = app CONFIG += qt warn_on HEADERS = mainwindow.h \ printpanel.h SOURCES = main.cpp \ mainwindow.cpp \ printpanel.cpp TRANSLATIONS = tt3_pt.ts
tt3.pro
We've included a translation file, tt3_pt.ts, which contains some Portuguese translations for this example.
We will consider two releases of the same application: Troll Print 1.0 and 1.1. We will learn to reuse the translations created for one release in a subsequent release. (In this tutorial, you have to edit some source files. It's probably best to copy all the files to a new temporary directory and work from there.)
Troll Print is a toy example application that lets the user choose printer settings. It comes in two versions: English and Portuguese.
Version 1.0 consists of these files:
printpanel.h contains the definition of PrintPanel;
printpanel.cpp contains the implementation of PrintPanel;
mainwindow.h contains the definition of MainWindow;
mainwindow.cpp contains the implementation of MainWindow;
main.cpp contains main();
tt3.pro is the qmake project file.
tt3_pt.ts is the Portuguese message file.
Line by Line Walk-through
The PrintPanel is defined in printpanel.h.
class PrintPanel : public QVBox { Q_OBJECT
PrintPanel is a QWidget. It needs the Q_OBJECT macro for tr() to work properly.
The implementation file is printpanel.cpp.
/* QLabel *lab = new QLabel( tr( "<b>TROLL PRINT</b>" ), this ); lab->setAlignment( AlignCenter ); */
Some of the code is commented out in Troll Print 1.0; you will uncomment it later, for Troll Print 1.1.
QHButtonGroup *twoSided = new QHButtonGroup( this ); twoSided->setTitle( tr( "2-sided" ) ); but = new QRadioButton( tr( "Enabled" ), twoSided ); but = new QRadioButton( tr( "Disabled" ), twoSided ); but->toggle(); QHButtonGroup *colors = new QHButtonGroup( this ); colors->setTitle( tr( "Colors" ) ); but = new QRadioButton( tr( "Enabled" ), colors ); but = new QRadioButton( tr( "Disabled" ), colors ); but->toggle();
Notice the two occurrences of tr("Enabled") and of tr("Disabled") in PrintPanel. Since both "Enabled"s and "Disabled"s appear in the same context Qt Linguist will only display one occurrence of each and will use the same translations for the duplicates that it doesn't display. Whilst this is a useful timesaver, in some languages, such as Portuguese, the second occurrence requires a separate translation. We will see how Qt Linguist can be made to display all the occurrences for separate translation shortly.
The header file for MainWindow, mainwindow.h, contains no surprises. In the implementation, mainwindow.cpp, we have some user-visible source texts that must be marked for translation.
setCaption( tr( "Troll Print 1.0" ) );
We must translate the window's caption.
file->insertItem( tr( "E&xit" ), qApp, SLOT(quit()), QAccel::stringToKey( tr("Ctrl+Q", "Quit") ) ); QPopupMenu *help = new QPopupMenu( this ); help->insertItem( tr( "&About" ), this, SLOT(about()), Key_F1 ); help->insertItem( tr( "About &Qt" ), this, SLOT(aboutQt()) ); menuBar()->insertItem( tr( "&File" ), file ); menuBar()->insertSeparator(); menuBar()->insertItem( tr( "&Help" ), help );
We also need to translate the menu items. Note that the two argument form of tr() is used for the keyboard accelerator, "Ctrl+Q", since the second argument is the only clue the translator has to indicate what function that accelerator will perform.
QTranslator translator( 0 ); translator.load( QString( "tt3_" ) + QTextCodec::locale(), "." ); app.installTranslator( &translator );
The main() function in main.cpp is the same as the one in Tutorial 2. In particular it chooses a translation file based on the current locale.
Running Troll Print 1.0 in English and in Portuguese
We will use the translations in the tt3_pt.ts file that is provided.
Set the LANG environment variable to pt, and then run tt3. You should still see the English version, as shown in the Tutorial 3 Screenshot, "Troll Print 1.0", English version, above. Now run lrelease, e.g. lrelease tt3.pro, and then run the example again. Now you should see the Portuguese edition (Troll Imprimir 1.0):
Tutorial 3 Screenshot, "Troll Imprimir 1.0", (Bad) Portuguese version
Whilst the translation has appeared correctly, it is in fact wrong. In good Portuguese, the second occurrence of "Enabled" should be "Ativadas", not "Ativado" and the ending for the second translation of "Disabled" must change similarly too.
If you open tt3_pt.ts using Qt Linguist, you will see that there is just one occurrence of "Enabled" and of "Disabled" in the translation source file, even though there are two of each in the source code. This is because Qt Linguist tries to minimize the translator's work by using the same translation for duplicate source texts. In cases such as this where an identical translation is wrong, the programmer must disambiguate the duplicate occurrences. This is easily achieved by using the two argument form of tr().
We can easily determine which file must be changed because the translator's "context" is in fact the class name for the class where the texts that must be changed appears. In this case the file is printpanel.cpp, where the there are four lines to change. Add the second argument "two-sided" in the appropriate tr() calls to the first pair of radio buttons:
but = new QRadioButton( tr("Enabled", "two-sided"), twoSided ); but = new QRadioButton( tr("Disabled", "two-sided"), twoSided );
and add the second argument "colors" in the appropriate tr() calls for the second pair of radio buttons:
but = new QRadioButton( tr("Enabled", "colors"), colors ); but = new QRadioButton( tr("Disabled", "colors"), colors );
Now run lupdate and open tt3_pt.ts with Qt Linguist. You should now see two changes.
First, the translation source file now contains three "Enabled", "Disabled" pairs. The first pair is marked "(obs.)" signifying that they are obsolete. This is because these texts appeared in tr() calls that have been replaced by new calls with two arguments. The second pair has "two-sided" as their comment, and the third pair has "colors" as their comment. The comments are shown in the Source text and comments area in Qt Linguist.
Second, the translation text "Ativado" and "Desativado" have been automatically used as translations for the new "Enabled" and "Disabled" texts, again to minimize the translator's work. Of course in this case these are not correct for the second occurrence of each word, but they provide a good starting point.
Change the second "Ativado" into "Ativadas" and the second "Desativado" into "Desativadas", then save and quit. Run lrelease to obtain an up-to-date binary tt3_pt.qm file, and run Troll Print (or rather Troll Imprimir).
Tutorial 3 Screenshot, "Troll Imprimir 1.0", (Good) Portuguese version
The second argument to tr() calls, called "comments" in Qt Linguist, distinguish between identical source texts that occur in the same context (class). They are also useful in other cases to give clues to the translator, and in the case of Ctrl key accelerators are the only means of conveying the function performed by the accelerator to the translator.
An additional way of helping the translator is to provide information on how to navigate to the particular part of the application that contains the source texts they must translate. This helps them see the context in which the translation appears and also helps them to find and test the translations. This can be achieved by using a TRANSLATOR comment in the source code:
/* TRANSLATOR MainWindow In this application the whole application is a MainWindow. Choose Help|About from the menu bar to see some text belonging to MainWindow. */
Try adding these comments to some source files, particularly to dialog classes, describing the navigation necessary to reach the dialogs. You could also add them to the example files, e.g. mainwindow.cpp and printpanel.cpp are appropriate files. Run lupdate and then start Qt Linguist and load in tt3_pt.ts. You should see the comments in the Source text and comments area as you browse through the list of source texts.
Sometimes, particularly with large programs, it can be difficult for the translator to find their translations and check that they're correct. Comments that provide good navigation information can save them time:
/* TRANSLATOR ZClientErrorDialog Choose Client|Edit to reach the Client Edit dialog, then choose Client Specification from the drop down list at the top and pick client Bartel Leendert van der Waerden. Now check the Profile checkbox and then click the Start Processing button. You should now see a pop up window with the text "Error: Name too long!". This window is a ZClientErrorDialog. */
Troll Print 1.1
We'll now prepare release 1.1 of Troll Print. Start your favorite text editor and follow these steps:
Uncomment the two lines that create a QLabel with the text "<b>TROLL PRINT</b>" in printpanel.cpp.
Word-tidying: Replace "2-sided" by "Two-sided" in printpanel.cpp.
Replace "1.0" with "1.1" everywhere it occurs in mainwindow.cpp.
Update the copyright year to 1999-2000 in mainwindow.cpp.
(Of course the version number and copyright year would be consts or #defines in a real application.)
Once finished, run lupdate, then open tt3_pt.ts in Qt Linguist. The following items are of special interest:
MainWindow
Troll Print 1.0 - marked "(obs.)", obsolete
About Troll Print 1.0 - marked "(obs.)", obsolete
Troll Print 1.0. Copyright 1999 Macroshaft, Inc. - marked "(obs.)", obsolete
Troll Print 1.1 - automatically translated as "Troll Imprimir 1.1"
About Troll Print 1.1 - automatically translated as "Troll Imprimir 1.1"
Troll Print 1.1. Copyright 1999-2000 Macroshaft, Inc. - automatically translated as "Troll Imprimir 1.1. Copyright 1999-2000 Macroshaft, Inc."
PrintPanel
2-sided - marked "(obs.)", obsolete
<b>TROLL PRINT</b> - unmarked, i.e. untranslated
Two-sided - unmarked, i.e. untranslated.
Notice that lupdate works hard behind the scenes to make revisions easier, and it's pretty smart with numbers.
Go over the translations in MainWindow and mark these as "done". Translate "<b>TROLL PRINT</b>" as "<b>TROLL IMPRIMIR</b>". When you're translating "Two-sided", press the Guess Again button to translate "Two-sided", but change the "2" into "Dois".
Save and quit, then run lrelease. The Portuguese version should look like this:
Tutorial 3 Screenshot, "Troll Imprimir 1.1", Portuguese version
Choose Ajuda|Sobre, (Help|About), to see the about box
Tutorial 3 Screenshot, About box, Portuguese version
If you choose Ajuda|Sobre Qt, (Help|About Qt), you'll get an English dialog... oops! Qt itself needs to be translated. See the document Internationalization with Qt for details.
Now set LANG=en to get the original English version:
Tutorial 3 Screenshot, "Troll Print 1.1", English version
Summary
These tutorials cover all that you need to know to prepare your Qt applications for translation.
At the beginning of a project add the translation source files to be used to the project file and add calls to lupdate and lrelease to the make file.
During the project all the programmer must do is wrap any user-visible text in tr() calls. They should also use the two argument form for Ctrl key accelerators, or when asked by the translator for the cases where the same text translates into two different forms in the same context. The programmer should also include TRANSLATION comments to help the translator navigate the application.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论