QMainWindow 和 QAction

目录

一. 窗口界面可视化设计

1.创建项目

2.设计 Action

3.设计菜单栏和工具栏

二. QAction 类

1.QAction 的信号

2.QAction 的公有槽

3.编辑类 Action 的功能实现

三. QToolBar 类

四. QStatusBar 类

1.添加组件

2.显示临时消息

3.自动显示 Action 的 statusTip

五. 混合式 UI 设计

六. QPlainTextEdit 的使用

1.QPlainTextEdit 的信号和槽

2.两个自定义槽函数的代码

3.其他 Action 的功能实现

4.QPlainTextEdit 的信号的应用


QMainWindow 是主窗口类,具有菜单栏、 工具栏、状态栏等主窗口常见的界面元素。要设计主窗口上的菜单栏、工具栏、按钮的下拉 菜单、组件的快捷菜单等,需要用到 QAction 类。QAction 对象就是实现某个功能的“动作”, 我们称其为 Action。在UI可视化设计时,我们可以设计很多 Action, 然后用 Action 创建菜单项和工具按钮。

示例项目窗口基类选择为 QMainWindow,示例运行时界面如图所示。这个示例实现的是一个简单的文本编辑器, 窗口中间工作区是一个 QPlainTextEdit 组件。

 本示例的设计和实现过程涉及较多的技术点。

• 可视化设计 Action,通过 Action 可视化设计菜单栏和工具栏。设计可复选的 Action,如设置粗体、斜体、下划线的3个Action; 设计分组互斥型可复选的 Action,如选择界面语言的两个 Action。

• 在 UI 可视化设计时, 将设计好的 Action 与 QPlainTextEdit 组件的公有槽关联, 实现剪切、 复制、粘贴、撤销等常见的编辑操作。

• 根据 QPlainTextEdit 组件里当前选择内容的变化,更新相关 Action 的状态,例如,更新剪切、复制、粘贴等编辑操作 Action 的 enabled 属性。

• 在窗口类的构造函数里,通过编写代码创建 UI 可视化设计无法实现的界面功能,其中包括: 在工具栏上创建用于设置字体大小的 QSpinBox 组件和用于选择字体的 QFontComboBox 组件,因为这两个组件在 UI 可视化设计时无法放置到工具栏上;创建 QActionGroup 分组对 象,将选择界面语言的两个 Action 添加到分组, 实现互斥选择; 在窗口的状态栏上添加 QLabel 和 QProgressBar 组件,因为在 UI 可视化设计时不能在状态栏上放置任何组件。

一. 窗口界面可视化设计

1.创建项目

创建一个 GUI 项目,在向导中选择窗口基类为 QMainWindow,新建窗口类的名称会自动被设置为 MainWindow。本示例的窗口上有菜单栏和工具栏,会用到大量图标,所以还需要创建资源文件,以及导入需要用到的图标。

2.设计 Action

QAction的父类是QObject,所以支持Qt的元对象系统。在UI可视化设计时就可以创建Action, 使用设计好的 Action 可以创建菜单项和工具按钮。Qt Designer 界面下方有一个 Action 编辑器,可 以在这个编辑器里可视化设计 Action。下左图是本示例设计好的 Action 列表。根据图标和文字就 大致可以知道每个 Action 的功能。

在 Action 编辑器的上方有一个工具栏,通过工具栏可以新建、复制、粘贴、删除 Action,还可以设置 Action 列表的显示方式。若要编辑某个 Action,在列表里双击该 Action 即可。新建或编辑 Action 的对话框如下右图所示,包括以下一些设置内容。

• Text:Action 的显示文字,该文字会作为菜单项标题或工具按钮标题显示。若该标题后面有...(用于表示有打开对话框的操作), 如“打开...”,则工具按钮标题会自动去除...。

• Object name:Action 的对象名称。应该遵循自身的命名规则,例如以“act”开头表示是一个 Action,并且应在名称中体现分组。

