Qt 示例之多文档编辑器

2024-03-12 19:32

本文主要是介绍Qt 示例之多文档编辑器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

子窗口头文件

#ifndef MINICHILD_H
#define MINICHILD_H#include <QWidget>
#include <QTextEdit>
#include <QCloseEvent>
#include <QMenu>class MiniChild : public QTextEdit
{Q_OBJECT
public:explicit MiniChild(QWidget *parent = nullptr);void newFile(); // 新建操作bool loadFile(const QString &fileName); // 加载文件bool save(); // 保存文件bool saveAs(); // 文件另存为bool saveFile(const QString &fileName); // 保存文件QString userFriendlyCurrentFile(); // 提取文件名QString currentFile() {return curFile;} // 返回当前文件路径protected:void closeEvent(QCloseEvent *event) override; // 关闭事件void contextMenuEvent(QContextMenuEvent *e) override;private slots:void documentWasModified(); // 文档被更改时, 窗口显示更改状态图标private:bool maybeSave(); // 是否需要保存void setCurrentFile(const QString &fileName); // 设置当前文件QString curFile; // 保存当前文件路径bool isUntitled; // 作为当前文件是否被保存到硬盘上的标志
};#endif // MINICHILD_H

 

子窗口实现文件

#include "minichild.h"#include <QFile>
#include <QMessageBox>
#include <QTextStream>
#include <QApplication>
#include <QFileInfo>
#include <QFileDialog>
#include <QPushButton>MiniChild::MiniChild(QWidget *parent)
{// 设置在子窗口关闭时销毁这个类的对象setAttribute(Qt::WA_DeleteOnClose);// 初始isUntitled为trueisUntitled = true;
}void MiniChild::newFile()
{// 设置窗口编号,因为编号一直被保存,所以需要使用静态变量static int sequenceNumber = 1;// 新建的文档没有被保存过isUntitled = true;// 将当前文件命名为未命名文档加编号,编号先使用再加1curFile = tr("未命名文档%1.txt").arg(sequenceNumber++);// 使用[*]可以再文档被更改后再文件名称后显示 * 号setWindowTitle(curFile + "[*]" + tr(" - 多文档编辑器"));// 文档更改时connect(document(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified()));
}void MiniChild::documentWasModified()
{// 根据文档的isModified()的返回值,判断编辑器内容是否被更改了// 如果被更改了,就要再设置了[*]号的地方显示 * 号setWindowModified(document()->isModified());
}bool MiniChild::loadFile(const QString &fileName)
{QFile file(fileName);// 只读方式打开文件,出错则提示并返回falseif (!file.open(QFile::ReadOnly | QFile::Text)) {QMessageBox::warning(this,tr("多文档编辑器"),tr("无法读取文件%1: \n %2").arg(fileName).arg(file.errorString()));return false;}// 文本流QTextStream in(&file);// 设置鼠标状态为等待状态QApplication::setOverrideCursor(Qt::WaitCursor);// 读取文件的全部内容,并添加到编辑器setPlainText(in.readAll());// 恢复鼠标在他QApplication::restoreOverrideCursor();// 设置当前文件setCurrentFile(fileName);connect(document(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified()));return true;
}void MiniChild::setCurrentFile(const QString &fileName)
{// canonicalFilePath() 可以除去路径中的符号链接, . 和 .. 等符号curFile = QFileInfo(fileName).canonicalFilePath();// 文件已经被保存过了isUntitled = false ;// 文档没有被更改过document()->setModified(false);setWindowTitle(userFriendlyCurrentFile() + "[*]");
}QString MiniChild::userFriendlyCurrentFile()
{// 从文件路径中提取文件名return QFileInfo(curFile).fileName();
}bool MiniChild::save()
{// 如果文件未被保存过,则执行另存为操作,否则直接保存文件if (isUntitled) {return saveAs();} else {return saveFile(curFile);}
}bool MiniChild::saveAs()
{QString fileName = QFileDialog::getSaveFileName(this, tr("另存为"), curFile);// 获取文件路径,如果为空,则返回false,否则保存文件if (fileName.isEmpty()) {return false;}return saveFile(fileName);
}bool MiniChild::saveFile(const QString &fileName)
{QFile file(fileName);if (!file.open(QFile::WriteOnly | QFile::Text)) {QMessageBox::warning(this,tr("多文档编辑器"),tr("无法写入文件 %1: \n %2").arg(fileName).arg(file.errorString()));return false;}QTextStream out(&file);QApplication::setOverrideCursor(Qt::WaitCursor);out << toPlainText();QApplication::restoreOverrideCursor();setCurrentFile(fileName);return true;
}void MiniChild::closeEvent(QCloseEvent *event)
{// 如果mayBeSave() 函数返回true, 则关闭窗口,否则忽略该事件if (maybeSave()) {event->accept();} else {event->ignore();}
}void MiniChild::contextMenuEvent(QContextMenuEvent *e)
{// 创建菜单,并向其中添加动作QMenu *menu = new QMenu;QAction *undo = menu->addAction(tr("撤销(&U)"), this, SLOT(undo()), QKeySequence::Undo);undo->setEnabled(document()->isUndoAvailable());QAction *redo = menu->addAction(tr("恢复(&R)"), this, SLOT(redo()), QKeySequence::Redo);redo->setEnabled(document()->isRedoAvailable());menu->addSeparator();QAction *cut = menu->addAction(tr("剪切(&T)"), this, SLOT(cut()), QKeySequence::Cut);cut->setEnabled(textCursor().hasSelection());QAction *copy = menu->addAction(tr("复制(&C)"), this, SLOT(copy()), QKeySequence::Copy);copy->setEnabled(textCursor().hasSelection());menu->addAction(tr("粘贴(&P)"), this, SLOT(paste()), QKeySequence::Paste);QAction *clear = menu->addAction(tr("清空"), this, SLOT(clear()));clear->setEnabled(!document()->isEmpty());menu->addSeparator();QAction *select = menu->addAction(tr("全选"), this, SLOT(selectAll()), QKeySequence::SelectAll);select->setEnabled(!document()->isEmpty());// 获取鼠标的位置,然后在这个位置显示菜单menu->exec(e->globalPos());// 最后销毁这个菜单delete menu;
}bool MiniChild::maybeSave()
{// 如果文件被更改过if (document()->isModified()) {QMessageBox box;box.setWindowTitle(tr("多文档编辑器"));box.setText(tr("是否保存对%1的更改?").arg(userFriendlyCurrentFile()));box.setIcon(QMessageBox::Warning);QPushButton *yesBtn = box.addButton(tr("是(&Y)"), QMessageBox::YesRole);box.addButton(tr("否(&N)"), QMessageBox::NoRole);QPushButton *cancenBtn = box.addButton(tr("取消"), QMessageBox::RejectRole);// 弹出对话框box.exec();// 如果用户选择是,则返回保存操作的结果,如果选择取消,则返回falseif (box.clickedButton() == yesBtn) {return save();} else if (box.clickedButton() == cancenBtn) {return false;}}// 如果文档没有更改过,则直接返回truereturn true;
}

 

