【qt】一个WPS项目了解qt界面设计的基本套路

项目功能演示:
在这里插入图片描述

放心食用!最后有完整代码.
超级详细,期待您的一个点赞❥(^_-)

一览全局:
在这里插入图片描述

WPS项目目录

  • 一.创建项目
  • 二.导入资源
  • 三.ui设计
  • 四.字号选择框初始化
  • 五.滚动条初始化
  • 六.添加自定义文本类
  • 七.初始化action状态
  • 八.新建文档
  • 九.打开文件
  • 十.保存与另存为
  • 十一.打印/打印预览
  • 十二.撤销重做剪切复制粘贴
  • 十三.关闭事件/退出
  • 十四.窗体菜单实现
  • 十五.动态添加action/信号映射器
  • 十六.字体颜色加粗斜体下划线
  • 十七.文本对齐
  • 十八.段落符号
  • 十九.字体字号
  • 二十.打包
  • 二十一.发布
  • 二十二.完整代码
  • 二十三.最后

一.创建项目

在这里插入图片描述
在这里插入图片描述
用的是QMainWindow类,这个包含菜单,工具栏,状态栏.
在这里插入图片描述
在这里插入图片描述
能运行出来,就说明环境搭好了.
在这里插入图片描述

二.导入资源

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.ui设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
应用图标的添加.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四.字号选择框初始化

在这里插入图片描述
在这里插入图片描述
获取系统可支持的字号添加到选择框中,再设置当前系统字号
在这里插入图片描述
在这里插入图片描述

五.滚动条初始化

在这里插入图片描述
滚动条就是这个,这是用的后面做完的来演示的.
在这里插入图片描述

六.添加自定义文本类

在这里插入图片描述
在这里插入图片描述
记得添加宏Q_OBJECT,还有初始化父类
在这里插入图片描述
在这里插入图片描述

七.初始化action状态

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

八.新建文档

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

九.打开文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十.保存与另存为

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十一.打印/打印预览

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

十二.撤销重做剪切复制粘贴

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十三.关闭事件/退出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十四.窗体菜单实现

在这里插入图片描述
在这里插入图片描述

十五.动态添加action/信号映射器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十六.字体颜色加粗斜体下划线

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

十七.文本对齐

在这里插入图片描述
在这里插入图片描述

十八.段落符号

在这里插入图片描述

