实现综合实例:简单文字处软件 (二)

本章节接着上文,实现文本编辑器的新内容创建。

试着实现一下内容

首先我们创建一个新的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();
}

保存窗口

关于保存窗口

posted @ 2024-12-16 19:41  安娜アンナ  阅读(34)  评论(0)    收藏  举报