实现
1.一些控件无法可视化设计加入,因此在构造函数中实现在toolBox中代码增加 SpinBox 用来设置字体大小,QFontCombox 设置字体;在statusBar中添加label和一个progressBar;
2.构造函数中构建控件,信号和槽绑定;
3.QPlainTexEdit的字体大小,加粗斜体下划线设置;
4.在设计界面使用信号和槽编辑器,将QPlainTexEdit 与 相关action的事件或状态关联
信号和槽连接编辑
将Undo,Redo,SelectAll等action的触发执行 连接到 textBox的Undo,Redo,SelectAll等事件上
同样,将textBox的状态 连接到action的状态上
将actionClose 连接到MainWindow的Close
.h
#ifndef MAINWINDOWEXAMPLE_H
#define MAINWINDOWEXAMPLE_H
#include <QMainWindow>
#include <QLabel>
#include <QActionGroup>
#include <QSpinBox>
#include <QFontComboBox>
#include <QProgressBar>
#include <QTextCharFormat>
namespace Ui {
class MainWindowExample;
}
class MainWindowExample : public QMainWindow
{
Q_OBJECT
private:
//加到状态栏
QLabel *labFile;
QLabel *labInfo;
QProgressBar *progressBar1;
//加到TollBox
QSpinBox *spinFontSize;
QFontComboBox *comboxFontName;
QActionGroup *actionGroup;//Action分组 用来做中英文界面互斥
//方法
void buildUI();//程序化设置界面
void buildSignalSlots();//信号和槽关联
private slots:
void do_fontSize_changed(int fontSize);//程序化控件 自定义槽函数
void do_fontSelected(const QFont &font);
void on_textEdit_copyAvailable(bool b);
void on_textEdit_selectionChanged();
void on_actFont_Bold_triggered(bool checked);
void on_actFont_Italic_triggered(bool checked);
void on_actFont_UnderLine_triggered(bool checked);
void on_actSys_ToggleText_triggered(bool checked);
void on_actFile_New_triggered();
void on_actFile_Open_triggered();
void on_actFile_Save_triggered();
public:
explicit MainWindowExample(QWidget *parent = nullptr);
~MainWindowExample();
private:
Ui::MainWindowExample *ui;
};
#endif // MAINWINDOWEXAMPLE_H
.cpp
#include "mainwindowexample.h"
#include "ui_mainwindowexample.h"
#include <QLabel>
#include <QActionGroup>
#include <QSpinBox>
#include <QFontComboBox>
#include <QProgressBar>
#include <QTextCharFormat>
MainWindowExample::MainWindowExample(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindowExample)
{
ui->setupUi(this);
//构造函数中执行控件初始化,建立信号和槽连接
buildUI();
buildSignalSlots();
//工具栏只显示图标
ui->toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
//将文本框填满整个工作区
this->setCentralWidget(ui->textEdit);
}
MainWindowExample::~MainWindowExample()
{
delete ui;
}
void MainWindowExample::buildUI()
{
//状态栏 依次添加一个显示文件名的label progressBar显示文本的字体大小 ,显示字体名称的label
labFile = new QLabel(this);
labFile->setMinimumWidth(150);
labFile->setText("文件名:");
ui->statusbar->addWidget(labFile);
progressBar1= new QProgressBar(this);
progressBar1->setMaximum(50);
progressBar1->setMinimum(5);
progressBar1->setValue(ui->textEdit->font().pointSize());//进度条值为文本框内字体的大小
ui->statusbar->addWidget(progressBar1);
labInfo = new QLabel(this);
labInfo->setText("字体名称:");
ui->statusbar->addWidget(labInfo);
// actGroup 创建 初始化配置 ;这个控件是不可见的
this->actionGroup = new QActionGroup(this);
actionGroup->addAction(ui->actLang_CN);
actionGroup->addAction(ui->actLang_EN);
actionGroup->setExclusive(true);
ui->actLang_CN->setChecked(true);
//创建toolBar上无法可视化设计的组件 无法拖入的spinBox FontCombox
spinFontSize = new QSpinBox(this);
spinFontSize->setMinimumWidth(50);
spinFontSize->setMinimum(5);
spinFontSize->setMaximum(50);
spinFontSize->setValue(ui->textEdit->font().pointSize());
ui->toolBar->addWidget(spinFontSize);
this->comboxFontName = new QFontComboBox(this);
comboxFontName->setMinimumWidth(150);
ui->toolBar->addWidget(comboxFontName);
//动态添加分割线及退出action
ui->toolBar->addSeparator();
ui->toolBar->addAction(ui->actClose);//把关闭action添加到最后
}
void MainWindowExample::buildSignalSlots()
{
connect(spinFontSize,SIGNAL(valueChanged(int)),this,SLOT(do_fontSize_changed(int)));
connect(comboxFontName,&QFontComboBox::currentFontChanged,this,
&MainWindowExample::do_fontSelected);
// connect(comboxFontName,SIGNAL(currentFontChanged(QFont)),this
// ,SLOT(do_fontSelected(QFont)))
}
//槽函数实现
void MainWindowExample::do_fontSize_changed(int fontSize)
{
QTextCharFormat format = ui->textEdit->currentCharFormat();
format.setFontPointSize(fontSize);
ui->textEdit->mergeCurrentCharFormat(format);
this->progressBar1->setValue(fontSize);
}
void MainWindowExample::do_fontSelected(const QFont &font)
{
QTextCharFormat format = ui->textEdit->currentCharFormat();
format.setFont(font);
ui->textEdit->mergeCurrentCharFormat(format);
this->labInfo->setText(QString("字体为:%1").arg(font.family()));
}
//使能设置
void MainWindowExample::on_textEdit_copyAvailable(bool b)
{
ui->actEdit_Copy->setEnabled(b);
ui->actEdit_Cut->setEnabled(b);
ui->actEdit_Paste->setEnabled(ui->textEdit->canPaste());
}
//根据选中的文字 更新 加粗,斜体,下划线action的状态
void MainWindowExample::on_textEdit_selectionChanged()
{
QTextCharFormat format = ui->textEdit->currentCharFormat();
ui->actFont_Bold->setChecked(format.font().bold());
ui->actFont_Italic->setChecked(format.fontItalic());
ui->actFont_UnderLine->setChecked(format.fontUnderline());
}
void MainWindowExample::on_actFont_Bold_triggered(bool checked)
{
QTextCharFormat format = ui->textEdit->currentCharFormat();
if(checked)
format.setFontWeight(QFont::Bold);
else
format.setFontWeight(QFont::Normal);
ui->textEdit->mergeCurrentCharFormat(format);
}
void MainWindowExample::on_actFont_Italic_triggered(bool checked)
{
QTextCharFormat format = ui->textEdit->currentCharFormat();
format.setFontItalic(checked);
ui->textEdit->mergeCurrentCharFormat(format);
}
void MainWindowExample::on_actFont_UnderLine_triggered(bool checked)
{
QTextCharFormat format = ui->textEdit->currentCharFormat();
format.setFontUnderline(checked);
ui->textEdit->mergeCurrentCharFormat(format);
}
void MainWindowExample::on_actSys_ToggleText_triggered(bool checked)
{
if(checked)
ui->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
else
ui->toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
}
void MainWindowExample::on_actFile_New_triggered()
{
ui->textEdit->clear();
ui->textEdit->document()->setModified(false);
labFile->setText("新建了一个文件");
}
void MainWindowExample::on_actFile_Open_triggered()
{
labFile->setText("打开的文件");
}
void MainWindowExample::on_actFile_Save_triggered()
{
ui->textEdit->document()->setModified(false);//表示已保存
labFile->setText("已保存状态");
}
效果