使用QMainWindow、QMenuBar,QToolBar文本编辑器代码实现

实现

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("已保存状态");
}

效果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值