参考书籍:《Qt5.9 c++开发指南》
先上效果图:
action创建
什么是action?
使用action可以创建菜单项,工具栏按钮,也可以设置QToolButton按钮的关联action,点击这些action创建的菜单项,按钮就执行action的槽函数。
1.资源文件创建,即等会action要用到的图标图片,点击File->new File or priject然后如下操作
2.action创建
3.action与槽函数绑定
代码
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QFontComboBox>
#include <QLabel>
#include <QMainWindow>
#include <QProgressBar>
#include <QSpinBox>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QString fCurFileName;//当前文件名
QLabel *fLabCurFile;//状态栏里显示当前文件的Label
QProgressBar *progressBar1;//状态栏上的进度条
QSpinBox *spinFontSize;// 字体大写
QFontComboBox *comboFont;//字体名称
void updateCurFile(QString aFile);//更新当前文件名,并更新状态栏提示
void iniUI(); //程序设计的UI初始化
void iniSignalSlots(); //手工关联信号与槽
void createNew();
private slots:
//UI界面设计生成的槽函数
void on_actFontBold_triggered(bool checked); //粗体Action
void on_actFontItalic_triggered(bool checked); //斜体Action
void on_actFontUnder_triggered(bool checked); //下划线Action
void on_actNew_triggered();//新建文件
void on_actOpen_triggered();//打开文件
void on_actFont_triggered();//字体选择对话框
void on_txtEdit_selectionChanged(); //当前选择的文字发生变化,更新粗体、斜体、下划线3个action的checked状态
void on_txtEdit_copyAvailable(bool b);//有文字可copy时更新cut,copy的Enable状态
void on_actToolbarLab_triggered(bool checked); //设置工具栏按钮样式
// 自定义槽函数
void on_spinBoxFontSize_valueChanged(int aFontSize);//改变字体大小的SpinBox的响应
void on_comboFont_currentIndexChanged(const QString &arg1);//FontCombobox的响应,选择字体名称
//void on_actCut_triggered();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QFileDialog>
#include <QTextStream>
#include <QFontDialog>
#include <QCoreApplication>
#include <Qlabel>
#include <QTextCharFormat>
void MainWindow::updateCurFile(QString aFile)
{//更新当前文件名,并更新状态栏提示
fCurFileName=aFile;
fLabCurFile->setText("当前文件:"+fCurFileName);
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
iniUI();//手工初始化UI
iniSignalSlots();//信号与槽关联
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::iniUI()
{
//状态栏
fLabCurFile=new QLabel; //用于显示当前文件名的标签
fLabCurFile->setMinimumWidth(150);
fLabCurFile->setText("当前文件:");
ui->statusBar->addWidget(fLabCurFile);//添加到状态栏
progressBar1=new QProgressBar;//状态栏上的进度条
progressBar1->setMaximumWidth(200);//设置组件最大宽度
progressBar1->setMinimum(5);
progressBar1->setMaximum(50);
progressBar1->setValue(ui->txtEdit->font().pointSize());//初始值
ui->statusBar->addWidget(progressBar1); //添加到状态栏
//工具栏
spinFontSize = new QSpinBox;// 工具栏上的文字大小 SpinBox
spinFontSize->setMinimum(5);
spinFontSize->setMaximum(50);
spinFontSize->setValue(ui->txtEdit->font().pointSize());//初始值
spinFontSize->setMinimumWidth(50);//设置组件最小宽度
ui->mainToolBar->addWidget(new QLabel("字体大小 ")); //不引用的Label无需定义变量
ui->mainToolBar->addWidget(spinFontSize); //SpinBox添加到工具栏
ui->mainToolBar->addSeparator(); //工具栏上增加分隔条
ui->mainToolBar->addWidget(new QLabel(" 字体 "));
comboFont = new QFontComboBox;//字体名称ComboBox
comboFont->setMinimumWidth(150); //设置组件最小宽度
ui->mainToolBar->addWidget(comboFont);//添加到工具栏
setCentralWidget(ui->txtEdit); //将txtEdit设置为中心组件,自动填充整个工作区
}
void MainWindow::iniSignalSlots()
{ //信号与槽的关联,当函数带有参数时,必须写明参数的类型
connect(spinFontSize,SIGNAL(valueChanged(int)),
this,SLOT(on_spinBoxFontSize_valueChanged(int)));
connect(comboFont,SIGNAL(currentIndexChanged(const QString &)),
this,SLOT(on_comboFont_currentIndexChanged(const QString &)));
}
void MainWindow::on_txtEdit_copyAvailable(bool b)
{//有文字可copy时更新cut,copy的Enable状态
ui->actCut->setEnabled(b); //能否 cut
ui->actCopy->setEnabled(b); //能否copy
ui->actPaste->setEnabled(ui->txtEdit->canPaste()); //能否paste
}
void MainWindow::on_actFont_triggered()
{
bool ok;
QFont font = QFontDialog::getFont(&ok, this);
if (ok)
ui->txtEdit->setFont(font);
}
void MainWindow::on_actOpen_triggered()
{
QString curPath,aFileName;
curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
//调用打开文件对话框打开一个文件
aFileName=QFileDialog::getOpenFileName(this,tr("打开一个文件"),curPath,
"C++程序文件(*.cpp);;H头文件(*.h);;文本文件(*.txt);;所有文件(*.*)");
if (!aFileName.isEmpty())
{
QFile aFile(aFileName); //以文件方式读出
if (aFile.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream aStream(&aFile); //用文本流读取文件
while (!aStream.atEnd())
ui->txtEdit->append(aStream.readLine()); //读取一个文本行
updateCurFile(aFileName); //更新状态栏显示
}
aFile.close();
}
}
void MainWindow::on_actNew_triggered()
{//新建文件
ui->txtEdit->clear();
updateCurFile("");
}
void MainWindow::on_spinBoxFontSize_valueChanged(int aFontSize)
{//改变字体大小的SpinBox的响应
QTextCharFormat fmt;
fmt.setFontPointSize(aFontSize); //设置字体大小
ui->txtEdit->mergeCurrentCharFormat(fmt);
progressBar1->setValue(aFontSize);
}
void MainWindow::on_comboFont_currentIndexChanged(const QString &arg1)
{//FontCombobox的响应,选择字体名称
QTextCharFormat fmt;
fmt.setFontFamily(arg1);//设置字体名称
ui->txtEdit->mergeCurrentCharFormat(fmt);
}
void MainWindow::on_actToolbarLab_triggered(bool checked)
{
if (checked) //显示文字和图标
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
else //只显示图标
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
}
void MainWindow::on_actFontBold_triggered(bool checked)
{
QTextCharFormat fmt; //格式
fmt=ui->txtEdit->currentCharFormat();//获取当前选择文字的格式
if (checked) // 相当于调用ui->actFontBold->isChecked();读取Action的check状态
fmt.setFontWeight(QFont::Bold);
else
fmt.setFontWeight(QFont::Normal);
ui->txtEdit->mergeCurrentCharFormat(fmt);
}
void MainWindow::on_actFontItalic_triggered(bool checked)
{
QTextCharFormat fmt;
fmt=ui->txtEdit->currentCharFormat();
fmt.setFontItalic(checked);
ui->txtEdit->mergeCurrentCharFormat(fmt);
}
void MainWindow::on_actFontUnder_triggered(bool checked)
{
QTextCharFormat fmt;
fmt=ui->txtEdit->currentCharFormat();
fmt.setFontUnderline(checked);
ui->txtEdit->mergeCurrentCharFormat(fmt);
}
void MainWindow::on_txtEdit_selectionChanged()
{//当前选择的文字发生变化,更新粗体、斜体、下划线3个action的checked状态
QTextCharFormat fmt;
fmt=ui->txtEdit->currentCharFormat(); //获取文字的格式
ui->actFontItalic->setChecked(fmt.fontItalic()); //是否斜体
ui->actFontBold->setChecked(fmt.font().bold()); //是否粗体
ui->actFontUnder->setChecked(fmt.fontUnderline()); //是否有下划线
}
MainWindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>512</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTextEdit" name="txtEdit"/>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>512</width>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menu">
<property name="title">
<string>文件</string>
</property>
<addaction name="actNew"/>
<addaction name="actOpen"/>
<addaction name="separator"/>
<addaction name="actClose"/>
</widget>
<widget class="QMenu" name="menu_2">
<property name="title">
<string>编辑</string>
</property>
<addaction name="actCut"/>
<addaction name="actCopy"/>
<addaction name="actPaste"/>
<addaction name="separator"/>
<addaction name="actClear"/>
</widget>
<widget class="QMenu" name="menu_3">
<property name="title">
<string>格式</string>
</property>
<addaction name="actFontBold"/>
<addaction name="actFontItalic"/>
<addaction name="actFontUnder"/>
<addaction name="separator"/>
<addaction name="actToolbarLab"/>
</widget>
<addaction name="menu"/>
<addaction name="menu_2"/>
<addaction name="menu_3"/>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<widget class="QToolBar" name="mainToolBar">
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="actNew"/>
<addaction name="actOpen"/>
<addaction name="actClear"/>
<addaction name="separator"/>
<addaction name="actCut"/>
<addaction name="actCopy"/>
<addaction name="actPaste"/>
<addaction name="separator"/>
<addaction name="actFontItalic"/>
<addaction name="actFontBold"/>
</widget>
<action name="actCut">
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/cut.bmp</normaloff>:/images/images/cut.bmp</iconset>
</property>
<property name="text">
<string>剪切</string>
</property>
<property name="toolTip">
<string>复制</string>
</property>
<property name="shortcut">
<string>Ctrl+X</string>
</property>
</action>
<action name="actCopy">
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/120.bmp</normaloff>:/images/images/120.bmp</iconset>
</property>
<property name="text">
<string>拷贝</string>
</property>
<property name="shortcut">
<string>Ctrl+C</string>
</property>
</action>
<action name="actPaste">
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/paste.bmp</normaloff>:/images/images/paste.bmp</iconset>
</property>
<property name="text">
<string>黏贴</string>
</property>
<property name="shortcut">
<string>Ctrl+V</string>
</property>
</action>
<action name="actFontBold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/BLD.BMP</normaloff>:/images/images/BLD.BMP</iconset>
</property>
<property name="text">
<string>粗体</string>
</property>
</action>
<action name="actFontItalic">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/ITL.BMP</normaloff>:/images/images/ITL.BMP</iconset>
</property>
<property name="text">
<string>斜体</string>
</property>
</action>
<action name="actFontUnder">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/WORDUNDR.BMP</normaloff>:/images/images/WORDUNDR.BMP</iconset>
</property>
<property name="text">
<string>下划线</string>
</property>
</action>
<action name="actClose">
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/exit.bmp</normaloff>:/images/images/exit.bmp</iconset>
</property>
<property name="text">
<string>退出</string>
</property>
</action>
<action name="actOpen">
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/open3.bmp</normaloff>:/images/images/open3.bmp</iconset>
</property>
<property name="text">
<string>打开...</string>
</property>
</action>
<action name="actClear">
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/103.bmp</normaloff>:/images/images/103.bmp</iconset>
</property>
<property name="text">
<string>清除</string>
</property>
</action>
<action name="actFont">
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/20.ico</normaloff>:/images/images/20.ico</iconset>
</property>
<property name="text">
<string>字体设置</string>
</property>
</action>
<action name="actNew">
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/new2.bmp</normaloff>:/images/images/new2.bmp</iconset>
</property>
<property name="text">
<string>新建</string>
</property>
</action>
<action name="actToolbarLab">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/images/images/430.bmp</normaloff>:/images/images/430.bmp</iconset>
</property>
<property name="text">
<string>显示工具栏文字标签</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
<include location="res.qrc"/>
</resources>
<connections>
<connection>
<sender>actPaste</sender>
<signal>triggered()</signal>
<receiver>txtEdit</receiver>
<slot>paste()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>255</x>
<y>178</y>
</hint>
</hints>
</connection>
<connection>
<sender>actCut</sender>
<signal>triggered()</signal>
<receiver>txtEdit</receiver>
<slot>cut()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>255</x>
<y>178</y>
</hint>
</hints>
</connection>
<connection>
<sender>actCopy</sender>
<signal>triggered()</signal>
<receiver>txtEdit</receiver>
<slot>copy()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>255</x>
<y>178</y>
</hint>
</hints>
</connection>
</connections>
</ui>