广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt项目实战之实现多文本编辑器
  • 182
分享到

Qt项目实战之实现多文本编辑器

Qt多文本编辑器Qt文本编辑器Qt编辑器 2023-03-19 17:03:19 182人浏览 泡泡鱼
摘要

首先先来看实验成果图,大概就是这么个多文档编辑器。 首先需要在设计模式里进行设计器的设置: 然后就是新建类MdiChild的声明和实现 mdichild.h #ifndef MD

首先先来看实验成果图,大概就是这么个多文档编辑器。

首先需要在设计模式里进行设计器的设置:

然后就是新建类MdiChild的声明和实现

mdichild.h

#ifndef MDICHILD_H
#define MDICHILD_H
 
#include<QtextEdit>
 
class MdiChild:public QTextEdit
{
    Q_OBJECT
public:
    explicit MdiChild(QWidget *parent = 0);
    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); //关闭事件
    void contextMenuEvent(QContextMenuEvent *e); //右键菜单事件
 
private slots:
    void documentWasModified(); //文档被更改时,窗口显示更改状态标志
 
private:
    bool maybeSave(); //是否需要保存
    void setCurrentFile(const QString &fileName); //设置当前文件
    QString curFile;  //保存当前文件路径
    bool isUntitled;  //作为当前文件是否被保存到硬盘上的标志
 
};
 
#endif // MDICHILD_H

mdichild.cpp

#include "mdichild.h"
#include<QFile>
#include<QMessageBox>
#include<QTextStream>
#include<QApplication>
#include<QFileInfo>
#include<QFileDialog>
#include<QCloseEvent>
#include<QPushButton>
#include<QMenu>
 
MdiChild::MdiChild(QWidget *parent):QTextEdit (parent)
{
    //设置在子窗口关闭时销毁这个类的对象
    setAttribute(Qt::WA_DeleteOnClose);
 
    //初始isUntitled为true
    isUntitled = true;
}
 

void MdiChild::newFile()
{
    //设置窗口编号,因为编号一致被保存,所以需要使用静态变量
    static int sequenceNumber =1;
 
    //新建的文档没有被保存过
    isUntitled =true;
 
    //将当前文件命名为未命名文档加编号,编号先使用再加1
    curFile = tr("未命名文档%1.txt").arg(sequenceNumber++);
 
    //设置窗口标题,使用[*]可以再文档被更改后再文件名称后显示“*”号
    setWindowTitle(curFile +"[*]"+tr(" - 多文档编辑器"));
 
    //文档更改时发射contentsChanged()信号,执行documentWasModified()槽
    connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));
 
 
}
 

bool MdiChild::loadFile(const QString &fileName)
{
    //新建QFile对象
    QFile file(fileName);
    //只读方式打开文件,出错则提示,并返回false
    if(!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(documentWasChanged()));
    return true;
 
}
 
bool MdiChild::save()
{
    //如果文件未被保存过,则执行另存为操作,否则直接保存文件
    if(isUntitled)
    {
        return saveAs();
    }
    else {
        return saveFile(curFile);
    }
}
 
bool MdiChild::saveAs()
{
   QString fileName = QFileDialog::getSaveFileName(this,tr("另存为"),curFile);
   //获取文件路径,如果为空,则返回false,否则保存文件
   if(fileName.isEmpty())
       return false;
   return saveFile(fileName);
}
 
bool MdiChild::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);
}
 
QString MdiChild::userFriendlyCurrentFile()
{
    //从文件路径中提取文件名
    return QFileInfo(curFile).fileName();
}
 
void MdiChild::closeEvent(QCloseEvent *event)
{
    //如果maybeSave()函数返回true,则关闭窗口,否则忽略该事件
    if(maybeSave())
    {
        event->accept();
    }
    else {
        event->ignore();
    }
}
 
void MdiChild::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());
    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;
}
 
void MdiChild::documentWasModified()
{
    //根据文档的isModified()函数的返回值,判断编辑器内容是否被更改了
    //如果被更改了,就要在设置[*]号的地方显示“*”号,这里会在窗口标题中显示
    setWindowModified(document()->isModified());
}
 