void MainWindow::on_comboBoxStandard_activated(int index)
{TextEdit*edit=activateWindow();if(edit){if(index==0){QTextCursor cursor=edit->textCursor();cursor.beginEditBlock();QTextList*list=cursor.currentList();if(list){list->remove(cursor.block());QTextBlockFormat blockFormat=cursor.blockFormat();blockFormat.setIndent(0);cursor.setBlockFormat(blockFormat);}cursor.endEditBlock();return;}QTextListFormat::Style style;//描述装饰列表项符号的枚举switch (index){case 1:style=QTextListFormat::ListDisc;break;case 2:style=QTextListFormat::ListCircle;break;case 3:style=QTextListFormat::ListSquare;break;case 4:style=QTextListFormat::ListDecimal;break;case 5:style=QTextListFormat::ListLowerAlpha;break;case 6:style=QTextListFormat::ListUpperAlpha;break;case 7:style=QTextListFormat::ListLowerRoman;break;case 8:style=QTextListFormat::ListUpperRoman;break;default:style=QTextListFormat::ListStyleUndefined;//0break;}QTextCursor cursor=edit->textCursor();cursor.beginEditBlock();QTextBlockFormat blockFormat=cursor.blockFormat();QTextListFormat listFormat;QTextList*list=cursor.currentList();if(list){listFormat=list->format();list->remove(cursor.block());blockFormat.setIndent(0);cursor.setBlockFormat(blockFormat);}listFormat.setStyle(style);cursor.createList(listFormat);cursor.endEditBlock();}
}

十九.字体字号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二十.打包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二十一.发布

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二十二.完整代码

main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "textedit.h"
#include <QMdiSubWindow>
#include <QPrinter>
#include <QActionGroup>
#include <QSignalMapper>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_NewAction_triggered();void setActionStatus(bool b);void on_OpenAction_triggered();void on_saveAction_triggered();void on_saveAsAction_triggered();void on_printAction_triggered();void on_printViewAction_triggered();void printPreview(QPrinter*printer);void on_undoAction_triggered();void on_redoAction_triggered();void on_cutAction_triggered();void on_copyAction_triggered();void on_pasteAction_triggered();void on_exitAction_triggered();void on_closeAction_triggered();void on_closeAllAction_triggered();void on_tileAction_triggered();void on_cascadeAction_triggered();void on_nextAction_triggered();void on_previousAction_triggered();void addSubWindowAction();void setActiveSubWindow(QWidget*widget);void on_colorAction_triggered();void on_blodAction_triggered();void on_italicAction_triggered();void on_underLineAction_triggered();void on_leftAlignAction_triggered();void on_centerAction_triggered();void on_rightAlignAction_triggered();void on_justifyAction_triggered();void on_comboBoxStandard_activated(int index);void on_fontComboBox_activated(const QString &arg1);void on_comboBoxFontSize_activated(const QString &arg1);protected:void closeEvent(QCloseEvent *event)override;//重写关闭事件private:Ui::MainWindow *ui;void init();//初始化函数void initFontSize();//初始化字号void initScrollBar();//初始化滚动条void initWindowAction();//初始化窗体相关的actionvoid initDocAction();//初始化文本相关的actionTextEdit* activateWindow();//获取当前活动窗口QMdiSubWindow * findSubWindow(const QString&docName);//获取相应文档的子窗体QActionGroup*actionGroup;QSignalMapper*mapper;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFontDatabase>
#include <QMdiSubWindow>
#include <QFileDialog>
#include <QFileInfo>
#include <QPrinter>
#include <QPrintDialog>
#include <QPrintPreviewDialog>
#include <QCloseEvent>
#include <QColorDialog>
#include <QTextCharFormat>
#include <QTextList>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this); init();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::init()
{ui->mdiArea->setBackground(QBrush(Qt::white));//用画刷设置mdi背景颜色initFontSize();initScrollBar();initWindowAction();//当窗口关闭时发送一次信号,重新设置窗口action. initWindowActionconnect(ui->mdiArea,&QMdiArea::subWindowActivated,this,&MainWindow::initWindowAction);connect(ui->mdiArea,&QMdiArea::subWindowActivated,this,&MainWindow::initDocAction);initDocAction();actionGroup=new QActionGroup(this);actionGroup->setExclusive(true);//排他选择mapper=new QSignalMapper(this);connect(ui->menu_W,&QMenu::aboutToShow,this,&MainWindow::addSubWindowAction);connect(mapper,SIGNAL(mapped(QWidget*)),this,SLOT(setActiveSubWindow(QWidget*)));
}void MainWindow::initFontSize()
{ui->comboBoxFontSize->clear();//QFontDatabase提供系统可用字体的相关信息for(int fontSize:QFontDatabase::standardSizes())//返回标准字体大小的列表{ui->comboBoxFontSize->addItem(QString::number(fontSize));//插入到字体选择框中}QFont appFont=QApplication::font();//当前系统默认字体int fontSize=appFont.pointSize(); //获取字体号int sizeIndex=ui->comboBoxFontSize->findText(QString::number(fontSize));ui->comboBoxFontSize->setCurrentIndex(sizeIndex);
}void MainWindow::initScrollBar()
{//设置mdi的水平和垂直滚动条当需要的时候ui->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);ui->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
}void MainWindow::initWindowAction()
{bool hasActWindow=(activateWindow()!=nullptr);ui->saveAction->setEnabled(hasActWindow);ui->saveAsAction->setEnabled(hasActWindow);ui->printAction->setEnabled(hasActWindow);ui->printViewAction->setEnabled(hasActWindow);ui->undoAction->setEnabled(hasActWindow);ui->redoAction->setEnabled(hasActWindow);ui->pasteAction->setEnabled(hasActWindow);ui->closeAction->setEnabled(hasActWindow);ui->closeAllAction->setEnabled(hasActWindow);ui->tileAction->setEnabled(hasActWindow);ui->cascadeAction->setEnabled(hasActWindow);ui->nextAction->setEnabled(hasActWindow);ui->previousAction->setEnabled(hasActWindow);
}void MainWindow::initDocAction()
{ui->cutAction->setEnabled(false);ui->copyAction->setEnabled(false);ui->colorAction->setEnabled(false);ui->blodAction->setEnabled(false);ui->italicAction->setEnabled(false);ui->underLineAction->setEnabled(false);ui->leftAlignAction->setEnabled(false);ui->centerAction->setEnabled(false);ui->rightAlignAction->setEnabled(false);ui->justifyAction->setEnabled(false);
}TextEdit *MainWindow::activateWindow()
{QMdiSubWindow*window=ui->mdiArea->activeSubWindow();if(window){return qobject_cast<TextEdit*>(window->widget());}return nullptr;
}QMdiSubWindow *MainWindow::findSubWindow(const QString &docName)
{QString filepath=QFileInfo(docName).canonicalFilePath();//返回文件的绝对路径for(QMdiSubWindow*sub:ui->mdiArea->subWindowList()){TextEdit* edit=qobject_cast<TextEdit*>(sub->widget());if(edit->getDocFilePath()==filepath){return sub;}}return nullptr;
}void MainWindow::on_NewAction_triggered()
{TextEdit*edit=new TextEdit;ui->mdiArea->addSubWindow(edit);//edit父对象将是QMdiArea的viewport小部件//当文本编辑器选中或者取消选中会发出copyAvailable信号.connect(edit,&TextEdit::copyAvailable,this,&MainWindow::setActionStatus);edit->initNewDoc();edit->show();
}void MainWindow::setActionStatus(bool b)
{ui->cutAction->setEnabled(b);ui->copyAction->setEnabled(b);ui->colorAction->setEnabled(b);ui->blodAction->setEnabled(b);ui->italicAction->setEnabled(b);ui->underLineAction->setEnabled(b);ui->leftAlignAction->setEnabled(b);ui->centerAction->setEnabled(b);ui->rightAlignAction->setEnabled(b);ui->justifyAction->setEnabled(b);
}void MainWindow::on_OpenAction_triggered()
{QString docName=QFileDialog::getOpenFileName(this,"打开文档","./","所以文件(*.*)");if(!docName.isEmpty()){QMdiSubWindow*sub=findSubWindow(docName);if(sub){ui->mdiArea->setActiveSubWindow(sub);return;}TextEdit*edit=new TextEdit;ui->mdiArea->addSubWindow(edit);connect(edit,&TextEdit::copyAvailable,this,&MainWindow::setActionStatus);if(edit->loadDoc(docName)){statusBar()->showMessage("文档已打开",3000);//3秒显示在状态栏edit->show();}else{edit->close();}}
}void MainWindow::on_saveAction_triggered()
{TextEdit* edit=activateWindow();if(edit){if(edit->saveDoc()){statusBar()->showMessage("文档已保存",3000);}}
}void MainWindow::on_saveAsAction_triggered()
{TextEdit* edit=activateWindow();if(edit){if(edit->saveAsDoc()){statusBar()->showMessage("文档已保存",3000);}}
}void MainWindow::on_printAction_triggered()
{TextEdit* edit=activateWindow();if(!edit) return;//QPrinter::HighResolution将printer分辨率设置为正在使用的打印机分辨率QPrinter printer(QPrinter::HighResolution);QPrintDialog dialog(&printer,this);if(dialog.exec()==QDialog::Accepted){edit->print(&printer);}
}void MainWindow::on_printViewAction_triggered()
{TextEdit* edit=activateWindow();if(!edit) return;QPrinter printer;QPrintPreviewDialog preview(&printer,this);connect(&preview,&QPrintPreviewDialog::paintRequested,this,&MainWindow::printPreview);if(preview.exec()==QPrintPreviewDialog::Accepted){edit->print(&printer);}
}void MainWindow::printPreview(QPrinter*printer)
{TextEdit* edit=activateWindow();if(edit){edit->print(printer);}
}void MainWindow::on_undoAction_triggered()
{TextEdit*edit=activateWindow();if(edit){edit->undo();}
}void MainWindow::on_redoAction_triggered()
{TextEdit*edit=activateWindow();if(edit){edit->redo();}
}void MainWindow::on_cutAction_triggered()
{TextEdit*edit=activateWindow();if(edit){edit->cut();}
}void MainWindow::on_copyAction_triggered()
{TextEdit*edit=activateWindow();if(edit){edit->copy();}
}void MainWindow::on_pasteAction_triggered()
{TextEdit*edit=activateWindow();if(edit){edit->paste();}
}void MainWindow::closeEvent(QCloseEvent *event)
{ui->mdiArea->closeAllSubWindows();if(ui->mdiArea->currentSubWindow()){event->ignore();}else{event->accept();}
}void MainWindow::on_exitAction_triggered()
{close();
}void MainWindow::on_closeAction_triggered()
{ui->mdiArea->closeActiveSubWindow();
}void MainWindow::on_closeAllAction_triggered()
{ui->mdiArea->closeAllSubWindows();
}void MainWindow::on_tileAction_triggered()
{ui->mdiArea->tileSubWindows();
}void MainWindow::on_cascadeAction_triggered()
{ui->mdiArea->cascadeSubWindows();
}void MainWindow::on_nextAction_triggered()
{ui->mdiArea->activateNextSubWindow();
}void MainWindow::on_previousAction_triggered()
{ui->mdiArea->activatePreviousSubWindow();
}void MainWindow::addSubWindowAction()
{QList<QAction*> actionList=actionGroup->actions();if(!actionList.isEmpty()){for(QAction*action:actionList){delete action;}}QList<QMdiSubWindow*>subWindowList=ui->mdiArea->subWindowList();//获取子窗体列表if(!subWindowList.isEmpty())ui->menu_W->addSeparator();//添加一个分隔符for(int i=0;i<subWindowList.count();i++){QMdiSubWindow*subWindow=subWindowList[i];TextEdit*edit=qobject_cast<TextEdit*>(subWindow->widget());QString action_text=QString("%1 %2").arg(i+1).arg(edit->getDocWindowTitle());QAction* action=ui->menu_W->addAction(action_text);actionGroup->addAction(action);action->setCheckable(true);if(edit==activateWindow())action->setChecked(true);//设置选中connect(action,SIGNAL(triggered(bool)),mapper,SLOT(map()));mapper->setMapping(action,subWindow);}}void MainWindow::setActiveSubWindow(QWidget *widget)
{if(widget)ui->mdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow*>(widget));
}void MainWindow::on_colorAction_triggered()
{TextEdit*edit=activateWindow();if(edit){QColor color;color=QColorDialog::getColor();if(!color.isValid())return ;QTextCharFormat format;format.setForeground(color);edit->mergeCurrentCharFormat(format);QPixmap pixmap(24,24);pixmap.fill(color);ui->colorAction->setIcon(pixmap);}
}void MainWindow::on_blodAction_triggered()
{TextEdit*edit=activateWindow();if(edit){bool ischecked=ui->blodAction->isChecked();QTextCharFormat format;format.setFontWeight(ischecked?QFont::Bold:QFont::Normal);edit->mergeCurrentCharFormat(format);}
}void MainWindow::on_italicAction_triggered()
{TextEdit*edit=activateWindow();if(edit){QTextCharFormat format;format.setFontItalic(ui->italicAction->isChecked());edit->mergeCurrentCharFormat(format);}
}void MainWindow::on_underLineAction_triggered()
{TextEdit*edit=activateWindow();if(edit){QTextCharFormat format;format.setFontUnderline(ui->underLineAction->isChecked());edit->mergeCurrentCharFormat(format);}
}void MainWindow::on_leftAlignAction_triggered()
{TextEdit*edit=activateWindow();if(edit){edit->setAlignment(Qt::AlignLeft);}
}void MainWindow::on_centerAction_triggered()
{TextEdit*edit=activateWindow();if(edit){edit->setAlignment(Qt::AlignCenter);}
}void MainWindow::on_rightAlignAction_triggered()
{TextEdit*edit=activateWindow();if(edit){edit->setAlignment(Qt::AlignRight);}
}void MainWindow::on_justifyAction_triggered()
{TextEdit*edit=activateWindow();if(edit){edit->setAlignment(Qt::AlignJustify);}
}void MainWindow::on_comboBoxStandard_activated(int index)
{TextEdit*edit=activateWindow();if(edit){if(index==0){QTextCursor cursor=edit->textCursor();cursor.beginEditBlock();QTextList*list=cursor.currentList();if(list){list->remove(cursor.block());QTextBlockFormat blockFormat=cursor.blockFormat();blockFormat.setIndent(0);cursor.setBlockFormat(blockFormat);}cursor.endEditBlock();return;}QTextListFormat::Style style;//描述装饰列表项符号的枚举switch (index){case 1:style=QTextListFormat::ListDisc;break;case 2:style=QTextListFormat::ListCircle;break;case 3:style=QTextListFormat::ListSquare;break;case 4:style=QTextListFormat::ListDecimal;break;case 5:style=QTextListFormat::ListLowerAlpha;break;case 6:style=QTextListFormat::ListUpperAlpha;break;case 7:style=QTextListFormat::ListLowerRoman;break;case 8:style=QTextListFormat::ListUpperRoman;break;default:style=QTextListFormat::ListStyleUndefined;//0break;}QTextCursor cursor=edit->textCursor();cursor.beginEditBlock();QTextBlockFormat blockFormat=cursor.blockFormat();QTextListFormat listFormat;QTextList*list=cursor.currentList();if(list){listFormat=list->format();list->remove(cursor.block());blockFormat.setIndent(0);cursor.setBlockFormat(blockFormat);}listFormat.setStyle(style);cursor.createList(listFormat);cursor.endEditBlock();}
}void MainWindow::on_fontComboBox_activated(const QString &arg1)
{TextEdit* edit=activateWindow();if(edit){QTextCharFormat format;format.setFontFamily(arg1);edit->mergeCurrentCharFormat(format);}
}void MainWindow::on_comboBoxFontSize_activated(const QString &arg1)
{TextEdit* edit=activateWindow();if(edit){QTextCharFormat format;format.setFontPointSize(arg1.toInt());edit->mergeCurrentCharFormat(format);}
}

textedit.h

#ifndef TEXTEDIT_H
#define TEXTEDIT_H
#include <QTextEdit>class TextEdit : public QTextEdit
{Q_OBJECT
public:TextEdit(QWidget*parent=nullptr);~TextEdit();void initNewDoc(); //初始化新建文档QString getDocFilePath()const;//获取文件路径bool loadDoc(const QString&docName);//读取文件内容bool saveDoc();//保存文档bool saveAsDoc();//另存为QString getDocWindowTitle()const;protected:void closeEvent(QCloseEvent *event)override;//重写关闭事件private:QString getDocName()const;void initOpenDoc(const QString&docName);//初始化打开的文档bool writeToDoc(const QString&docName);//写文件bool promptSave();//提示是否保存private slots:void setWindowModality();//设置WindowModality属性private:QString docWindowTitle; //文档标题static int docNo;//文档编号QString docFilePath;//文档路径
};#endif // TEXTEDIT_H

textedit.cpp

#include "textedit.h"
#include <QFile>
#include <QFileInfo>
#include <QFileDialog>
#include <QTextDocumentWriter>
#include <QCloseEvent>
#include <QMessageBox>int TextEdit::docNo=1;TextEdit::TextEdit(QWidget *parent):QTextEdit(parent)
{setAttribute(Qt::WA_DeleteOnClose);//关闭窗口时,释放资源docWindowTitle="";docFilePath="";//路径初始化为空可以区分是否是打开的文档
}TextEdit::~TextEdit()
{}void TextEdit::initNewDoc()
{docWindowTitle=QString("文档 %1").arg(docNo++);//使用windowModified机制,添加[*]占位符//当窗口显示的文档未保存时,*就显示出来setWindowTitle(docWindowTitle + "[*]");//当文档内容发生改变,发出contentsChanged信号//document() 返回当前TextEdit文档connect(document(),&QTextDocument::contentsChanged,this,&TextEdit::setWindowModality);
}QString TextEdit::getDocFilePath() const
{return this->docFilePath;
}QString TextEdit::getDocName() const
{return QFileInfo(this->docFilePath).fileName();//获取文件名称
}bool TextEdit::loadDoc(const QString &docName)
{if(!docName.isEmpty()){QFile file(docName);if(!file.exists())return false;//文件不存在if(!file.open(QFile::ReadOnly))return false;//打开文件失败QByteArray text=file.readAll();//读取文件内容if(Qt::mightBeRichText(text))//如果是富文件{setHtml(text);//富文本显示}else{setPlainText(text);//纯文本显示}initOpenDoc(docName);}return true;
}bool TextEdit::saveDoc()
{if(document()->isModified())//文档是否被修改{if(!docFilePath.isEmpty())//路径是否为空{return writeToDoc(docFilePath);//写文件}else{return saveAsDoc();//另存为}}return false;
}bool TextEdit::saveAsDoc()
{QString docName=QFileDialog::getSaveFileName(this,"另存为","./","HTML文档(*.html);;文本文件(*.txt)");if(docName.isEmpty())return false;return writeToDoc(docName);
}QString TextEdit::getDocWindowTitle() const
{return this->docWindowTitle;
}bool TextEdit::promptSave()
{if(!document()->isModified()){return true;}QMessageBox::StandardButton res;res=QMessageBox::warning(this,"提示",QString("%1已修改,是否保存?").arg(docWindowTitle),QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);if(res==QMessageBox::Yes){return saveDoc();}else if(res==QMessageBox::No){return true;}else if(res==QMessageBox::Cancel){return false;}}void TextEdit::closeEvent(QCloseEvent *event)
{if(promptSave()){event->accept();}else{event->ignore();}
}void TextEdit::initOpenDoc(const QString &docName)
{docFilePath=QFileInfo(docName).canonicalFilePath();docWindowTitle=getDocName()+" "+QString::number(docNo++);setWindowTitle(docWindowTitle + "[*]");connect(document(),&QTextDocument::contentsChanged,this,&TextEdit::setWindowModality);
}bool TextEdit::writeToDoc(const QString &docName)
{//QTextDocumentWriter将QTextDocument写入文件QTextDocumentWriter docWriter(docName);if(docWriter.write(document())){docFilePath=QFileInfo(docName).canonicalFilePath();document()->setModified(false);//文档未改动setWindowModified(false);//不显示占位符标识}return true;
}void TextEdit::setWindowModality()
{setWindowModified(document()->isModified());//根据是否改动来设置是否显示*
}

二十三.最后

现在是2024年9月20日15:57:22,让时间见证这一切吧,继续前进!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145725.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

QT设置git仓库

笔者最近想写一个qt的程序&#xff0c;想要把这个代码推送到github上。 前提是电脑已安装了git、QT 以下是设置步骤&#xff1a; 1.设置QT中关于git的配置 打开QT&#xff0c;点击工具-》选项-》版本控制-》填写PATH 这个PATH是你安装git的绝对路径&#xff0c;如果你不记得…

HTTP中的Cookie与Session

一、背景 HTTP协议是无状态无连接的。 无状态&#xff1a;服务器不会保存客户端历史请求记录&#xff0c;每一次请求都是全新的。 无连接&#xff1a;服务器应答后关闭连接&#xff0c;每次请求都是独立的。 无状态就导致服务器不认识每一个请求的客户端是否登陆过。 这时…

Mybatis框架映射---代码实现(XML配置以及注解形式)

目录 一. 映射关系 1 对 1-映射方式 1.通过xml文件实现映射的一对一关系 总结 &#xff1a; 2.通过注解的方式来实现下面的 1 对 1 的映射关系&#xff0c;实现级联查询 总结&#xff1a; 二. 映射关系多对一 1.通过xml文件实现映射的多对一关系 2.通过注解的方式来实现…

【Elasticsearch系列十五】强大特性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MapReduce基本原理

目录 整体执行流程​ Map端执行流程 Reduce端执行流程 Shuffle执行流程 整体执行流程 八部曲 读取数据--> 定义map --> 分区 --> 排序 --> 规约 --> 分组 --> 定义reduce --> 输出数据 首先将文件进行切片&#xff08;block&#xff09;处理&#xff…

EsDA,一站式嵌入式软件

EsDA是一套面向工业智能物联领域的嵌入式系统设计自动化工具集&#xff0c;包含实时操作系统AWorksLP、低代码开发平台AWStudio、资源管理平台AXPI、跨平台GUI引擎AWTK和云服务平台ZWS&#xff0c;旨在提高嵌入式软件开发的效率、性能和可扩展性。 EsDA全称是嵌入式系统设计自动…

司南 OpenCompass 九月大语言模型评测榜单启动召集,欢迎新合作厂商申请评测

主要概览 司南 OpenCompass 大语言模型官方自建榜单&#xff08;9 月榜&#xff09;评测拟定于 10 月上旬发布&#xff0c;现诚挚邀请新加入的合作方参与评测。本次评测围绕强化能力维度&#xff0c;全面覆盖语言、推理、知识、代码、数学、指令跟随、智能体等七大关键领域&am…

ThreaLocal

1.概述 ThreadLoca称线程局部变量&#xff0c;用于在线程中保存数据&#xff0c;保存的数据仅属于当前线程(即对其他线程而言&#xff0c;该变量是当前线程独有的变量) threadLocal利用Thread中的ThreadLocalMap来进行数据存储 2.常用方法 存储数据至当前线程ThreadLocalMap中…

Unity引擎绘制多边形属性图

大家好&#xff0c;我是阿赵   在制作游戏的时候&#xff0c;经常会遇到需要绘制多边形属性图的需求&#xff0c;比如这种效果&#xff1a; 可以根据需要的属性的数量变化多边形的边数&#xff0c;然后每一个顶点从中心点开始到多边形的顶点的长度代表了该属性的强度&#xf…

谈对象第二弹: C++类和对象(中)

文章目录 一、类的默认成员函数二、构造函数三、析构函数四、拷贝构造函数五、运算符重载5.1运算符重载5.2赋值运算符重载5.3实现日期类<<、>>重载检查、获取天数关系运算符重载算数、赋值运算符重载Date.hDate.cpp 六、取地址运算符重载6.1const成员函数6.2取地址…

docker部署excalidraw画图工具

0&#xff09;效果 0.1&#xff09;实时协作 0.2&#xff09;导出格式 1&#xff09;docker安装 docker脚本 bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrorsmain/DockerInstallation.sh)docker-compose脚本 curl -L "https://github.com/…

Dynaform 5.9.4简体中文版百度云下载(含教程)

如大家所了解的&#xff0c;Dynaform是一种基于有限元分析&#xff08;FEA&#xff09;技术的计算机辅助工程&#xff08;CAE&#xff09;软件&#xff0c;常常用于模拟和优化各种工业应用中的结构和流体问题。 目前常用的版本为Dynaform 5.9.4&#xff0c;可以模拟机械结构、…

第314题|参考!如何做到【一题多解】|武忠祥老师每日一题

解析&#xff1a; 画出图像&#xff1a; 观察选项可知&#xff1a;选项A和选项B是相反选项&#xff0c;因此答案只能在AB当中。 因此本题我们只需要算出和的大小即可。 方法一&#xff1a;直接相减然后判断结果的正负。 分析题目给的条件&#xff1a;f(x)单调减少&#xff0…

肥胖成因:饮食之外,消耗吸收慢是关键因素

肥胖问题一直被现代社会所关注&#xff0c;不可否认&#xff0c;饮食是影响胖瘦的重要因素之一。高热量、高油脂的食物摄入过多&#xff0c;也确实会导致热量油脂过剩&#xff0c;堆积储存进身体内进而养肥身体。可在正常情况中&#xff0c;就算是消耗吸收率一般的人&#xff0…

828华为云征文 | 在Huawei Cloud EulerOS系统中安装Docker的详细步骤与常见问题解决

前言 Docker是一种轻量级的容器技术&#xff0c;广泛用于应用程序的开发、部署和运维。在华为云的欧拉&#xff08;Huawei Cloud EulerOS&#xff09;系统上安装和运行Docker&#xff0c;虽然与CentOS有相似之处&#xff0c;但在具体实现过程中&#xff0c;可能会遇到一些系统…

进程状态的优先级

1.进程的状态&#xff08;所有系统&#xff09; 因为是对于所有系统的&#xff0c;所以描述会很抽象。 补充知识&#xff1a; 并行和并发 并行&#xff1a;多个进程再多个cpu下分别同时运行并发&#xff1a;多个进程在一个cpu下采取进程切换的方式&#xff0c;在一段时间内&…

echarts实现地图下钻并解决海南群岛显示缩略图

一、准备工作 1、echarts版本&#xff1a; ^5.5.1 2、去掉海南数据的json文件 二、获取删除过后的json文件 1、DataV.GeoAtlas地理小工具系列 (aliyun.com) 在网站输入这个复制的&#xff0c;新建一个json文件粘贴进去。 接下来需要删除两个地方&#xff0c;不要删错&…

左手研发,右手销量,比亚迪舍弃了什么?

早买早享受&#xff0c;晚买享折扣&#xff0c;是近一年来汽车消费市场的真实写照。 A级家轿价格下探至6、7万元&#xff1b;曾经20万起步的主流B级车&#xff0c;如今只要12万元就能入手&#xff1b;即使是BBA等豪华品牌&#xff0c;也开始降价促销换销量。买车更便宜了&…

【最优化】一维最优化方法:华罗庚黄金分割优选法

一、意义 华先生提倡用数学实际服务国民经济发展&#xff0c;受限于当时计算能力有限&#xff0c;华先生总结经验&#xff0c;提出黄金分割优选法&#xff0c;能够用最少的试验次数找出最优解。 二、主要内容 ①应用范围&#xff1a;一维单峰函数 ②算法步骤&#xff1a; ③详…

Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)

发布版本链接 通过百度网盘分享的文件&#xff1a;TCP调试助手V1.zip&#xff08;含客户端与服务器&#xff09; 链接&#xff1a;https://pan.baidu.com/s/14LTRPChPhYdwp_s6KeyBiA?pwdcedu 提取码&#xff1a;cedu 基于Qt/C实现了一款功能丰富的TCP服务器与客户端调试助手…