• ToolTip:当鼠标移动到菜单项或工具按钮上短暂停留时,在光标处显示的提示文字。

• Icon:Action 的图标,点击其右边的按钮可以从资源文件里选择图标。

• Checkable:Action 是否可以被复选,如果勾选此复选框,那么该 Action 就有复选状态。

• Shortcut:Action 的快捷键,将光标定位到其旁边的编辑框里,按下需要设置的快捷键即可。

在 Action 编辑器里点击一个 Action 后,属性编辑器就会显示这个 Action 的属性,下图展示了 actFile_Open 的属性。

• text:这是用 Action 创建菜单项时菜单项的显示文字。

• iconText:这是用 Action 创建工具按钮时按钮上显示的文字。

 • toolTip:同上ToolTip。

• statusTip:这是鼠标移动到菜单项或工具按钮上时,在主窗口下方状态栏的临时消息区显示的文字,显示两秒后自动消失。statusTip 一般是对 Action 比较详细的描述,默认为空。

• shortcutContext:这是 Action 的快捷键的有效响应范围,默认值为 WindowShortcut,表示 Action 关联的组件是当前窗口的子组件时快捷键有效;如果值为 ApplicationShortcut,表示只要应用程序有窗口显示,快捷键就有效。

• autoRepeat:表示当快捷键被一直按下时,Action 是否自动重复执行。

• menuRole:这个属性在 macOS 上才有意义,表示 Action 创建的菜单项的作用。

• iconVisibleInMenu:表示在菜单项上是否显示 Action 的图标。

• shortcutVisibleInContextMenu:表示在使用 Action 创建右键快捷菜单时,是否显示快捷键。

• priority:表示 Action 在 UI 上的优先级,默认值为 NormalPriority。如果设置为 LowPriority, 当工具栏的 toolButtonStyle 属性设置为 Qt::ToolButtonTextBesideIcon 时,按钮上将不显示 Action 的文字。

3.设计菜单栏和工具栏

QMainWindow 类窗口上有菜单栏、工具栏和状态栏, 这3种界面组件对应的类分别是 QMenuBar、QToolBar 和 QStatusBar,它们都是直接从 QWidget 继承而来的。在 UI 可视化设计时, 使用窗体的右键快捷菜单可以添加或删除菜单栏、工具栏和状态栏。一个主窗口上最多有一个菜单栏和一个状态栏,可以有多个工具栏。

要设计菜单栏,双击菜单栏上的“Type Here”,会出现一个编辑框,在编辑框里输入所要设计菜单的分组名称,如“文件(&F)”,然后按 Enter 键,这样就可创建一个“文件(F)”菜单分组。 在程序运行时通过快捷键 Alt+F 可以便捷地打开“文件”菜单。同样,可以创建“编辑(E)”“格式 (M)”菜单分组。

创建菜单分组后,从 Action 编辑器的列表中将一个 Action 拖放到某个菜单分组下,就可以创建一个菜单项。双击菜单上的 Add Separator 可以创建一个分隔条,然后将其拖放到需要的位置即可。如果需要移除某个菜单项或分隔条,点击鼠标右键调出快捷菜单,再点击 Remove 菜单项即可移除。如果要为一个菜单项创建下一级菜单,点击菜单项右边的图标 ,拖放 Action 到下一级菜单上就可以创建菜单项。菜单栏设计完成的结果如下图所示:

工具栏上的按钮也是通过 Action 创建的。将一个 Action 拖放到窗体的工具栏上,就会新建一个工具按钮。通过工具栏的快捷菜单,可以在工具栏上添加分隔条或移除工具按钮。如果需要创建多个工具栏,可在窗体上点击鼠标右键,在快捷菜单中点击 Add Tool Bar 即可新建一个工具栏。

二. QAction 类

1.QAction 的信号

QAction 定义了一些信号,其函数原型定义如下,信号发射的时机见注释。

void changed() //Action 的 text、toolTip、font 等属性值变化时
void checkableChanged(bool checkable) //checkable 属性值变化时
void enabledChanged(bool enabled) //enabled 属性值变化时
void hovered() //鼠标移动到用此 Action 创建的菜单项或工具按钮上时
void toggled(bool checked) //checked 属性值变化时
void triggered(bool checked = false) //点击用此 Action 创建的菜单项或工具按钮时
void visibleChanged() //visible 属性值变化时

当我们点击由 Action 创建的菜单项/工具按钮或按下 Action 的快捷键时,QAction 对象发射 triggered()信号。如果 Action 的 checkable 属性值为 true,还会发射 triggered(bool)信号,bool 类型 参数表示当前复选状态。triggered()信号是较常用的,一般会为 triggered()或 triggered(bool)信号编 写槽函数,点击菜单项或工具按钮时,就会运行相关 Action 的 triggered()或 triggered(bool)信号关 联的槽函数。

当 Action 的 checked 属性值变化时,Action 会发射 toggled(bool)信号。点击菜单项或工具按钮可以使 checked 属性值发生变化,在程序中运行 QAction::setChecked()函数也可以使 checked属性值发生变化。

2.QAction 的公有槽

QAction 定义了一些公有槽,这些公有槽可以在程序中直接被调用,也可以在 UI 可视化 设计时在信号与槽编辑器里设置其与其他组件的信号关联。QAction 的公有槽函数原型定义如下:

void hover() //触发 hovered()信号
void trigger() //触发 triggered()信号
void resetEnabled() //复位 enabled 属性为默认值
void setChecked(bool) //设置 checked 属性的值
void setDisabled(bool b) //设置 enabled 属性的值,若 b=true,设置 enabled=false 
void setEnabled(bool) //设置 enabled 属性的值
void setVisible(bool) //设置 visible 属性的值
void toggle() //反转 checked 属性的值

hover()和 trigger()用于触发相应的信号,其他槽函数用于设置 Action 的一些属性,例如设置 enabled 或 checked 属性的值。

3.编辑类 Action 的功能实现

“编辑”分组的 Action 可实现对窗口上的 QPlainTextEdit 组件 textEdit 的一些编辑操作,如剪切、复制、粘贴、撤销等。QPlainTextEdit 提供了实现这些编辑操作的公有槽, 如cut()、copy()、paste()、ndo()等,将这些 Action 的 triggered()信号和 textEdit 相应的公有槽关联即可。

下图展示了信号与槽编辑器里设置的信号与槽关联,对于所有编辑操作,Action 的 triggered()信号都与 textEdit 相应的公有槽建立了关联。另外,textEdit 有 3 个信号和 3 个 Action 的公有槽 setEnabled()关联了,用于自动设置这几个 Action 的 enabled 属性值。例如,textEdit 的 undoAvailable(bool)信号与 actEdit_Undo 的公有槽 setEnabled(bool)关联,这样就可以自动更新 actEdit_Undo 的使能状态。

三. QToolBar 类

工具栏对应的是 QToolBar 类,选择一个工具栏后,在属性编辑器里可以设置其属性。QToolBar 类的主要属性如下表所示:

QToolBar 类的主要属性
属性名称属性值类型含义和作用
movablebool工具栏是否可移动
allowedAreasQt::ToolBarAreas工具栏可以放置的窗口区域
orientationQt::Orientation工具栏的方向,有水平和垂直两种方向
iconSizeQSize图标大小,一般是 16×16、24×24、32×32 像素等大小
toolButtonStyleQt::ToolButtonStyle工具按钮样式
floatablebool工具栏是否可浮动,如果值为 true,工具栏可以被拖放出来作为一个浮 动的窗口

属性 toolButtonStyle 的取值决定了工具按钮显示的样式,属性值是枚举类型 Qt::ToolButtonStyle, 有以下几种枚举值。

• Qt::ToolButtonIconOnly:只显示图标。

• Qt::ToolButtonTextOnly:只显示文字。

• Qt::ToolButtonTextBesideIcon:文字显示在图标旁边。

• Qt::ToolButtonTextUnderIcon:文字显示在图标下面。

• Qt::ToolButtonFollowStyle:由 QStyle 样式定义。

在 UI 可视化设计时,可以用 Action 可视化地创建工具栏上的按钮,但是不能可视化地在工具栏上放置其他组件。QToolBar 提供了接口函数,可以通过代码在工具栏上添加组件,从而灵活地设计工具栏。常用的几个函数定义如下:

void addAction(QAction *action) //添加一个 Action,并根据 Action 的设置自动创建工具按钮
QAction *addWidget(QWidget *widget) //添加一个界面组件
QAction *insertWidget(QAction *before, QWidget *widget) //插入一个界面组件
QAction *addSeparator() //添加一个分隔条
QAction *insertSeparator(QAction *before) //插入一个分隔条

 QToolBar 还定义了一些某个属性值变化时发射的信号。

四. QStatusBar 类

1.添加组件

主窗口上的状态栏对应的是 QStatusBar 类,在 UI 可视化设计时,不能在状态栏上放置任何组件,而只能通过其接口函数向状态栏添加组件。QStatusBar 有两个函数用于添加组件,其函数原型定义如下:

void addWidget(QWidget *widget, int stretch = 0) //添加正常组件
void addPermanentWidget(QWidget *widget, int stretch = 0) //添加永久组件

其中,参数 widget 可以是从 QWidget 继承来的任何组件,一般是适合放置在状态栏上的组件,如 QLabel、QSpinBox、QProgressBar 等。参数 stretch 是延展因子,用于确定组件所占的空间。

函数 addWidget()添加的组件按添加的先后顺序,从状态栏左端开始从左到右排列,也就是左对齐。函数 addPermanentWidget()添加的组件按添加的先后顺序从左到右排列,但是为右对齐,也 就是最后添加的组件在状态栏右端。

使用 addWidget()或 addPermanentWidget()添加组件后,就可以在组件上显示信息了,例如添加的是一个 QLabel 组件,就在这个 QLabel 组件上显示信息即可。

2.显示临时消息

QStatusBar 类有两个公有槽,可以显示和清除临时消息,定义如下:

void showMessage(const QString &message, int timeout = 0) //显示临时消息
void clearMessage() //清除临时消息

函数 showMessage()用于在状态栏上左端首位置显示字符串信息,显示持续时间是 timeout, 单位是毫秒。如果 timeout 设置为 0,就是一直显示,直到被 clearMessage()清除,或显示下一条临时消息。

注意,使用 showMessage()显示临时消息时,状态栏上用 addWidget()添加的组件会被临时隐藏,而用 addPermanentWidget()函数添加的组件会保持不变。

3.自动显示 Action 的 statusTip

如果一个 Action 的 statusTip 属性不为空,当鼠标移动到由这个 Action 创建的菜单项或工具按钮上时,状态栏上就会自动显示这个 Action 的 statusTip 属性的内容;当鼠标移出时,状态栏上的 临时消息就会被自动清除。使用这个功能无须编写任何代码,只需要设置 Action 的 statusTip 属性。

五. 混合式 UI 设计

对本示例来说,在 UI 可视化设计时,只能将 Action 拖放到工具栏上创建按钮,而不能将其他组件拖放到工具栏上,例如不能将一个 QSpinBox 组件拖放到工具栏上。界面的工具栏上设置字体大小的 SpinBox 和字体下拉列表框就需要在 MainWindow 类的构造函数中用代码创建。

在 UI 可视化设计时,状态栏上也不能放置任何组件,界面的状态栏上的两个 QLabel 组件和一个 QProgressBar 组件也是在 MainWindow 类的构造函数中用代码创建的。

界面中选择界面语言的“汉语”和“English”两个工具按钮是互斥的,但是 在可视化设计时,QAction 没有任何属性可以实现这样的功能。需要创建一个 QActionGroup 对象, 并设置为互斥的,将两个 Action 添加到所创建的 actionGroup 里,才可以实现两个 Action 互斥选择的功能。这个功能也是在 MainWindow 类的构造函数中通过代码实现的。

为了实现本示例的界面效果,先在 MainWindow 类中增加一些定义。以下是定义 MainWindow 类的代码,省略了 Go to slot 对话框生成的槽函数的定义。

class MainWindow : public QMainWindow 
{ 
 Q_OBJECT 
private: 
 QLabel *labFile; //添加到状态栏里
 QLabel *labInfo; //添加到状态栏里
 QProgressBar *progressBar1; //进度条,添加到状态栏里
 QSpinBox *spinFontSize; //字体大小,添加到工具栏上
 QFontComboBox *comboFontName; //字体名称,添加到工具栏上
 QActionGroup *actionGroup; //Action 分组,用于"汉语"和"English"两个工具按钮的互斥选择
 void buildUI(); //以代码化方式创建 UI 
 void buildSignalSlots(); //手动关联信号与槽
public: 
 MainWindow(QWidget *parent = nullptr); 
private slots: 
 void do_fontSize_changed(int fontSize); //改变字体大小的 SpinBox 的响应
 void do_fontSelected(const QFont &font); //选择字体的 FontComboBox 的响应
private: 
 Ui::MainWindow *ui; 
};

所有需要在 MainWindow 的构造函数里动态创建的界面组件都需要在 MainWindow 里定义变量,且都应定义为指针变量,这些组件如状态栏上的 QLabel 组件 labFile、工具栏上的 QSpinBox 组件 spinFontSize。

某些动态创建的组件还需要关联槽函数,为此定义了两个自定义槽函数。

• do_fontSize_changed():用于与 spinFontSize 的 valueChanged()信号关联。

• do_fontSelected():用于与 comboFontName 的 currentFontChanged()信号关联。

MainWindow 类里定义了两个私有函数, 其中 buildUI() 用于动态创建界面组件, buildSignalSlots()用于建立信号与自定义槽函数的关联。MainWindow 的构造函数以及这两个私有函数的代码如下。

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 
{ 
 ui->setupUi(this); 
 buildUI(); //动态创建界面组件
 buildSignalSlots(); //为动态创建的组件关联信号与槽
 ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); //工具按钮只显示图标
 this->setCentralWidget(ui->textEdit); //textEdit 填充满工作区
} 
void MainWindow::buildUI() 
{ 
//创建状态栏上的组件
 labFile= new QLabel(this); //用于显示当前文件名
 labFile->setMinimumWidth(150); 
 labFile->setText("文件名:"); 
 ui->statusBar->addWidget(labFile); //添加到状态栏
 progressBar1= new QProgressBar(this); //状态栏上的进度条
 progressBar1->setMaximumWidth(200); 
 progressBar1->setMinimum(5); 
 progressBar1->setMaximum(50); 
 progressBar1->setValue(ui->textEdit->font().pointSize()); 
 ui->statusBar->addWidget(progressBar1); //添加到状态栏
 labInfo= new QLabel(this); //用于显示字体名称
 labInfo->setText("选择字体名称:"); 
 ui->statusBar->addPermanentWidget(labInfo); //添加到状态栏
//为 actLang_CN(汉语)和 actLang_EN(英语)创建 ActionGroup,实现互斥选择
 actionGroup = new QActionGroup(this); 
 actionGroup->addAction(ui->actLang_CN); 
 actionGroup->addAction(ui->actLang_EN); 
 actionGroup->setExclusive(true); //互斥选择
 ui->actLang_CN->setChecked(true); 
//创建工具栏上无法可视化设计的一些组件
 spinFontSize = new QSpinBox(this); //设置字体大小的 SpinBox 
 spinFontSize->setMinimum(5); 
 spinFontSize->setMaximum(50); 
 spinFontSize->setValue(ui->textEdit->font().pointSize()); 
 spinFontSize->setMinimumWidth(50); 
 ui->mainToolBar->addWidget(spinFontSize); //添加到工具栏
 comboFontName = new QFontComboBox(this); //字体下拉列表框
 comboFontName->setMinimumWidth(150); 
 ui->mainToolBar->addWidget(comboFontName); //添加到工具栏
 ui->mainToolBar->addSeparator(); //工具栏上增加分隔条
 ui->mainToolBar->addAction(ui->actClose); //“退出”按钮
} 
void MainWindow::buildSignalSlots() 
{ 
 connect(spinFontSize,SIGNAL(valueChanged(int)),this,SLOT(do_fontSize_changed(int))); 
 connect(comboFontName,&QFontComboBox::currentFontChanged, 
 this, &MainWindow::do_fontSelected); 
} 

构造函数里调用函数 buildUI()动态创建了所需的界面组件,并调用函数 buildSignalSlots()为动态创建的组件设置信号与槽关联,然后用 QMainWindow::setCentralWidget()函数将 textEdit 设置为中心组件,也就是使其填充满主窗口的工作区。

在动态创建界面组件时都传递了 this 指针,也就是用窗口作为所创建组件的父容器,将其加入窗口的对象树,这样窗口被删除时,其所有子组件会被自动删除。

如果几个 Action 的 checkable 属性设置为 true,但其中只能有一个 Action 的 checked 属性可以 被设置为true,就需要将它们添加到一个QActionGroup对象里,并且将它们设置为互斥的。buildUI() 函数里为选择界面语言的两个 Action 创建了一个 QActionGroup 对象 actionGroup。

六. QPlainTextEdit 的使用

1.QPlainTextEdit 的信号和槽

创建了窗口界面后,示例需要实现的其他功能主要就是对 QPlainTextEdit 组件 textEdit 的操作了。QPlainTextEdit 类已经定义了 cut()、copy()、paste()等用于编辑操作的槽函数,在设计 Action 时,我们直接将几个 Action 的 triggered()信号与 textEdit 的公有槽设置了关联。

QPlainTextEdit 的信号定义如下,各信号的触发条件见注释。

void blockCountChanged(int newBlockCount) //段落数变化时
void copyAvailable(bool yes) //有文字被选择或取消选择时
void cursorPositionChanged() //光标位置变化时
void modificationChanged(bool changed) //文档的修改状态变化时
void redoAvailable(bool available) //redo 操作状态变化时
void selectionChanged() //选择的内容变化时
void textChanged() //文档内容变化时
void undoAvailable(bool available) //undo 操作状态变化时
void updateRequest(const QRect &rect, int dy) //需要更新显示时

textEdit 的几个信号与相应 Action 的公有槽 setEnabled()关联,这样就可以自动 改变 Action 的使能状态。例如,redoAvailable()信号与 actEdit_Redo 的公有槽 setEnabled()关联就可以自动更新 actEdit_Redo 的使能状态。

当有文字被选择或取消选择时,QPlainTextEdit 组件发射 copyAvailable()信号,可以为此信号编写槽函数,以控制 actEdit_Cut、actEdit_Copy 和 actEdit_Paste 的使能状态。

当选择的内容变化时,QPlainTextEdit 组件发射 selectionChanged()信号,可以为此信号编写槽函数, 根据选择文字的字体状态更新 actFont_Bold、actFont_Italic 和 actFont_Underline 的 checked 属性值。

2.两个自定义槽函数的代码

用于设置字体大小和选择字体的两个组件关联的是自定义槽函数,这两个槽函数代码如下:

void MainWindow::do_fontSize_changed(int fontSize) 
{//设置字体大小的 SpinBox 
 QTextCharFormat fmt =ui->textEdit->currentCharFormat(); 
 fmt.setFontPointSize(fontSize); //设置字体大小
 ui->textEdit->mergeCurrentCharFormat(fmt); 
 progressBar1->setValue(fontSize); //状态栏上显示
} 
void MainWindow::do_fontSelected(const QFont &font) 
{//选择字体的 FontComboBox 
 labInfo->setText("字体名称:"+font.family()); //状态栏上显示
 QTextCharFormat fmt =ui->textEdit->currentCharFormat(); 
 fmt.setFont(font); 
 ui->textEdit->mergeCurrentCharFormat(fmt); 
} 

3.其他 Action 的功能实现

Action 的主要信号是 triggered()或 triggered(bool),在点击菜单项或工具按钮时,关联的 Action 就 发送此信号。用于设置粗体、斜体、下划线的 3 个 Action 的 checkable 属性为 true,选择 triggered(bool) 信号设计槽函数更合适,信号传递的 bool 类型参数表示 Action 的复选状态。对于其他 Action 可以选择 triggered()信号生成槽函数。在 Action 的 Go to slot 对话框中,选择信号为 Action 创建槽函数。

void MainWindow::on_actFont_Bold_triggered(bool checked) 
{ //粗体
 QTextCharFormat fmt =ui->textEdit->currentCharFormat(); 
 if(checked) 
 fmt.setFontWeight(QFont::Bold); 
 else 
 fmt.setFontWeight(QFont::Normal); 
 ui->textEdit->mergeCurrentCharFormat(fmt); 
} 
void MainWindow::on_actFont_Italic_triggered(bool checked) 
{ //斜体
 QTextCharFormat fmt =ui->textEdit->currentCharFormat(); 
 fmt.setFontItalic(checked); 
 ui->textEdit->mergeCurrentCharFormat(fmt); 
} 
void MainWindow::on_actFont_UnderLine_triggered(bool checked) 
{ //下划线
 QTextCharFormat fmt =ui->textEdit->currentCharFormat(); 
 fmt.setFontUnderline(checked); 
 ui->textEdit->mergeCurrentCharFormat(fmt); 
} 
void MainWindow::on_actFile_Save_triggered() 
{ //保存文件
 ui->textEdit->document()->setModified(false); //表示已经保存过了,改变修改状态
 labFile->setText("文件已保存"); //状态栏上显示
} 
void MainWindow::on_actSys_ToggleText_triggered(bool checked) 
{ //是否显示工具按钮文字
 if (checked) 
 ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 
 else 
 ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); 
} 

actFile_Save 的槽函数代码并没有实际进行文件操作,而只是将 textEdit 的文档的修改状态设置为 false。如果在文本编辑器里修改了内容,文档的修改状态又会变为 true。文档的修改状态的变化会导致 textEdit 发射 modificationChanged()信号,从而自动改变 actFile_Save 的使能状态。

4.QPlainTextEdit 的信号的应用

textEdit 的几个信号与几个 Action 的公有槽 setEnabled()建立了关联,可以自动 控制 Action 的使能状态。我们还为 textEdit 的两个信号编写槽函数,以分别实现对其他几个 Action的 enabled 和 checked 属性的控制。

void MainWindow::on_textEdit_copyAvailable(bool b) 
{//copyAvailable()信号的槽函数,更新 3 个 Action 的 enabled 状态
 ui->actEdit_Cut->setEnabled(b); 
 ui->actEdit_Copy->setEnabled(b); 
 ui->actEdit_Paste->setEnabled(ui->textEdit->canPaste()); 
} 
void MainWindow::on_textEdit_selectionChanged() 
{//selectionChanged()信号的槽函数,更新 3 种字体样式的 checked 状态
 QTextCharFormat fmt= ui->textEdit->currentCharFormat(); 
 ui->actFont_Bold->setChecked(fmt.font().bold()); //粗体
 ui->actFont_Italic->setChecked(fmt.fontItalic()); //斜体
 ui->actFont_UnderLine->setChecked(fmt.fontUnderline()); //下划线
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值