bool MdiChild::maybeSave()
{
    //如果文档被更改过
    if(document()->isModified())
    {
        QMessageBox box;
        box.setWindowTitle(tr("多文档编辑器"));
        box.setText(tr("是否保存为“%1”的更改?").arg(userFriendlyCurrentFile()));
        box.setIcon(QMessageBox::Warning);
        //添加按钮,QMessageBox::YesRole可以表明这个按钮的行为
        QPushButton *yesBtn = box.addButton(tr("是(&Y)"),QMessageBox::YesRole);
        box.addButton(tr("否(&N)"),QMessageBox::NoRole);
        QPushButton *cancelBtn = box.addButton(tr("取消"),QMessageBox::RejectRole);
 
        //弹出对话框,让用户选择是否保存修改,或者取消关闭操作
        box.exec();
 
        //如果用户选择是,则返回保存操作的结果;如果选择取消,则返回false
        if(box.clickedButton() ==yesBtn)
            return save();
        else if(box.clickedButton() ==cancelBtn){
            return false;
        }
 
 
    }
    //如果文档没有更改过,则直接返回true;
    return true;
}
 
void MdiChild::setCurrentFile(const QString &fileName)
{
    //canonicalFilePath()可以除去路径中的符号链接,"."和".."等符号
    curFile = QFileInfo(fileName).canonicalFilePath();
    //文件已经被保存过了
    isUntitled = false;
 
    //文档没有被更改过
    document()->setModified(false);
 
    //窗口不显示被更改标志
    setWindowModified(false);
 
    //设置窗口标题,userFriendlyCurrentFile()返回文件名
    setWindowTitle(userFriendlyCurrentFile()+"[*]");
 
}

然后是mainwindow类的声明与实现

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
class QMdiSubWindow;
class MdiChild;
class QSignalMapper;
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private slots:
 
    void updateMenus(); //更新菜单
    MdiChild* createMdiChild(); //创建子窗口
    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_actionCloseAll_triggered();
 
    void on_actionAbout_triggered();
 
    void on_actionAboutQt_triggered();
 
    void on_actionExit_triggered();
 
private:
    QMdiSubWindow *findMdiChild(const QString &fileName);//查找子窗口
    void readSettings(); //读取窗口设置
    void writeSettings(); //写入窗口设置
    void initWindow(); //初始化窗口
 
 
protected:
    void closeEvent(QCloseEvent* event); //关闭事件
 
 
private:
    Ui::MainWindow *ui;
    QAction *actionSeparator; //间隔器
    MdiChild *activeMdiChild(); //活动窗口
    QSignalMapper *windowMapper; //信号映射器
};
 
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"mdichild.h"
#include<QFileDialog>
#include<QMdiSubWindow>
#include<QSignalMapper>
#include<QMessageBox>
#include<QSettings>
#include<QCloseEvent>
#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->menu_W,SIGNAL(aboutToShow()),this,SLOT(updateWindowMenu()));
 
    readSettings(); //初始窗口时读取窗口设置信息
 
    //初始化窗口
    initWindow();
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_actionNew_triggered()
{
    //创建MdiChild
    MdiChild *child = createMdiChild();
    //新建文件
    child->newFile();
    //显示子窗口
    child->show();
}
 

void MainWindow::updateMenus()
{
    //根据是否有活动窗口来设置各个动作是否可用
    bool hasMdiChild = (activeMdiChild()!= 0);
    ui->actionSave->setEnabled(hasMdiChild);
    ui->actionSaveAs->setEnabled(hasMdiChild);
    ui->actionPaste->setEnabled(hasMdiChild);
    ui->actionClose->setEnabled(hasMdiChild);
    ui->actionCloseAll->setEnabled(hasMdiChild);
    ui->actionTile->setEnabled(hasMdiChild);
    ui->actionCascade->setEnabled(hasMdiChild);
    ui->actionNext->setEnabled(hasMdiChild);
    ui->actionPrevious->setEnabled(hasMdiChild);
 
    //有活动窗口且有被选择的文本,剪切复制才可用
    bool hasSelection =(activeMdiChild() &&activeMdiChild()->textCursor().hasSelection());
    ui->actionCut->setEnabled(hasSelection);
    ui->actionPaste->setEnabled(hasSelection);
 
    //有活动窗口且有撤销操作时撤销动作可用
    ui->actionUndo->setEnabled(activeMdiChild()&&activeMdiChild()->document()->isUndoAvailable());
 
    //有活动窗口且文档有恢复操作时恢复动作可用
    ui->actionRedo->setEnabled(activeMdiChild()&&activeMdiChild()->document()->isRedoAvailable());
}
 

MdiChild *MainWindow::createMdiChild()
{
    //创建MdiChild部件
    MdiChild *child = new MdiChild;
    //向多文档区域添加子窗口,child为中心部件
    ui->mdiArea->addSubWindow(child);
 
    //根据QTextEdit类的是否可以复制信号设置剪切复制动作是否可用
    connect(child,SIGNAL(copyAvailable(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;
}
 

void MainWindow::setActiveSubWindow(QWidget *window)
{
    //如果传递了窗口部件,则将其设置为活动窗口
    if(!window)
        return;
    ui->mdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow*>(window));
}
 
void MainWindow::on_actionOpen_triggered()
{
    //获取文件路劲
    QString fileName = QFileDialog::getOpenFileName(this);
    //如果路径不为空,则查看该文件是否已经打开
    if(!fileName.isEmpty())
    {
        QMdiSubWindow *existing = findMdiChild(fileName);
        //如果已经存在,则将对应的子窗口设置为活动窗口
        if(existing)
        {
            ui->mdiArea->setActiveSubWindow(existing);
            return;
        }
        //如果没有打开,则新建子窗口
        MdiChild *child = createMdiChild();
        if(child->loadFile(fileName))
        {
            ui->statusBar->showMessage(tr("打开文件成功"),2000);
            child->show();
        }
        else {
            child->close();
        }
    }
}
 
void MainWindow::updateWindowMenu()
{
    //先清空菜单,然后在添加各个菜单动作
    ui->menu_W->clear();
    ui->menu_W->addAction(ui->actionClose);
    ui->menu_W->addAction(ui->actionCloseAll);
    ui->menu_W->addSeparator();
    ui->menu_W->addAction(ui->actionTile);
    ui->menu_W->addAction(ui->actionCascade);
    ui->menu_W->addSeparator();
    ui->menu_W->addAction(ui->actionNext);
    ui->menu_W->addAction(ui->actionPrevious);
    ui->menu_W->addAction(actionSeparator);
 
    //如果有活动窗口,则显示间隔器
    QList<QMdiSubWindow*> windows =ui->mdiArea->subWindowList();
    actionSeparator->setVisible(!windows.isEmpty());
 
    //遍历各个子窗口
    for(int i=0;i<windows.size();++i)
    {
        MdiChild *child = qobject_cast<MdiChild*>(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->menu_W->addAction(text);
        action->setCheckable(true);
        //设置当前活动窗口动作为选中状态
        action->setChecked(child ==activeMdiChild());
        //关联动作的触发信号到信号映射器的map()槽,这个槽会发射mapped()信号
        connect(action,SIGNAL(triggered()),windowMapper,SLOT(map()));
 
        //将动作与相应的窗口部件进行映射
        //在发射mappedd()信号时就会以这个窗口部件为参数
        windowMapper->setMapping(action,windows.at(i));
    }
}
 
void MainWindow::showTextRowAndCol()
{
    //如果有活动窗口,则显示其中光标所在的位置
    if(activeMdiChild())
    {
        //因为获取的行号和列号都是从0开始的,所以我们这里进行了加1
        int rowNum = activeMdiChild()->textCursor().blockNumber()+1;
        int colNum = activeMdiChild()->textCursor().blockNumber()+1;
 
        ui->statusBar->showMessage(tr("%1行 %2列").arg(rowNum).arg(colNum),2000);
    }
}
 
 
QMdiSubWindow *MainWindow::findMdiChild(const QString &fileName)
{
    QString canonicalFilePath = QFileInfo(fileName).canonicalFilePath();
    //利用foreach语句遍历子窗口列表,如果其文件路径和要查找的路径相同,则返回该窗口
    foreach(QMdiSubWindow* window,ui->mdiArea->subWindowList())
    {
        MdiChild* mdiChild = qobject_cast<MdiChild*>(window->widget());
        if(mdiChild->currentFile() ==canonicalFilePath)
            return window;
    }
    return 0;
}
 
void MainWindow::readSettings()
{
    QSettings settings("yafeilinux","myMdi");
    QPoint pos =settings.value("pos",QPoint(200,200)).toPoint();
    QSize size =settings.value("size",QSize(400,200)).toSize();
    move(pos);
    resize(size);
}
 
void MainWindow::writeSettings()
{
    QSettings settings("yafeilinux","myMdi");
    //写入位置信息和大小
    settings.setValue("pos",pos());
    settings.setValue("size",size());
 
}
 
void MainWindow::initWindow()
{
    setWindowTitle(tr("多文档编辑器"));
 
    //在工具栏右击时,可以关闭该工具栏
    ui->mainToolBar->setWindowTitle(tr("工具栏"));
    //当多文档区域的内容超出可是区域后,出现滚动条
    ui->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    ui->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
 
    ui->statusBar->showMessage(tr("欢迎使用多文档编辑器"));
    QLabel *label =new QLabel(this);
    label->setFrameStyle(QFrame::Box|QFrame::Sunken);
    label->setText(tr("<a href=\"Http://www.yafeilinux.com\">yafeilinux.com</a>"));
 
    //标签文字为富文本
    label->setTextFORMat(Qt::RichText);
 
    //可以打开外部链接
    label->setOpenExternalLinks(true);
    ui->statusBar->addPermanentWidget(label);
    ui->actionNew->setStatusTip(tr("创建一个文件"));
    ui->actionOpen->setStatusTip(tr("打开一个文件"));
 
}
 
void MainWindow::closeEvent(QCloseEvent *event)
{
    //先执行多文档区域的关闭操作
    ui->mdiArea->closeAllSubWindows();
    //如果还有窗口没有关闭,则忽略该事件
    if(ui->mdiArea->currentSubWindow())
        event->ignore();
    else {
        //在关闭前写入窗口设置
        writeSettings();
        event->accept();
    }
}

MdiChild *MainWindow::activeMdiChild()
{
    //如果有活动窗口,则将其内的中心部件转换为MdiChild类型,没有则直接返回0
    if(QMdiSubWindow *activeSubWindow = ui->mdiArea->activeSubWindow())
        return qobject_cast<MdiChild*>(activeSubWindow->widget());
    return 0;
}
 
void MainWindow::on_actionSave_triggered()
{
    if(activeMdiChild()&&activeMdiChild()->save())
        ui->statusBar->showMessage(tr("文件保存成功"),2000);
}
 
void MainWindow::on_actionSaveAs_triggered()
{
    if(activeMdiChild()&&activeMdiChild()->saveAs())
        ui->statusBar->showMessage(tr("文件保存成功"),2000);
}
 
void MainWindow::on_actionUndo_triggered()
{
    if(activeMdiChild())
        activeMdiChild()->undo();
}
 
void MainWindow::on_actionRedo_triggered()
{
    if(activeMdiChild())
        activeMdiChild()->redo();
}
 
void MainWindow::on_actionCut_triggered()
{
    if(activeMdiChild())
        activeMdiChild()->cut();
}
 
void MainWindow::on_actionCopy_triggered()
{
    if(activeMdiChild())
        activeMdiChild()->copy();
}
 
void MainWindow::on_actionPaste_triggered()
{
    if(activeMdiChild())
        activeMdiChild()->paste();
}
 
void MainWindow::on_actionClose_triggered()
{
    ui->mdiArea->closeActiveSubWindow();
}
 
void MainWindow::on_actionCloseAll_triggered()
{
    ui->mdiArea->closeAllSubWindows();
}
 
void MainWindow::on_actionAbout_triggered()
{
    QMessageBox::about(this,"关于",tr("致力于多文档编辑器普及工作"));
}
 
void MainWindow::on_actionAboutQt_triggered()
{
    QMessageBox::about(this,"关于Qt",tr("Qt是一个1991年由Qt Company开发的跨平台c++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。"));
}
 
void MainWindow::on_actionExit_triggered()
{
    //等价于QApplication::closeAllWindows();
    qApp->closeAllWindows();
}

最后是main函数

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

以上就是Qt项目实战之实现多文本编辑器的详细内容,更多关于Qt多文本编辑器的资料请关注编程网其它相关文章!

--结束END--

本文标题: Qt项目实战之实现多文本编辑器

本文链接: https://www.lsjlt.com/news/200286.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt项目实战之实现多文本编辑器
    首先先来看实验成果图,大概就是这么个多文档编辑器。 首先需要在设计模式里进行设计器的设置: 然后就是新建类MdiChild的声明和实现 mdichild.h #ifndef MD...
    99+
    2023-03-19
    Qt多文本编辑器 Qt文本编辑器 Qt编辑器
  • 微信小程序实战项目之富文本编辑器实现
    目录前言1. 实现效果2. 创建发布页面,实现基本布局3. 实现编辑区操作栏的功能3.1. 实现文本加粗、斜体、文本下划线、左对齐、居中对齐、右对齐3.2. 实现撤销、恢复、插入图片...
    99+
    2022-11-13
  • Qt如何实现多文本编辑器
    本篇内容主要讲解“Qt如何实现多文本编辑器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Qt如何实现多文本编辑器”吧!首先先来看实验成果图,大概就是这么个多文档编辑器。首先需要在设计模式里进行设...
    99+
    2023-07-05
  • Qt实现文本编辑器(一)
    目录功能实现动作(QAction)实现菜单(Menus)实现工具栏(ToolBars)实现展示区域小结(一)在Qt中QMainWindow是一个为用户提供主窗口程序的类,包含了:菜单...
    99+
    2022-11-13
  • Qt实现文本编辑器(二)
    目录功能实现功能:功能1:动作消息功能2:动作事件实现功能3:文本编辑总结上一章节讲述了如何制作文本编辑页面,以及应该有哪些功能需要实现,只是做了展示效果,实际的点击事件并没有处理。...
    99+
    2022-11-13
  • Qt项目实战之实现MP3音乐播放器
    目录音乐播放器逻辑效果图具体实现音乐播放器逻辑 首先通过打开文件,获取文件夹下mp3文件的名字,将其存入QTableWidget控件下,通过双击QTableWidget空间中的内容,...
    99+
    2023-03-19
    Qt实现MP3音乐播放器 Qt MP3音乐播放器 Qt音乐播放器
  • Qt项目实战之方块游戏的实现
    目录1.方块游戏架构2.游戏逻辑3.效果图4.具体实现1.方块游戏架构 在这个游戏中,有一个区域用来摆放方块,该区域宽为10,高为20,以小正方形为单位,它可以看作是拥有20行10列...
    99+
    2023-03-19
    Qt实现方块游戏 Qt方块游戏 Qt游戏
  • C#开发WinForm项目实现HTML编辑器
    做Web开发时,我们经常会用到HTML富文本框编辑器来编写文章或产品描述的详细内容,常用的编辑器有FCKEditor、CKEditor 、TinyMCE、KindEditor和ued...
    99+
    2022-11-13
  • Qt实现一个简单的word文档编辑器
    目录1.先看效果图2.需要用到的类2.1字体选择下拉框:QFontComboBox。2.2颜色对话框:QColorDialog2.3QTextCharFormat3.源码1.先看效果...
    99+
    2022-11-13
  • java如何实现文本编辑器
    要实现一个文本编辑器,你可以使用Java的图形用户界面(GUI)库,例如Swing或JavaFX。首先,创建一个主要的窗口,可以使用...
    99+
    2023-09-06
    java
  • javascript 文本编辑器实现代码
    写一篇1800个字以上的中文文章,标题如下:JavaScript 文本编辑器实现代码JavaScript 是一种广泛应用于 Web 开发中的脚本语言,其最大的优点是可以在不重新加载整个页面的情况下,使得页面上某一部分动态地变化。文本编辑器则...
    99+
    2023-05-17
  • Python PyQt5实战项目之文件拷贝器的具体实现详解
    目录简介UI设置主要逻辑信号与槽成果展示简介 写了一个简单的文件夹内容下所有文件复制到另一个文件夹内,主要逻辑代码是来自《2小时玩转python多线程编程》中的一个章节。 UI设置 ...
    99+
    2022-11-12
  • Python PyQt5实战项目之网速监控器的实现
    目录简介psutil模块使用主界面网速线程全部代码成果展示简介 看到了一个能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息的模块–psutil模块。这...
    99+
    2022-11-12
  • JavaScript如何实现富文本编辑器
    这篇文章主要介绍JavaScript如何实现富文本编辑器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前段时间在寻找一些关于富文本编辑器的资料,然后发现了这个名为 Pell 的项目,...
    99+
    2022-10-19
  • Qt如何实现一个简单的word文档编辑器
    本文小编为大家详细介绍“Qt如何实现一个简单的word文档编辑器”,内容详细,步骤清晰,细节处理妥当,希望这篇“Qt如何实现一个简单的word文档编辑器”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.先看效果图...
    99+
    2023-07-02
  • Python PyQt5实战项目之查询器的实现流程详解
    目录简介主界面添加数据的界面删除数据的界面修改数据的界面全部代码展示简介 这是一个操作数据库(sqlite3)的项目,用PyQt5进行界面封装。 此次项目最主要的是,主界面与子界面的...
    99+
    2022-11-12
  • SpringBoot实战项目之谷歌浏览器全屏效果实现
    项目场景: 客户需求文档中,要求在Win10系统下须使用Chrome谷歌浏览器展示页面,但高层相关方希望页面展示时可以实现全屏效果以提高用户体验。 对于谷歌浏览器的全屏功能来说,前端...
    99+
    2022-11-12
  • JavaScript中怎么实现富文本编辑器
    JavaScript中怎么实现富文本编辑器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Document.execCommand()先从最简单...
    99+
    2022-10-19
  • C语言实现简易文本编辑器
    本程序要求完成一个简易文本编辑器,能够完成文本的录入、编辑、删除、查找,并能够完成文件的存取。 在文本编辑软件中把用户输入的所有文本内容作为一个字符串。虽然各种文本编辑软件的功能有强...
    99+
    2022-11-12
  • ASP.NET MVC如何实现layui富文本编辑器
    这篇“ASP.NET MVC如何实现layui富文本编辑器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作