版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Qt Creator快速入门快速入门第第2版版第第5 5章章 应用程序主窗口应用程序主窗口(3课时)主主 要要 内内 容容n5.1 主窗口框架主窗口框架(第(第1课时)课时)n5.2 富文本处理富文本处理(第(第2课时)课时)n5.3 拖放操作拖放操作(第(第3课时)课时)n5.4 打印文档打印文档(第(第3课时)课时)n5.5 小结小结(第(第3课时)课时)n Qt中主窗口程序的框架 手工创建QMainWindow主窗口的基本步骤 结合Qt Designer创建主窗口的方法 QAction动作的创建 如何在菜单及工具栏中加入动作 如何加入锚接窗口 各种锚接方式以及锚接窗体特性的设置方法 创建
2、多文档应用程序的方法和步 5.1 主窗口框架主窗口框架n 主窗口为建立应用程序用户界面提供了一个框架,Qt提供了QMainWindow和与其相关的一些类来进行主窗口的管理。nQMainWindow类提供了一个应用程序主窗口,包括一个菜单栏( menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)以及一个中心部件(central widget)。 QMainWindowQMainWindow常用布局如下:常用布局如下:菜单栏(菜单栏(QMenuBar)。菜)。菜单栏包含了一个下拉菜单项的单栏包含了一个下拉菜单项的列表,这
3、些菜单项由列表,这些菜单项由QAction动作类实现。菜单栏位于主窗动作类实现。菜单栏位于主窗口的顶部,一个主窗口只能有口的顶部,一个主窗口只能有一个菜单栏。一个菜单栏。工具栏(工具栏(QToolBar)。工)。工具栏一般用于显示一些常用具栏一般用于显示一些常用的菜单项目,它也可以插入的菜单项目,它也可以插入其他窗口部件,并且工具栏其他窗口部件,并且工具栏是可以移动的。一个主窗口是可以移动的。一个主窗口可以拥有多个工具栏。可以拥有多个工具栏。中心部件(中心部件(Central Widget)。在主窗口的中心)。在主窗口的中心区域可以放入一个窗口部件区域可以放入一个窗口部件作为中心部件,它是应用
4、程作为中心部件,它是应用程序的主要功能实现区域。一序的主要功能实现区域。一个主窗口只能拥有一个中心个主窗口只能拥有一个中心部件。部件。Dock部件部件(QDockWidget)。)。Dock部部件常被称为停靠窗口,因为它件常被称为停靠窗口,因为它可以停靠在中心部件的四周。可以停靠在中心部件的四周。它用来放置一些部件来实现一它用来放置一些部件来实现一些功能,就像个工具箱一样。些功能,就像个工具箱一样。一个主窗口可以拥有多个一个主窗口可以拥有多个Dock部件。部件。状态栏(状态栏(QStatusBar)。)。状态栏用于显示程序的一些状态栏用于显示程序的一些状态信息,它在主窗口的最状态信息,它在主窗
5、口的最底部。一个主窗口只能拥有底部。一个主窗口只能拥有一个状态栏。一个状态栏。创建主窗口方法创建主窗口方法一、一、全部代码生成,单继承自QMainWindow类,在子类的实现文件中使用代码创建应用程序主窗口的菜单、工具栏、锚接部件以及状态栏等并设置它们的属性;二、使用Qt设计师绘制应用程序主窗口,然后添加菜单、工具栏等,并进行属性设置、关联信号与槽;与代码相结合;创建主窗口流程创建主窗口流程创建主菜单创建子菜单创建动作创建工具栏动作和菜单项创建锚接窗口创建中心窗口创建状态栏 QMainWindow类成员函数nQMenuBar* QMainWindow:menuBar ( ) constnQTo
6、olBar* QMainWindow:addToolBar ( const QString& title )nvoid QMainWindow:setCentralWidget ( QWidget* widget )nQStatusBar* QMainWindow:statusBar ( ) constQMainWindow类QMenuBar *QMainWindow:menuBar() const;n 返回一个主窗口的菜单栏对象指针。n若主窗口不存在菜单栏,则会创建一个空的菜单栏。QMainWindow类QToolBar * QMainWindow:addToolBar ( const QS
7、tring & title ); 创建一个QToolBar对象,返回这个对象的指针,并在主窗口顶部工具栏区域中显示。void QMainWindow:addToolBar ( Qt:ToolBarArea area, QToolBar * toolbar );void QMainWindow:addToolBar ( QToolBar * toolbar );已创建了工具栏(QToolBar)对象时,将工具栏对象添加到QMainWindow对象中。其中:ntoolbar为已定义好的工具栏对象指针,larea工具栏表示的位置,此形参为枚举型变量。共4种,即左右上下: Qt:LeftToolBar
8、Area 0 x1 Qt:RightToolBarArea 0 x2 Qt:TopToolBarArea 0 x4 Qt:BottomToolBarArea 0 x8QMainWindow类QStatusBar *QMainWindow:statusBar() const;n当主窗口状态栏不存在时,创建状态栏,并返回状态栏对象指针。n一般在自定义QMainWindow子类的构造函数时使用,创建状态栏对象。创建后,添加QLabel对象,以显示主窗口状态或菜单栏中按钮的状态提示。QMainWindow类void QMainWindow:setCentralWidget ( QWidget * wi
9、dget ); n设置传入部件为主窗口布局的中心领域部件。n传入部件可为任意的部件或QWidget类的子类部件。菜单栏菜单栏QMenuBarQMenuBarnQMenuBar类提供了一个水平的菜单栏,在QMainWindow中可以直接获取它的默认存在的菜单栏,向其中添加QMenu类型的菜单对象,然后向弹出菜单中添加QAction类型的动作对象。n区分:菜单是QMenu对象,多个QMenu对象放置在一个QMenuBar(菜单栏)对象中。对于每个菜单,我们再为其添置动作列表,即QAction对象。菜单栏菜单栏QMenuBarQMenuBarQMenuQMenu类类提示:菜单不需要创建,只需menu
10、bar中添加即可。/返回菜单栏指针,以便以后添加相应菜单。QMenuBar* QMainWindow:menuBar ( ) const/添加菜单QMenu * addMenu ( const QIcon & icon, const QString & title )/添加分割线QAction * addSeparator ()/方法向菜单中添加动作QAction * addAction()添加菜单示例添加菜单示例/ 添加添加“文件文件” 菜单菜单QMenu *fileMenu = ui-menuBar-addMenu(tr(“文件文件(&F);/ 添加添加“打开文件打开文件” 动作动作 QA
11、ction *action_Open = fileMenu-addAction( QIcon(“./images/open.png),tr(打开文件打开文件(&O);菜单栏菜单栏QMenuBarQMenuBarQactionQaction类:类:nQActionQAction类提供了一个可以同时出现在菜单和工具条上的抽象用户界类提供了一个可以同时出现在菜单和工具条上的抽象用户界面操作。如果添加到菜单中就会显示成菜单项(文件,工具,收藏等面操作。如果添加到菜单中就会显示成菜单项(文件,工具,收藏等菜单项);如果添加到工具条,就会显示成一个按钮。菜单项);如果添加到工具条,就会显示成一个按钮。nQ
12、ActionQAction类保存有关这个动作的信息,例如文本描述、图标、快捷键类保存有关这个动作的信息,例如文本描述、图标、快捷键、回调函数等、回调函数等 。n一个一个QActionQAction动作包含了一个图标,一个菜单显示文本,一个快捷键,动作包含了一个图标,一个菜单显示文本,一个快捷键,一个状态栏显示文本,一个一个状态栏显示文本,一个“Whats ThisWhats This?”显示文本和一个工具显示文本和一个工具提示文本。这些都可以在构建提示文本。这些都可以在构建QActionQAction类对象时在构造函数中指定。类对象时在构造函数中指定。菜单栏菜单栏QMenuBarQMenuBa
13、rQactionQaction类:类:QAction ( QObject QAction ( QObject * * parent ) parent )QAction ( const QString & text, QObject QAction ( const QString & text, QObject * * parent ) parent )QAction ( const QIcon & icon, const QString & text, QObject QAction ( const QIcon & icon, const QString & text, QObject * *
14、 parent ) parent )n常用方法:常用方法:nsetShortcutsetShortcut()设置快捷键()设置快捷键nsetStatusTipsetStatusTip()设置状态提示()设置状态提示nsetIcon(QIcon(“setIcon(QIcon(“图片路径图片路径”)nQAction:triggered ( ) QAction:triggered ( ) 【信号信号】当在此动作中单击鼠标,则发送该信号。当在此动作中单击鼠标,则发送该信号。菜单栏菜单栏QMenuBarQMenuBar QAction QAction * *openAction;openAction;
15、/ /构造一个构造一个QActionQAction类的对象类的对象 openAction = new QAction(tr(&Open), this);openAction = new QAction(tr(&Open), this); / /设置动作快捷键设置动作快捷键 openAction-setShortcut(QKeySequence:Open); openAction-setShortcut(QKeySequence:Open);/ 状态栏显示状态栏显示 openAction-setStatusTip(tr(Open a file.); openAction-setStatusTip
16、(tr(Open a file.);/把这个把这个QActionQAction添加到菜单添加到菜单 QMenu QMenu * *file = menuBar()-addMenu(tr(&File);file = menuBar()-addMenu(tr(&File); file-addAction(openAction); file-addAction(openAction);/把这个把这个QActionQAction添加到工具条:添加到工具条: QToolBar QToolBar * *toolBar = addToolBar(tr(&File);toolBar = addToolBar(
17、tr(&File); toolBar-addAction(openAction); toolBar-addAction(openAction);工具栏工具栏QToolBar类类n工具栏工具栏QToolBar类提供了一个包含了一组控件的可以移动的面板类提供了一个包含了一组控件的可以移动的面板,它它用于提供常用命令或者选项的快速访问。用于提供常用命令或者选项的快速访问。nQToolBar是是QDockWindow的特殊化,并且提供的特殊化,并且提供QDockWindow的的所有功能。所有功能。n可以使用绝大多数窗口部件,最常用可以使用绝大多数窗口部件,最常用QToolButton和和QComboB
18、ox。n使用使用addAction()添加部件。添加部件。工具栏工具栏QToolBar类类属性:属性:ntoolButtonStyle:设置图标和相应文本的显示及其相对位置等;:设置图标和相应文本的显示及其相对位置等;nMovabel:设置状态栏是否可以移动;:设置状态栏是否可以移动;nallowedArea:设置允许停靠的位置;:设置允许停靠的位置;nIconsize:属性设置图标的大小;:属性设置图标的大小;nFloatable:属性设置是否可以悬浮。:属性设置是否可以悬浮。工具栏中添加窗口部件示例工具栏中添加窗口部件示例QToolButton *toolBtn = new QToolBu
19、tton(this); / 创建创建QToolButtontoolBtn-setText(tr(颜色颜色);QMenu *colorMenu = new QMenu(this); / 创建一个菜单创建一个菜单colorMenu-addAction(tr(红色红色);colorMenu-addAction(tr(绿色绿色);toolBtn-setMenu(colorMenu); / 添加菜单添加菜单toolBtn-setPopupMode(QToolButton:MenuButtonPopup); / 设置弹出模式设置弹出模式ui-mainToolBar-addWidget(toolBtn);
20、/ 向工具栏添加向工具栏添加QToolButton按钮按钮QSpinBox *spinBox = new QSpinBox(this); / 创建创建QSpinBoxui-mainToolBar-addWidget(spinBox); / 向工具栏添加向工具栏添加QSpinBox部件部件工具栏中添加窗口部件示例工具栏中添加窗口部件示例QToolButton *toolBtn = new QToolButton(this); / 创建创建QToolButtontoolBtn-setText(tr(颜色颜色);QMenu *colorMenu = new QMenu(this); / 创建一个菜单
21、创建一个菜单colorMenu-addAction(tr(红色红色);colorMenu-addAction(tr(绿色绿色);toolBtn-setMenu(colorMenu); / 添加菜单添加菜单toolBtn-setPopupMode(QToolButton:MenuButtonPopup); / 设置弹出模式设置弹出模式ui-mainToolBar-addWidget(toolBtn); / 向工具栏添加向工具栏添加QToolButton按钮按钮QSpinBox *spinBox = new QSpinBox(this); / 创建创建QSpinBoxui-mainToolBar-
22、addWidget(spinBox); / 向工具栏添加向工具栏添加QSpinBox部件部件中心部件中心部件Central Widgetn在主窗口的中心区域可以放置一个中心部件,它一般是一个编辑器或者浏览在主窗口的中心区域可以放置一个中心部件,它一般是一个编辑器或者浏览器。这里支持单文档部件,也支持多文档部件。器。这里支持单文档部件,也支持多文档部件。n采用采用Qt Designer创建主窗口时,默认情况下,系统已经创建了一个中心窗创建主窗口时,默认情况下,系统已经创建了一个中心窗口部件,它是子类化口部件,它是子类化QWidget的。的。n代码设置中心窗口部件可以调用主窗口类代码设置中心窗口部
23、件可以调用主窗口类setCentralWidget()方法,每次程方法,每次程序调用序调用setCentralWidget()方法时,先前存在的中心窗口部件将被新的所替方法时,先前存在的中心窗口部件将被新的所替换,而且主窗口会销毁原来的部件,无需用户处理。换,而且主窗口会销毁原来的部件,无需用户处理。n从理论上来讲,任何继承自从理论上来讲,任何继承自QWidget的类的派生类的实例,都可以作为中心的类的派生类的实例,都可以作为中心窗口部件使用。窗口部件使用。通常情况如下:通常情况如下:n 使用标准的使用标准的Qt窗口部件,例如窗口部件,例如QWidget、Qlabel以及QTextEdit等等
24、。n 使用自定义窗口部件(使用自定义窗口部件(User-Define-Widget) 有时候,某些有特殊要求的应用程序需要在自定义窗口部件中显示数据,你可以把自定义的窗口部件作为中心窗口部件。例如,你的绘图编辑器程序程序就可以使用类似名为PhotoEditor的自定义窗口部件作为自己的中心窗口部件。中心部件中心部件Central Widgetn3. 使用一个带布局管理器的普通使用一个带布局管理器的普通Widget 有时候,应用程序的中央区域会被许多窗口部件所占用。这时就可以通过使用一个作为所有这些其他窗口部件父对象的QWidget,以及通过使用布局管理器管理这些子窗口部件的大小和位置来完成这一
25、特殊情况。n4. 使用切分窗口(使用切分窗口(QSplitter)这种情况是上一种情况的一个例子。多个窗口部件一起使用的另一种方法是使用QSplitter。n5. 使用多文档界面工作空间(使用多文档界面工作空间(QMdiArea) 如果应用程序使用的是多文档界面,那么它的中心区域就会被QMdiArea窗口部件所占据,并且每个多文档界面窗口都是它的一个子窗口界面。n6. 使用工作空间部件(使用工作空间部件(QWorkspace)这种情况通常用于多文档应用程序中,这时应用程序主窗口的中心部件是一个QWorkspace部件或者它的子类化部件。但这种方法在Qt4.5以后将被废弃。中心部件中心部件Cen
26、tral Widget/创建中心部件QTextEdit * text;text = new QTextEdit(this);setCentralWidget(text);Dock部件部件QDockWidgetQDockWidget类类nQDockWidget类提供了一个特殊的窗口部件,它可以是被锁在类提供了一个特殊的窗口部件,它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。窗口内部或者是作为顶级窗口悬浮在桌面上。n一个一个DockDock部件包含一个标题栏和一个内容区域,可以向部件包含一个标题栏和一个内容区域,可以向DockDock部件中放入任何部件中放入任何部件。
27、部件。 创建创建DockWidgetDockWidget流程:流程:n创建一个创建一个QDockWidget对象的停靠窗体。对象的停靠窗体。n设置此停靠窗体的属性,通常可以使用设置此停靠窗体的属性,通常可以使用setFeatures()以及()以及setAllowedAreas()两种方法。()两种方法。n新建一个要插入停靠窗体的控件,常用的有新建一个要插入停靠窗体的控件,常用的有QListWidget和和QtextEdit。n将控件插入停靠窗体,调用将控件插入停靠窗体,调用QDockWidget()和()和setWidget()成员函数。()成员函数。n使用使用addDockWidget()
28、方法,在()方法,在MainWindow中加入此停靠窗体。中加入此停靠窗体。Dock部件部件QDockWidgetQDockWidget类类QDockWidget *dock = new QDockWidget(tr(DockWindow1),this); /指定停靠窗体的样式,此处为可移动 dock-setFeatures(QDockWidget:DockWidgetMovable);dock-setAllowedAreas(Qt:LeftDockWidgetArea | Qt:RightDockWidgetArea); QTextEdit *text1 = new QTextEdit();
29、 text1-setText(tr(窗口一); dock-setWidget(text1); addDockWidget(Qt:RightDockWidgetArea,dock); Dock部件部件n例如:例如:在设计模式中向中心区域拖入一个在设计模式中向中心区域拖入一个Dock Widget部件,然后再向部件,然后再向Dock中随意拖入几个部件,比如这里拖入一个中随意拖入几个部件,比如这里拖入一个Push Button和一个和一个Font Combo Box。然后在。然后在dockWidget的属性栏中更改其的属性栏中更改其windowTitle为为“工具箱工具箱”。状态栏状态栏nQStat
30、usBar类提供了一个水平条,用来显示状态信息。类提供了一个水平条,用来显示状态信息。nQMainWindow中默认提供了一个状态栏。在状态栏的最右端,还有一个中默认提供了一个状态栏。在状态栏的最右端,还有一个QSizeGrip部件,用来调整窗口的大小,可以使用部件,用来调整窗口的大小,可以使用setSizeGripEnabled()函函数来禁用它。数来禁用它。状态信息可以被分为三类:状态信息可以被分为三类:n临时信息,如一般的提示信息;可以使用临时信息,如一般的提示信息;可以使用showMessage()函数来显示一个临函数来显示一个临时消息,它会出现在状态栏的最左边。时消息,它会出现在状态
31、栏的最左边。n正常信息,如显示页数和行号;一般用正常信息,如显示页数和行号;一般用addWidget()函数添加一个函数添加一个QLabel到到状态栏上用于显示正常信息,它会生成到状态栏的最左边,可能会被临时消状态栏上用于显示正常信息,它会生成到状态栏的最左边,可能会被临时消息所掩盖。息所掩盖。n永久信息,如显示版本号或者日期。如果要显示永久信息,要使用永久信息,如显示版本号或者日期。如果要显示永久信息,要使用addPermanentWidget()函数来添加一个如函数来添加一个如QLabel一样的可以显示信息的部一样的可以显示信息的部件,它会生成在状态栏的最右端,不会被临时消息所掩盖。件,它
32、会生成在状态栏的最右端,不会被临时消息所掩盖。 目前的设计器中还不支持直接向状态栏中拖放部件,所以需要使用代码目前的设计器中还不支持直接向状态栏中拖放部件,所以需要使用代码来生成。例如:来生成。例如:/ 显示临时消息,显示显示临时消息,显示2000毫秒即毫秒即2秒钟秒钟ui-statusBar-showMessage(tr(欢迎使用多文档编辑器欢迎使用多文档编辑器), 2000);/ 创建标签,设置标签样式并显示信息,将其以永久部件的形式添加到状态栏创建标签,设置标签样式并显示信息,将其以永久部件的形式添加到状态栏QLabel *permanent = new QLabel(this); pe
33、rmanent-setFrameStyle(QFrame:Box | QFrame:Sunken); permanent-setText(); ui-statusBar-addPermanentWidget(permanent); 此时运行程序,可以发现此时运行程序,可以发现“欢迎使用多文档编辑器欢迎使用多文档编辑器”字符串在显示一会字符串在显示一会儿后就自动消失了,而儿后就自动消失了,而“”一直显示在状态栏最右端。一直显示在状态栏最右端。 资源系统资源系统 Qt资源系统是一个独立于平台的(跟使用的操作系统无关)用于资源系统是一个独立于平台的(跟使用的操作系统无关)用于在可执行文件中存储二进制
34、文件的机制,是在可执行文件中存储二进制文件的机制,是Qt核心机制之一。核心机制之一。n可以让需要的文件(图片、文本等)包含到程序编程生成的可执行文可以让需要的文件(图片、文本等)包含到程序编程生成的可执行文件(例如件(例如exe文件)中。文件)中。n保证了程序中使用的文件不会丢失、不会因为存放路径而导致程序运保证了程序中使用的文件不会丢失、不会因为存放路径而导致程序运行错误。行错误。nQt4使用资源集(使用资源集( Resource Collection Files)文件,即)文件,即.qrc文件。文件。qmake能够识别这个资源集文件,并且能够根据它的描述去相应的目能够识别这个资源集文件,并
35、且能够根据它的描述去相应的目录下定位具体的资源录下定位具体的资源 。 资源文件介绍资源文件介绍nqrcqrc资源文件是资源文件是基于标准基于标准 xml格式的文本文件,列出了所有嵌入到可格式的文本文件,列出了所有嵌入到可执行文件中的文件执行文件中的文件 ,条理非常清晰,易于阅读和维护。,条理非常清晰,易于阅读和维护。 images/new.png images/new.png images/open.png images/open.png images/save.png images/save.png 在这里指明了文件类型为在这里指明了文件类型为RCCRCC,表明是,表明是QtQt资源文件。然
36、后是资源前缀,应用程资源文件。然后是资源前缀,应用程序中,资源是路径前缀识别的序中,资源是路径前缀识别的 。filefile罗列了添加的图片的路径。罗列了添加的图片的路径。 n资源文件使用时,在工程文件资源文件使用时,在工程文件.pro中添加一行代码:中添加一行代码:RESOURCES += myImage.qrcRESOURCES += myImage.qrcn通过通过QtQt资源编辑器资源编辑器 rccrcc,可以将资源转换为,可以将资源转换为 C+C+代码代码 。在在Qt Creator中添加资源中添加资源n第一步,添加第一步,添加Qt资源文件。往项目中添加新文件,选择资源文件。往项目中
37、添加新文件,选择Qt分类中的分类中的Qt资源文件,文件资源文件,文件名称改为名称改为“myImage”,其他选项默认即可。,其他选项默认即可。n第二步,添加资源。建立好资源文件后会默认进入资源管理界面,就是新建的第二步,添加资源。建立好资源文件后会默认进入资源管理界面,就是新建的myImage.qrc文件中。现在先到项目文件夹文件中。现在先到项目文件夹myMainWindow中新建一个名为中新建一个名为“images”的文件夹,并在其中放入两张图标图片,比如这里放入了一个的文件夹,并在其中放入两张图标图片,比如这里放入了一个“new.png”和一个和一个“open.png”图片。(注意:图片。
38、(注意:Qt的资源系统要求资源文件必须放在与的资源系统要求资源文件必须放在与qrc文件同文件同级或子级目录下,如果放在其他地方,当添加资源时会提示将文件复制到有效的位级或子级目录下,如果放在其他地方,当添加资源时会提示将文件复制到有效的位置。)置。)n 然后回到然后回到Qt Creator中,在资源管理界面,按下中,在资源管理界面,按下“添加添加”按钮,选择按钮,选择“添加前添加前缀缀”,然后将属性栏中的前缀改为,然后将属性栏中的前缀改为“/myImage”,再点击,再点击“添加添加”按钮,选择按钮,选择“添加添加文件文件”,在弹出的对话框中进入到前面新建的,在弹出的对话框中进入到前面新建的i
39、mages文件夹中,选中那两张图片,点文件夹中,选中那两张图片,点击打开即可。这时击打开即可。这时myImage.qrc文件中就出现了添加的图片的列表。最后按下文件中就出现了添加的图片的列表。最后按下Ctrl+S快捷键,保存对文件的修改(注意:这一点很重要,如果没有保存,在下面使用图片快捷键,保存对文件的修改(注意:这一点很重要,如果没有保存,在下面使用图片时将看不到图片)。时将看不到图片)。 n第三步,使用图片。在设计模式第三步,使用图片。在设计模式Action编辑器中双击编辑器中双击“新建文件新建文件”动作,这动作,这时会弹出编辑动作对话框。在其中将对象名称改为时会弹出编辑动作对话框。在其
40、中将对象名称改为“action_New”,工具提,工具提示改为示改为“新建文件新建文件”,然后按下图标后面的按钮,进入选择资源界面。,然后按下图标后面的按钮,进入选择资源界面。n第一次进入该界面还没有显示可用的资源,需要按下左上角的重新加载绿色第一次进入该界面还没有显示可用的资源,需要按下左上角的重新加载绿色箭头图标,这时图片资源就显示出来了。这里选择箭头图标,这时图片资源就显示出来了。这里选择new.png图片,然后按下图片,然后按下确定按钮。确定按钮。n如果在编写代码时使用如果在编写代码时使用new.png图片,那么就可以将其路径指定为图片,那么就可以将其路径指定为“:/myImage/i
41、mages/new.png”, 前缀前缀“/myImage”是添加资源时手动设是添加资源时手动设置的。置的。5.2 富文本处理富文本处理n富文本(富文本(Rich TextRich Text)或者叫做富文本格式,简单来说就是在文档)或者叫做富文本格式,简单来说就是在文档中可以使用多种格式,比如字体颜色、图片和表格等等。中可以使用多种格式,比如字体颜色、图片和表格等等。n与纯文本(与纯文本(Plain TextPlain Text)相对而言的。)相对而言的。n例如例如WindowsWindows上的记事本就是纯文本编辑器,而上的记事本就是纯文本编辑器,而WordWord就是富文本编就是富文本编辑
42、器。辑器。Qt富文本的处理及接口富文本的处理及接口:n编辑操作编辑操作:基于光标的一些接口函数,模拟了用户的编辑操作;基于光标的一些接口函数,模拟了用户的编辑操作;基于基于QTextCursor类类n只读操作:文档结构框架预览,使用了只读的分层次的接口函数,它们有利只读操作:文档结构框架预览,使用了只读的分层次的接口函数,它们有利于文档的检索和输出。于文档的检索和输出。基于基于QTextDocument类类构建构建QTextEdit类的对象时,就已经构建了一个类的对象时,就已经构建了一个QTextDocument类对象和一个类对象和一个QTextCursor类对象,只需调用它们进行相应的操作即
43、可。类对象,只需调用它们进行相应的操作即可。QTextDocument类是文本文档的代表,它包含了构建富文本文档所需的信息。类是文本文档的代表,它包含了构建富文本文档所需的信息。富文本文档结构富文本文档结构一个富文本文档的结构元素:一个富文本文档的结构元素:n框架(框架(QTextFrame)n文本块(文本块(QTextBlock)n表格(表格(QTextTable)n列表(列表(QTextList) 每种元素的格式又使用相应的每种元素的格式又使用相应的format类来表示:类来表示:n框架格式(框架格式(QTextFrameFormat)n文本块格式(文本块格式(QTextBlockForm
44、at)n表格格式(表格格式(QTextTableFormat)n列表格式(列表格式(QTextListFormat)这些格式一般在编辑文档时使用,常和这些格式一般在编辑文档时使用,常和QTextCursor类配合使用。类配合使用。 富文本文档结构富文本文档结构Docment组成:组成:n一个空的文档包含了一个根框架(一个空的文档包含了一个根框架(Root frame),这个根框架又包含了一个),这个根框架又包含了一个空的文本块(空的文本块(Block)。)。n frame将一个文档分为多个部分,在根框架里可以再添加文本块、子框架和将一个文档分为多个部分,在根框架里可以再添加文本块、子框架和表格
45、等。表格等。 /创建新文档QTextDocument *newDocument = new QTextDocument; /获取已有文档和光标QTextEdit *editor = new QTextEdit; QTextDocument *editorDocument = editor-document(); QTextCursor *cursor = editor-textCursor();/访问根框架:QTextDocument *textDocument; QTextFrame *root = textDocument-rootFrame(); 设置根框架设置根框架QTextDocum
46、ent *document = ui-textEdit-document(); /获取文档对象获取文档对象QTextFrame *rootFrame = document-rootFrame(); / 获取根框架获取根框架QTextFrameFormat format; / 创建框架格式创建框架格式format.setBorderBrush(Qt:red); / 边界颜色边界颜色format.setBorder(3); / 边界宽度边界宽度rootFrame-setFrameFormat(format); / 框架使用格式框架使用格式添加子框架添加子框架QTextFrameFormat fra
47、meFormat;frameFormat.setBackground(Qt:lightGray); / 设置背景颜色设置背景颜色frameFormat.setMargin(10); / 设置边距设置边距frameFormat.setPadding(5); / 设置填衬设置填衬frameFormat.setBorder(2);/设置边框样式设置边框样式frameFormat.setBorderStyle(QTextFrameFormat:BorderStyle_Dotted); QTextCursor cursor = ui-textEdit-textCursor(); / 获取光标获取光标cu
48、rsor.insertFrame(frameFormat); / 在光标处插入框架在光标处插入框架文本块文本块 文本块文本块QTextBlock类为文本文档类为文本文档QTextDocument提供了一个提供了一个文本片段(文本片段(QTextFragment)的容器。)的容器。 一个文本块可以看做是一个段落,但是它不能使用回车换行,一个文本块可以看做是一个段落,但是它不能使用回车换行,因为一个回车换行就表示创建一个新的文本块。因为一个回车换行就表示创建一个新的文本块。QTextBlock提供了提供了只读接口,它是前面提到的文档分层次的接口的一部分,如果只读接口,它是前面提到的文档分层次的接口
49、的一部分,如果QTextFrame看做是一层,那么其中的看做是一层,那么其中的QTextBlock就是另一层。就是另一层。 文本块的格式由文本块的格式由QTextBlockFormat类来处理,它主要涉及对齐类来处理,它主要涉及对齐方式,文本块四周的边白,缩进等内容。而文本块中的文本内容的格方式,文本块四周的边白,缩进等内容。而文本块中的文本内容的格式,比如字体大小、加粗、下划线等内容,则由式,比如字体大小、加粗、下划线等内容,则由QTextCharFormat类来设置。类来设置。 遍历框架遍历框架 QTextDocument *document = ui-textEdit-document(
50、); QTextFrame *frame = document-rootFrame(); QTextFrame:iterator it; / 建立建立QTextFrame类的迭代器类的迭代器 for (it = frame-begin(); !(it.atEnd(); +it) QTextFrame *childFrame = it.currentFrame();/ 获取当前框架的指针获取当前框架的指针 QTextBlock childBlock = it.currentBlock(); / 获取当前文本块获取当前文本块 if (childFrame) qDebug() frame; else
51、 if (childBlock.isValid() qDebug() block: textEdit-document(); QTextBlock block = document-firstBlock(); / 获取文档的第一个文本块获取文档的第一个文本块 for (int i = 0; i blockCount(); i+) qDebug() tr(文本块文本块%1,文本块首行行号为,文本块首行行号为:%2,长度为,长度为:%3,内容为:内容为:) .arg(i).arg(block.firstLineNumber().arg(block.length() textEdit-textCur
52、sor(); QTextBlockFormat blockFormat; / 文本块格式文本块格式 blockFormat.setAlignment(Qt:AlignCenter); / 水平居中水平居中 cursor.insertBlock(blockFormat); / 使用文本块格式使用文本块格式 QTextCharFormat charFormat; / 字符格式字符格式 charFormat.setBackground(Qt:lightGray); / 背景色背景色 charFormat.setForeground(Qt:blue); / 字体颜色字体颜色 / 使用宋体,使用宋体,1
53、2号,加粗,倾斜号,加粗,倾斜 charFormat.setFont(QFont(tr(宋体宋体), 12, QFont:Bold, true); charFormat.setFontUnderline(true); / 使用下划线使用下划线 cursor.setCharFormat(charFormat); / 使用字符格式使用字符格式 cursor.insertText(tr(测试字体测试字体); / 插入文本插入文本编辑文本块及其内容的格式编辑文本块及其内容的格式表格、列表和图片表格、列表和图片n插入表格插入表格 05/5-4 QTextCursor cursor = ui-textEd
54、it-textCursor(); QTextTableFormat format; / 表格格式表格格式 format.setCellSpacing(2); / 表格外边白表格外边白 format.setCellPadding(10); / 表格内边白表格内边白 cursor.insertTable(2, 2, format); / 插入插入2行行2列表格列表格n插入列表插入列表 QTextListFormat format; / 列表格式列表格式 format.setStyle(QTextListFormat:ListDecimal); / 数字编号数字编号 ui-textEdit-text
55、Cursor().insertList(format);n插入图片插入图片 QTextImageFormat format; / 图片格式图片格式 format.setName(logo.png); / 图片路径图片路径 ui-textEdit-textCursor().insertImage(format);表格、列表和图片表格、列表和图片查找功能查找功能n查找文本查找文本 05/5-5 QDialog *dlg = new QDialog(this); / 创建对话框创建对话框 lineEdit = new QLineEdit(dlg); / 创建行编辑器创建行编辑器 QPushButto
56、n *btn = new QPushButton(dlg); / 创建按钮创建按钮 btn-setText(tr(查找下一个查找下一个); connect(btn,SIGNAL(clicked(),this,SLOT(findNext(); / 关联信号和槽关联信号和槽 QVBoxLayout *layout = new QVBoxLayout; / 创建垂直布局管理器创建垂直布局管理器 layout-addWidget(lineEdit); / 添加部件添加部件 layout-addWidget(btn); dlg-setLayout(layout); / 在对话框中使用布局管理器在对话框中
57、使用布局管理器 dlg-show();n查找下一个查找下一个 QString string = lineEdit-text(); / 使用查找函数查找指定字符串,查找方式为向后查找使用查找函数查找指定字符串,查找方式为向后查找 bool isfind = ui-textEdit-find(string, QTextDocument:FindBackward); if(isfind) / 如果查找成功,输出字符串所在行和列的编号如果查找成功,输出字符串所在行和列的编号 qDebug() textEdit-textCursor().blockNumber() .arg(ui-textEdit-te
58、xtCursor().columnNumber(); 查找功能查找功能语法高亮语法高亮 在使用在使用Qt Creator编辑代码时可以发现,输入关键字时会显示不同编辑代码时可以发现,输入关键字时会显示不同的颜色,这就是所谓的语法高亮。的颜色,这就是所谓的语法高亮。 在在Qt的富文本处理中提供了的富文本处理中提供了QSyntaxHighlighter类来实现语法高亮。类来实现语法高亮。为了实现这个功能,需要创建为了实现这个功能,需要创建QSyntaxHighlighter类的子类,然后重新类的子类,然后重新实现实现highlightBlock()函数,使用时直接将函数,使用时直接将QTextDo
59、cument类对象指针类对象指针作为其父部件指针,这样就可以自动调用作为其父部件指针,这样就可以自动调用highlightBlock()函数了。函数了。 05/5-6 例如,自定义的类为例如,自定义的类为MySyntaxHighlighter,像这样来使用:,像这样来使用: highlighter = new MySyntaxHighlighter(ui-textEdit-document(); 这里创建了这里创建了MySyntaxHighlighter类的对象,并且使用编辑器的文档对象指类的对象,并且使用编辑器的文档对象指针作为其参数,这样,每当编辑器中的文本改变时都会调用针作为其参数,这样
60、,每当编辑器中的文本改变时都会调用highlightBlock()函函数来设置语法高亮。数来设置语法高亮。 重新实现重新实现highlightBlock()函数:函数: QTextCharFormat myFormat; / 字符格式字符格式 myFormat.setFontWeight(QFont:Bold); myFormat.setForeground(Qt:green); QString pattern = bcharb; / 要匹配的字符,这里是要匹配的字符,这里是“char”单词单词 QRegExp expression(pattern); / 创建正则表达式创建正则表达式 int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医学影像学在肿瘤治疗中的环境与可持续
- 案场培训礼仪课件
- 2026年碳资产托管项目评估报告
- 课件的营销模式
- 医疗行业品牌建设与推广
- 2026年微机电系统(MEMS)传感器项目商业计划书
- 医学影像质量控制与技术创新实践
- 医疗健康产业政策
- 医院内部人力资源激励与约束机制
- 医疗设备研发流程优化与改进
- 大学教学督导与课堂质量监控工作心得体会(3篇)
- 项目专家评审意见书标准模板
- 2025年高中计算机操作试题题库及答案
- 2026年山西信息职业技术学院单招职业技能测试题库及参考答案详解1套
- 麻醉科麻醉后恶心呕吐预防指南
- 04 《生于忧患死于安乐》对比阅读(解析版)
- 外贸三方协议出口合同
- 物业员工交通安全培训
- 碳积分交易平台市场分析报告
- 半导体物理-课件 -第9章 半导体异质结构
- 国网培训课件
评论
0/150
提交评论