1、新建项目
-创建wps类
-继承QMainWindow
2、菜单栏设置
3、开始实现操作
设置程序图标:
pro文件中添加 RC_ICONS += images/wps.ico //后面这个是文件地址哈
1、字体选择大小设置
void MainWindow::initMainWindow()
{
// 初始化字号列表项
QFontDatabase fontdb; // 创建 QFontDatabase 对象,用于管理字体信息
foreach(int fontsize, fontdb.standardSizes()) // 遍历标准字号列表
{
// 将当前字号添加到字号下拉框中
ui->sizeComboBox->addItem(QString::number(fontsize));
QFont defFont; // 定义 QFont 对象,用于获取当前默认的字体信息
QString sFontSize; // 用于存储默认字体的字号的字符串形式
int defFontSize; // 存储默认字体的字号
int defFontIndex; // 存储在字号下拉框中的默认字号的索引位置
defFont = QApplication::font(); // 获取当前应用程序的默认字体
defFontSize = defFont.pointSize(); // 获取默认字体的字号
sFontSize = QString::number(defFontSize); // 将字号转换为字符串形式
defFontIndex = ui->sizeComboBox->findText(sFontSize); // 在字号下拉框中查找默认字号的索引位置
ui->sizeComboBox->setCurrentIndex(defFontIndex); // 将字号下拉框设置为默认字号
//滚动条多文档区域
ui->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
ui->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
refreshMenus();
connect(ui->mdiArea,&QMdiArea::subWindowActivated,this,&MainWindow::refreshMenus);
}
}
2、子类ChildWmd设置
头文件:
#ifndef CHILDWND_H
#define CHILDWND_H
#include <QTextEdit>
#include <QObject>
class ChildWnd : public QTextEdit
{
Q_OBJECT
public:
ChildWnd();
QString m_CurDocPath; //当前文档路径
void newDoc(); //新建文档
QString getCurDocName();//文档路径中提取文档名
private slots:
void docBeModified(); //文件修改时候,加*
private:
bool m_bSaved; //文档是否保存
};
#endif // CHILDWND_H
实现文件:
#include "childwnd.h"
#include<QFileDialog>
#pragma execution_character_set("utf-8");
ChildWnd::ChildWnd()
{
setAttribute(Qt::WA_DeleteOnClose); //子窗口关闭销毁该类的实例对象
m_bSaved = false;
}
void ChildWnd::newDoc()
{
static int wndSeqNum = 1;
m_CurDocPath = QString("WPS 文档 %1").arg(wndSeqNum++);
//设置窗体把标题,文档改动后加*
setWindowTitle(m_CurDocPath+"[*]"+" - MyWPS");
connect(document(),SIGNAL(contentsChanged()),this,SLOT(docBeModified()));
}
QString ChildWnd::getCurDocName()
{
return QFileInfo(m_CurDocPath).fileName();
}
void ChildWnd::docBeModified()
{
setWindowModified(document()->isModified()); //文档是否被修改
}
效果展示:
window中的头文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "childwnd.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
public:
void initMainWindow();
void docNew();
private slots:
// void on_newAction_triggered();
void on_newAction_triggered();
void refreshMenus();
private:
void formatEnabled();
ChildWnd *activateChildWnd();
};
#endif // MAINWINDOW_H
window中的实现代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"childwnd.h"
#include<QMdiSubWindow>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
initMainWindow();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initMainWindow()
{
// 初始化字号列表项
QFontDatabase fontdb; // 创建 QFontDatabase 对象,用于管理字体信息
foreach(int fontsize, fontdb.standardSizes()) // 遍历标准字号列表
{
// 将当前字号添加到字号下拉框中
ui->sizeComboBox->addItem(QString::number(fontsize));
QFont defFont; // 定义 QFont 对象,用于获取当前默认的字体信息
QString sFontSize; // 用于存储默认字体的字号的字符串形式
int defFontSize; // 存储默认字体的字号
int defFontIndex; // 存储在字号下拉框中的默认字号的索引位置
defFont = QApplication::font(); // 获取当前应用程序的默认字体
defFontSize = defFont.pointSize(); // 获取默认字体的字号
sFontSize = QString::number(defFontSize); // 将字号转换为字符串形式
defFontIndex = ui->sizeComboBox->findText(sFontSize); // 在字号下拉框中查找默认字号的索引位置
ui->sizeComboBox->setCurrentIndex(defFontIndex); // 将字号下拉框设置为默认字号
//滚动条多文档区域
ui->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
ui->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
refreshMenus();
connect(ui->mdiArea,&QMdiArea::subWindowActivated,this,&MainWindow::refreshMenus);
}
}
void MainWindow::docNew()
{
// 创建新的子窗口对象
ChildWnd *childwnd = new ChildWnd;
// 将子窗口添加到 MDI 区域中
ui->mdiArea->addSubWindow(childwnd);
// 当子窗口中有文本选择时,使剪切和复制操作项可用
connect(childwnd, SIGNAL(copyAvailable(bool)), ui->cutAction, SLOT(setEnabled(bool)));
connect(childwnd, SIGNAL(copyAvailable(bool)), ui->copyAction, SLOT(setEnabled(bool)));
// 调用子窗口的 newDoc 函数,初始化新的文档
childwnd->newDoc();
// 显示子窗口
childwnd->show();
// 根据当前格式设置,更新菜单栏中的相关操作项的可用状态
formatEnabled();
}
void MainWindow::formatEnabled()
{
ui->boldAction->setEnabled(true);
ui->italicAction->setEnabled(true);
ui->underlineAction->setEnabled(true);
ui->leftAlignAction->setEnabled(true);
ui->centerAlignAction->setEnabled(true);
ui->rightAlignAction->setEnabled(true);
ui->justifyAction->setEnabled(true);
ui->colorAction->setEnabled(true);
}
ChildWnd *MainWindow::activateChildWnd()
{
QMdiSubWindow*actWnd = ui->mdiArea->activeSubWindow();//返回自创接口
if(actWnd)
return qobject_cast<ChildWnd*>(actWnd->widget());
else
return 0;
}
void MainWindow::on_newAction_triggered()
{
docNew();
}
void MainWindow::refreshMenus() //设置选择状态可有的操作
{
bool hasChild = false;
hasChild = (activateChildWnd()!=0);
ui->saveAction->setEnabled(hasChild);
ui->saveAsAction->setEnabled(hasChild);
ui->printAction->setEnabled(hasChild);
ui->printPreviewAction->setEnabled(hasChild);
ui->pasteAction->setEnabled(hasChild);
ui->closeAction->setEnabled(hasChild);
ui->closeAllAction->setEnabled(hasChild);
ui->titleAction->setEnabled(hasChild);
ui->cascadeAction->setEnabled(hasChild);
ui->nextAction->setEnabled(hasChild);
ui->previousAction->setEnabled(hasChild);
bool hasSelect = (activateChildWnd()&&activateChildWnd()->textCursor().hasSelection());
ui->cutAction->setEnabled(hasSelect);
ui->copyAction->setEnabled(hasSelect);
ui->boldAction->setEnabled(hasSelect);
ui->italicAction->setEnabled(hasSelect);
ui->underlineAction->setEnabled(hasSelect);
ui->leftAlignAction->setEnabled(hasSelect);
ui->centerAlignAction->setEnabled(hasSelect);
ui->rightAlignAction->setEnabled(hasSelect);
ui->justifyAction->setEnabled(hasSelect);
ui->colorAction->setEnabled(hasSelect);
}
效果展示: