实现综合实例:简单文字处软件 (二)
本章节接着上文,实现文本编辑器的新内容创建。
试着实现一下内容

首先我们创建一个新的MyChildWnd


按照以下内容添加我们的代码:

class MyChildWnd : public QTextEdit
{
Q_OBJECT
public:
MyChildWnd();
QString myCurDocPath;
void newDoc(); //创建新文档
QString getCurDocName();
bool loadDoc();
bool saveDoc();
bool savesDoc();
bool saveDocOpt();
void setAlignOfDocumentText(int aligntype);
void setParaStyle(int pstyle);
protected:
void closeEvent(QCloseEvent *event);
private:
void DocBeModified();
private:
bool beSaved;
void setCurDoc(const QString &docName);
void promptSave();
};
#endif // MYCHILDWND_H
创建文档
我们先来写我们的创建新文档内容
#include "mychildwnd.h"
MyChildWnd::MyChildWnd() {
setAttribute(Qt::WA_DeleteOnClose);//子窗口关闭时销毁该对象实例
beSaved = false;
}
void MyChildWnd::newDoc()
{
//设置窗口编号
static int wedSeqNum = 1;
//设置当前文档word 命名为"Word 文档 编号"的形式,编号在使用后自动+1
myCurDocPath = tr("Word 文档 %1").arg(wedSeqNum++);
//设置窗口标题,文档被改动后在其名称后面显示"*";
setWindowTitle(myCurDocPath+"[*]"+tr("-MyWord"));
//文档被改动时发送contentsChanged信号,执行自定义docBeModified()槽函数
connect(document(),&QTextDocument::contentsChanged,this,&MyChildWnd::DocBeModified);
}
QString MyChildWnd::getCurDocName()
{
return QFileInfo(myCurDocPath).fileName();//返回文件路径
}
接下来我们可以在MainWindow中去调用它了,修改其中的docNew
//注意在我们现在在MainWindow中加入些新的控件
private slots:
void refreshMenus();
private:
Ui::MainWindow *ui;
void formatEnabled(); //使格式主菜单及工具按钮
MyChildWnd *activateChildWnd(); //活动子文档
};
void MainWindow::docNew()
{
MyChildWnd *childWnd = new MyChildWnd;
ui->mdiArea->addSubWindow(childWnd);
connect(childWnd, &MyChildWnd::copyAvailable, ui->cutAction, &QAction::setEnabled);
connect(childWnd, &MyChildWnd::copyAvailable, ui->copyAction, &QAction::setEnabled);
childWnd->newDoc();
childWnd->show();
formatEnabled();
}
void MainWindow::formatEnabled()
{
ui->boldAction->setEnabled(true);
ui->italicAction->setEnabled(true);
ui->underlineAction->setEnabled(true);
ui->leftAlignction->setEnabled(true);
ui->centerAction->setEnabled(true);
ui->rightAlignAction->setEnabled(true);
ui->justifyAction->setEnabled(true);
ui->colorAction->setEnabled(true);
}
void MainWindow::on_newAction_triggered() //注意这里我们的新建控件转到槽添加triggered
{
docNew();
}
这样我们就可以实现加入新窗口了,
接下来我们进行些新的设计,刷新。即加入新的窗口我们应该如何解决
首先在initWindow中加入:
refreshMenus();
connect(ui->mdiArea, &QMdiArea::subWindowActivated , this, &MainWindow::refreshMenus);
在init中我们也要加入两句新的内容
MyChildWnd* MainWindow::activateChildWnd() {
if (QMdiSubWindow* actSubWnd = ui->mdiArea->activeSubWindow()) {
return qobject_cast<MyChildWnd*>(actSubWnd->widget());
} else {
return nullptr;
}
}
void MainWindow::refreshMenus()
{
MyChildWnd* childWnd = activateChildWnd();
bool hasCiled = (childWnd != nullptr);
qDebug() << "Has active child window:" << hasCiled;
ui->saveAction->setEnabled(hasCiled);
ui->saveAsAction->setEnabled(hasCiled);
ui->printAction->setEnabled(hasCiled);
ui->printPreviewAction->setEnabled(hasCiled);
ui->pasteAction->setEnabled(hasCiled);
ui->closeAction->setEnabled(hasCiled);
ui->clossALLAction->setEnabled(hasCiled);
ui->tileAction->setEnabled(hasCiled);
ui->casecadeAction->setEnabled(hasCiled);
ui->nextAction->setEnabled(hasCiled);
ui->previousAction->setEnabled(hasCiled);
ui->saveAsAction->setEnabled(hasCiled);
bool hasSelect = false;
if (childWnd) {
hasSelect = childWnd->textCursor().hasSelection(); // 用于判断是否选中其中打开内容
}
qDebug() << "Has selection in active child window:" << hasSelect;
ui->cutAction->setEnabled(hasSelect);
ui->copyAction->setEnabled(hasSelect);
ui->boldAction->setEnabled(hasSelect);
ui->italicAction->setEnabled(hasSelect);
ui->underlineAction->setEnabled(hasSelect);
ui->leftAlignction->setEnabled(hasSelect);
ui->rightAlignAction->setEnabled(hasSelect);
ui->centerAction->setEnabled(hasSelect);
ui->justifyAction->setEnabled(hasSelect);
ui->colorAction->setEnabled(hasSelect);
}
OK 我们现在已经实现加入新窗口并进行刷新了
接下来我们来实现窗口功能,这个比较简单:
我们只需要如下操作:
//添加如下模块
private slots:
void addSubWndListMenu();
其函数内容:
void MainWindow::addSubWndListMenu()
{
ui->menu_W->clear();
ui->menu_W->addAction(ui->closeAction);
ui->menu_W->addAction(ui->clossALLAction);
ui->menu_W->addSeparator();
ui->menu_W->addAction(ui->tileAction);
ui->menu_W->addAction(ui->casecadeAction);
ui->menu_W->addSeparator();
ui->menu_W->addSeparator();
ui->menu_W->addAction(ui->nextAction);
ui->menu_W->addAction(ui->previousAction);
QList<QMdiSubWindow*> wnds = ui->mdiArea->subWindowList();
for (int i = 0; i < wnds.size(); i++) {
MyChildWnd* childwnd = qobject_cast<MyChildWnd*>(wnds.at(i)->widget());
QString menuitem_text;
if (i < 9) {
menuitem_text = tr("&%1 %2").arg(childwnd->getCurDocName());
} else {
menuitem_text = tr("%1 %2").arg(childwnd->getCurDocName());
}
QAction *menuitem_act = ui->menu_W->addAction(menuitem_text);
menuitem_act->setCheckable(true);
menuitem_act->setChecked(childwnd == activateChildWnd());
// Capture this and wnds.at(i) in the lambda
connect(menuitem_act, &QAction::toggled, this, [this, subWindow = wnds.at(i)](bool checked) {
qDebug() << "noe subWindow";
QMdiSubWindow* mdiSubWindow = qobject_cast<QMdiSubWindow*>(subWindow);
if (mdiSubWindow) {
ui->mdiArea->setActiveSubWindow(mdiSubWindow);
} else {
qWarning() << "Error: subWindow is not a QMdiSubWindow instance.";
}
});
}
formatEnabled();
}
这里我们其实就是遍历活动窗口,检擦那个活动窗口是用户选中的,最后通过
if (mdiSubWindow) {
ui->mdiArea->setActiveSubWindow(mdiSubWindow);
} else {
qWarning() << "Error: subWindow is not a QMdiSubWindow instance.";
}这个函数进行反馈实现显示
void MainWindow::on_nextAction_triggered()
{
ui->mdiArea->activateNextSubWindow();
}
void MainWindow::on_previousAction_triggered()
{
ui->mdiArea->activatePreviousSubWindow();
}
void MainWindow::on_tileAction_triggered()
{
ui->mdiArea->tileSubWindows();
}
void MainWindow::on_closeAction_triggered()
{
ui->mdiArea->closeActiveSubWindow();
}
void MainWindow::on_clossALLAction_triggered()
{
ui->mdiArea->closeAllSubWindows();
}
void MainWindow::on_casecadeAction_triggered()
{
ui->mdiArea->cascadeSubWindows();
}
保存窗口
关于保存窗口

浙公网安备 33010602011771号