【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.mzph.cn/news/879813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 入门一

参考&#xff1a;丁丁的哔哩哔哩 1.使用vue 1.1 使用CDN的方式使用Vue mount和<div id"counter">关联起来 1.2 vue中的createApp import { createApp } from "vue"; import App from "./App.vue"; createApp(App).mount("#app&qu…

PyTorch使用------自动微分模块

目录 &#x1f354; 梯度基本计算 1.1 单标量梯度的计算 1.2 单向量梯度的计算 1.3 多标量梯度计算 1.4 多向量梯度计算 1.5 运行结果&#x1f4af; &#x1f354; 控制梯度计算 2.1 控制不计算梯度 2.2 注意: 累计梯度 2.3 梯度下降优化最优解 2.4 运行结果&#x1…

数字工厂管理系统与MES系统在实际应用中有哪些区别

随着制造业的数字化转型步伐加快&#xff0c;数字工厂管理系统与制造执行MES系统作为两大关键工具&#xff0c;在实际应用中展现出了明显的差异。本文将从实际应用的角度&#xff0c;详细探讨这两种系统之间的主要区别。 数字工厂管理系统的实际应用 数字工厂管理系统侧重于对…

掌握Spring Boot数据库集成:用JPA和Hibernate构建高效数据交互与版本控制

在现代应用开发中&#xff0c;数据库操作是核心环节之一。Spring Boot提供了简化数据库集成的强大工具&#xff0c;而JPA&#xff08;Java Persistence API&#xff09;和Hibernate是两种非常流行的ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;可以帮助我们将对象…

如何删除EXCELL文件中的空行?

1&#xff0c;选择某一列 2&#xff0c;点击《开始》《查找和选择》>《定位条件》&#xff0c;调出《定位条件》的选择框&#xff1b; 3&#xff0c;在定位条件选项框&#xff0c;选择《空值》&#xff1b; 4&#xff0c;找到变灰被选中的某一行&#xff0c;右击《删除》 5&…

GitLab权限及设置

之前很少关注这些&#xff0c;项目的权限&#xff0c;一般由专门的管理人员设置。 但自己创建的项目自己可以设置权限。下面是一些笔记。 GitLab中用户权限_gitlab 权限-CSDN博客 开发中遇到要将自己这块的代码上传到Git&#xff0c;由其他组的同事拉取后继续开发。上传代码后…

JavaScript 笔记汇总

JavaScript 笔记汇总 引入方式 内部方式 通过 script 标签包裹 JavaScript 代码。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JavaScript 基础 - 引入方式</title> </head> <…

SpringBoot Kafka发送消息与接收消息实例

前言 Kafka的基本工作原理 我们将消息的发布&#xff08;publish&#xff09;称作 producer(生产者)&#xff0c;将消息的订阅&#xff08;subscribe&#xff09;表述为 consumer&#xff08;消费者&#xff09;&#xff0c;将中间的存储阵列称作 broker(代理)&#xff0c;这…

QT打开摄像头采集

QT打开摄像头采集 今天好不容易把opencv的环境装好&#xff0c;然后想学习一下人脸识别的功能&#xff0c;但是在图书馆坐了4个多小时了&#xff0c;屁股疼就先写个摄像头采集的功能&#xff0c;明天继续学习吧&#xff0c;废话不多&#xff0c;嚼个奶片开始发车&#xff01;&…

JVM java主流的追踪式垃圾收集器

目录 前言 分代垃圾收集理论 标记清除算法 标记复制算法 标记整理法 前言 从对象消亡的角度出发, 垃圾回收器可以分为引用计数式垃圾收集和追踪式垃圾收集两大类, 但是java主流的一般是追踪式的垃圾收集器, 因此我们重点讲解. 分代垃圾收集理论 分代收集这种理…

Linux Vim编辑器常用命令

目录 一、命令模式快捷键 二、编辑/输入模式快捷键 三、编辑模式切换到命令模式 四、搜索命令 注&#xff1a;本章内容全部基于Centos7进行操作&#xff0c;查阅本章节内容前请确保您当前所在的Linux系统版本&#xff0c;且具有足够的权限执行操作。 一、命令模式快捷键 二…

企业专用智能云盘 | 帮助企业便捷管控企业文档 | 天锐绿盘云文档安全管理系统

由于当前多数企业内部的办公文件普遍散落于各员工电脑中&#xff0c;导致存在诸多潜在的文档使用风险。为优化团队协作效率&#xff0c;天 锐 绿盘是一款集文档统一管理、高效协同于一体的企业云盘&#xff0c;帮助企业解决文档管理中的诸多难题。 【地址&#xff1a;点击了解天…

【2023工业异常检测文献】SimpleNet

SimpleNet:ASimpleNetworkforImageAnomalyDetectionandLocalization 1、Background 图像异常检测和定位主要任务是识别并定位图像中异常区域。 工业异常检测最大的难题在于异常样本少&#xff0c;一般采用无监督方法&#xff0c;在训练过程中只使用正常样本。 解决工业异常检…

TCP客户端编码和解码处理:发送和接收指定编码消息

文章目录 引言基于Netty实现TCP客户端Netty发送GBK编码指令Netty接收GBK编码基于Channel发送指令基于ChannelHandlerContext发送指令:建立连接时发送登陆指令开启日志,查看报文信息基于ChannelInboundHandlerAdapter进行业务逻辑处理原生API实现TCP客户端基于DataOutputStrea…

AI预测福彩3D采取888=3策略+和值012路或胆码测试9月19日新模型预测第92弹

经过90多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;90多期一共只错了10次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0…

C语言中的assert断言

Assert断言 断言是程序中处理异常的一种高级形式。可以在任何时候启用和禁用断言验证&#xff0c;因此可以在测试时启用断言&#xff0c;而在部署时禁用断言。同样&#xff0c;程序投入运行后&#xff0c;最终用户在遇到问题时可以重新启用断言。 用法&#xff1a; #…

23.面试题02.07链表相交

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode apheadA;ListNode bpheadB;int lenA0,lenB0;//求两个链表长度while(ap!null){apap.next;lenA;}while(bp!null){bpbp.next;lenB;}apheadA;bpheadB;int len0;//用来计算让…

Msf之Python分离免杀

Msf之Python分离免杀 ——XyLin. 成果展示&#xff1a; VT查杀率:8/73 (virustotal.com) 火绒和360可以过掉&#xff0c;但Windows Defender点开就寄掉了 提示&#xff1a;我用360测的时候&#xff0c;免杀过了&#xff0c;但360同时也申报了&#xff0c;估计要不了多久就寄…

【C++ Primer Plus习题】6.9

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <string> #include <…

2-99 基于matlab多尺度形态学提取眼前节组织

基于matlab多尺度形态学提取眼前节组织&#xff0c;通过应用不同尺度的结构元素进行边缘检测&#xff0c;再通过加权融合的思想来整合检测到的边缘&#xff0c;降低图像噪声的影响&#xff0c;提高边缘检测的精度。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&…