主页面头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include "minichild.h"
#include <QMainWindow>
#include <QMdiSubWindow>
#include <QSignalMapper>
#include <QCloseEvent>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();protected:void closeEvent(QCloseEvent *event);private slots:void updateMenus(); // 更新菜单MiniChild *createdMiniChild(); // 创建子窗口void setActiveSubWindow(QWidget *window); // 设置活动子窗口void updateWindowMenu(); //更新窗口菜单void showTextRowAndCol(); // 显示文本的行号和列号void on_actionNew_triggered();void on_actionOpen_triggered();void on_actionSave_triggered();void on_actionSaveAs_triggered();void on_actionUndo_triggered();void on_actionRedo_triggered();void on_actionCut_triggered();void on_actionCopy_triggered();void on_actionPaste_triggered();void on_actionClose_triggered();void on_actionQuit_triggered();void on_actionTile_triggered();void on_actionCascade_triggered();private:QAction *actionSeparator; // 间隔器MiniChild *activeMiniChild(); // 活动窗口QMdiSubWindow *findMiniChild(const QString &fileName);// 查找子窗口void readSettings(); // 读取窗口设置void writeSettings(); // 写入窗口设置void initWindow(); // 初始化窗口QSignalMapper *windowMapper; // 信号映射器Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

 

主页面实现文件

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QFileDialog>
#include <QSettings>
#include <QLabel>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);actionSeparator = new QAction(this);actionSeparator->setSeparator(true);updateMenus();// 当有活动窗口时更新菜单connect(ui->mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(updateMenus()));// 创建信号映射器windowMapper = new QSignalMapper(this);// 映射器重新发射信号,根据信号设置活动窗口connect(windowMapper, SIGNAL(mapped(QWidget *)), this, SLOT(setActiveSubWindow(QWidget *)));// 更新窗口菜单,并且设置当前窗口菜单将要显示的时候更新窗口菜单updateWindowMenu();connect(ui->menuWindow, SIGNAL(aboutToShow()), this, SLOT(updateWindowMenu()));// 初始化读取窗口设置readSettings();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::updateMenus()
{bool hasMiniChild = (activeMiniChild() != 0);ui->actionSave->setEnabled(hasMiniChild);ui->actionSaveAs->setEnabled(hasMiniChild);ui->actionPaste->setEnabled(hasMiniChild);ui->actionClose->setEnabled(hasMiniChild);ui->actionCloseAll->setEnabled(hasMiniChild);ui->actionTile->setEnabled(hasMiniChild);ui->actionCascade->setEnabled(hasMiniChild);ui->actionNext->setEnabled(hasMiniChild);ui->actionPrevious->setEnabled(hasMiniChild);// 设置间隔器是否显示actionSeparator->setVisible(hasMiniChild);// 有活动窗口且被选择的文本,剪切复制才可用bool hasSelection = (activeMiniChild() && activeMiniChild()->textCursor().hasSelection());ui->actionCut->setEnabled(hasSelection);ui->actionCopy->setEnabled(hasSelection);// 有活动窗口且文档有恢复操作时恢复动作可以ui->actionRedo->setEnabled(activeMiniChild() && activeMiniChild()->document()->isRedoAvailable());// 有活动窗口且文档有撤销操作时册小动作可以ui->actionUndo->setEnabled(activeMiniChild() && activeMiniChild()->document()->isUndoAvailable());
}void MainWindow::updateWindowMenu()
{// 先清空菜单,然后再添加各个菜单动作ui->menuWindow->clear();ui->menuWindow->addAction(ui->actionClose);ui->menuWindow->addAction(ui->actionCloseAll);ui->menuWindow->addSeparator();ui->menuWindow->addAction(ui->actionTile);ui->menuWindow->addAction(ui->actionCascade);ui->menuWindow->addSeparator();ui->menuWindow->addAction(ui->actionNext);ui->menuWindow->addAction(ui->actionPrevious);ui->menuWindow->addAction(actionSeparator);// 如果有活动窗口,则显示间隔器QList<QMdiSubWindow *> windows = ui->mdiArea->subWindowList();actionSeparator->setVisible(!windows.isEmpty());// 遍历各个子窗口for (int i = 0; i< windows.size(); ++i) {MiniChild *child = qobject_cast<MiniChild *>(windows.at(i)->widget());QString text;// 如果窗口数量小于9,则设置编号为快捷键if (i < 9) {text = tr("&%1 %2").arg(i + 1).arg(child->userFriendlyCurrentFile());} else {text = tr("%1 %2").arg(i + 1).arg(child->userFriendlyCurrentFile());}// 添加动作到菜单, 设置动作可用选择QAction *action = ui->menuWindow->addAction(text);action->setCheckable(true);// 设置当前活动窗口动作为选中状态action->setChecked(child == activeMiniChild());// 关联动作的触发信号映射器的map槽,这个槽会发射mapped信号connect(action, SIGNAL(triggered()), windowMapper, SLOT(map()));// 将动作与相应的窗口部件进行映射// 再发射mapped信号时就会以这个窗口部件为参数windowMapper->setMapping(action, windows.at(i));}}MiniChild *MainWindow::activeMiniChild()
{// 如果有活动窗口,则将其内的中心部件转换为MiniChild类型,没有则直接返回0if (QMdiSubWindow *activeSubWindow = ui->mdiArea->activeSubWindow()) {return qobject_cast<MiniChild *>(activeSubWindow->widget());}return 0;
}MiniChild *MainWindow::createdMiniChild()
{// 创建MiniChild部件MiniChild *child = new MiniChild;// 向多文档区域添加子窗口,child为中心部件ui->mdiArea->addSubWindow(child);// 根据QTextEdit类的是否可以复制信号设置剪切复制动作是否可用connect(child, SIGNAL(cutAvailable(bool)), ui->actionCut, SLOT(setEnabled(bool)));connect(child, SIGNAL(copyAvailable(bool)), ui->actionCopy, SLOT(setEnabled(bool)));// 根据QTextDocument类的是否可用撤销恢复信号设置撤销恢复动作是否可用connect(child->document(), SIGNAL(undoAvailable(bool)), ui->actionUndo, SLOT(setEnabled(bool)));connect(child->document(), SIGNAL(redoAvailable(bool)), ui->actionRedo, SLOT(setEnabled(bool)));connect(child, SIGNAL(cursorPositionChanged()), this, SLOT(showTextRowAndCol()));return child;}QMdiSubWindow *MainWindow::findMiniChild(const QString &fileName)
{QString canonicalFilePath = QFileInfo(fileName).canonicalFilePath();// 利用foreach遍历子窗口,如果其文件路径和要查找的路径相同,则返回该窗口foreach(QMdiSubWindow *window, ui->mdiArea->subWindowList()) {MiniChild *child = qobject_cast<MiniChild *>(window->widget());if (child->currentFile() == canonicalFilePath) {return window;}}return 0;
}void MainWindow::setActiveSubWindow(QWidget *window)
{// 如果传递了窗口部件,则将其设置为活动窗口if (!window) {return ;}ui->mdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow *>(window));
}void MainWindow::closeEvent(QCloseEvent *event)
{// 先执行多文档区域的关闭操作ui->mdiArea->closeAllSubWindows();// 如果还有窗口没关闭,则忽略该事件if (ui->mdiArea->currentSubWindow()) {event->ignore();} else {// 关闭前写入窗口设置writeSettings();event->accept();}
}void MainWindow::writeSettings()
{QSettings settings("yafeilinux", "miniEditor");// 写入位置信息和大小信息settings.setValue("pos", pos());settings.setValue("size", size());
}void MainWindow::readSettings()
{QSettings settings("yafeilinux", "miniEditor");QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();QSize size = settings.value("size", QSize(400, 400)).toSize();move(pos);resize(size);
}void MainWindow::showTextRowAndCol()
{// 如果有活动窗口,则显示其中光标所在的位置if (activeMiniChild()) {// 因为获取的行号和列号都是从0开始的,所以我们这里进行了加1int rowNum = activeMiniChild()->textCursor().blockNumber() + 1;int colNum = activeMiniChild()->textCursor().columnNumber() + 1;ui->statusbar->showMessage(tr("%1 行 %2 列").arg(rowNum).arg(colNum), 2000);}
}void MainWindow::initWindow()
{setWindowTitle(tr("多文档编辑器"));// 在工具栏上右击时,可以关闭工具栏// ui->mainToolBar->setWindowTitle(tr("工具栏"));// 当多文档区域的内容超出可视化区域后,出现滚动条// setHorizontalScrollBarPolicy 此属性保存水平滚动条的策略// ScrollBarAsNeeded 当内容太大而无法容纳时,QAbstractScrollArea会显示一个滚动条ui->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);// setVerticalScrollBarPolicy 此属性保存垂直滚动条的策略ui->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);ui->statusbar->showMessage(tr("欢迎使用多文档编辑器"));QLabel *label = new QLabel(this);// Box QFrame在其内容周围绘制一个框// Sunken 框架和内容出现凹陷;使用当前颜色组的浅色和深色绘制三维凹陷线label->setFrameStyle(QFrame::Box | QFrame::Sunken);label->setText(tr("<a href=\"http:://www.qt.io\">qt.io</a>"));// 标签文本为富文本label->setTextFormat(Qt::RichText);// 可以打开外部链接label->setOpenExternalLinks(true);ui->statusbar->addPermanentWidget(label);ui->actionNew->setStatusTip(tr("创建一个文件"));ui->actionOpen->setStatusTip(tr("打开一个文件"));ui->actionSave->setStatusTip(tr("保存一个文件"));ui->actionSaveAs->setStatusTip(tr("另存为一个文件"));ui->actionQuit->setStatusTip(tr("退出程序"));ui->actionUndo->setStatusTip(tr("撤销"));ui->actionRedo->setStatusTip(tr("恢复"));ui->actionCut->setStatusTip(tr("剪切"));ui->actionCopy->setStatusTip(tr("复制"));ui->actionPaste->setStatusTip(tr("粘贴"));ui->actionClose->setStatusTip(tr("关闭一个编辑器"));ui->actionCloseAll->setStatusTip(tr("关闭所有编辑器"));ui->actionTile->setStatusTip(tr("平铺"));ui->actionCascade->setStatusTip(tr("层叠"));ui->actionNext->setStatusTip(tr("下一个编辑器"));ui->actionPrevious->setStatusTip(tr("上一个编辑器"));ui->actionAbout->setStatusTip(tr("关于我们"));ui->actionAboutQt->setStatusTip(tr("关于Qt"));
}void MainWindow::on_actionNew_triggered()
{MiniChild *child = createdMiniChild();// 新建文件child->newFile();// 显示子窗口child->show();
}void MainWindow::on_actionOpen_triggered()
{// 获取文件路径QString fileName = QFileDialog::getOpenFileName();// 如果路径不为空, 则查看该文件是否已经打开if (!fileName.isEmpty()) {QMdiSubWindow *existing = findMiniChild(fileName);if(existing) {ui->mdiArea->setActiveSubWindow(existing);return ;}// 如果没有打开,则新建子窗口MiniChild *child = createdMiniChild();if (child->loadFile(fileName)) {ui->statusbar->showMessage(tr("打开文件成功"), 2000);child->show();} else {child->close();}}
}void MainWindow::on_actionSave_triggered()
{if (activeMiniChild() && activeMiniChild()->save()) {ui->statusbar->showMessage(tr("文件保存成功"), 2000);}
}void MainWindow::on_actionSaveAs_triggered()
{if (activeMiniChild() && activeMiniChild()->saveAs()) {ui->statusbar->showMessage(tr("文件保存成功"), 2000);}
}void MainWindow::on_actionUndo_triggered()
{if (activeMiniChild()) activeMiniChild()->undo();
}void MainWindow::on_actionRedo_triggered()
{if (activeMiniChild()) activeMiniChild()->redo();
}void MainWindow::on_actionCut_triggered()
{if (activeMiniChild()) activeMiniChild()->cut();
}void MainWindow::on_actionCopy_triggered()
{if (activeMiniChild()) activeMiniChild()->copy();
}void MainWindow::on_actionPaste_triggered()
{if (activeMiniChild()) activeMiniChild()->paste();
}void MainWindow::on_actionClose_triggered()
{ui->mdiArea->closeActiveSubWindow();
}void MainWindow::on_actionQuit_triggered()
{qApp->closeAllWindows();
}void MainWindow::on_actionTile_triggered()
{ui->mdiArea->tileSubWindows();
}void MainWindow::on_actionCascade_triggered()
{ui->mdiArea->cascadeSubWindows();
}

 

效果

 

 

这篇关于Qt 示例之多文档编辑器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802343

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

Spring Roo 实站( 一 )部署安装 第一个示例程序

转自:http://blog.csdn.net/jun55xiu/article/details/9380213 一:安装 注:可以参与官网spring-roo: static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sampleROO_OPTS http://stati

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C++ Qt开发:QNetworkAccessManager网络接口组件 阅读目录 1.1 通用API函数

Python脚本:TXT文档行数统计

count = 0 #计数变量file_dirs = input('请输入您要统计的文件根路径:')filename = open(file_dirs,'r') #以只读方式打开文件file_contents = filename.read() #读取文档内容到file_contentsfor file_content in file_contents: