Qt5實(shí)現(xiàn)文本編輯器(附詳細(xì)代碼)
1. 功能介紹
老規(guī)矩,我們直接上截圖
這是主界面
文件菜單界面
編輯菜單界面
設(shè)置菜單界面
關(guān)于菜單界面
2. 功能演示
設(shè)置字體顏色
設(shè)置字體大小
點(diǎn)擊關(guān)于菜單
點(diǎn)擊關(guān)于Qt菜單
會(huì)自動(dòng)跳轉(zhuǎn)到Qt的官網(wǎng)
點(diǎn)擊圖片轉(zhuǎn)PDF
打開(kāi)文件等對(duì)話框
3. 代碼
我們直接上代碼
aboutwidget.h
#ifndef ABOUTWIDGET_H #define ABOUTWIDGET_H #include <QWidget> namespace Ui { class AboutWidget; } class AboutWidget : public QWidget { Q_OBJECT public: explicit AboutWidget(QWidget *parent = nullptr); ~AboutWidget(); private: Ui::AboutWidget *ui; }; #endif // ABOUTWIDGET_H
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QFont> #include <QColor> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_actionexit_triggered(); void on_actioncolor_triggered(); void on_actionfont_triggered(); void on_actionne_triggered(); void on_actionopen_triggered(); void on_actionsave_triggered(); void on_actionasfile_triggered(); void on_actioncut_triggered(); void on_actioncopy_triggered(); void on_actionundo_triggered(); void on_actionredo_triggered(); void on_actionpatse_triggered(); void on_actionAbout_triggered(); void on_actionAboutQT_triggered(); void on_actionPDF_triggered(); private: Ui::MainWindow *ui; QFont font; QColor color; QString currentFile; }; #endif // MAINWINDOW_H
topdf.h
#ifndef TOPDF_H #define TOPDF_H #include <QWidget> namespace Ui { class ToPdf; } class ToPdf : public QWidget { Q_OBJECT public: explicit ToPdf(QWidget *parent = nullptr); ~ToPdf(); bool pictureToPDF(QString sourth,QString sDir); private slots: void on_pictureBtn_clicked(); void on_saveBtn_clicked(); void on_startBtn_clicked(); private: Ui::ToPdf *ui; }; #endif // TOPDF_H
aboutwidget.cpp
#include "aboutwidget.h" #include "ui_aboutwidget.h" AboutWidget::AboutWidget(QWidget *parent) : QWidget(parent), ui(new Ui::AboutWidget) { ui->setupUi(this); ui->Pixmap->setPixmap(QPixmap(":/dog.jpg").scaled(141,131,Qt::KeepAspectRatio)); } AboutWidget::~AboutWidget() { delete ui; }
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.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QFontDialog> #include <QColorDialog> #include <QFile> #include <QFileDialog> #include <QMessageBox> #include <QTextStream> #include <QTextCodec> #include <QDesktopServices> #include "aboutwidget.h" #include "topdf.h" // #pragma execution_character_set("utf-8") MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 設(shè)置文本框?yàn)閱喂ぷ鲄^(qū) setCentralWidget(ui->textEdit); font = QFont("宋體",18,QFont::Normal,true); color = QColor(Qt::black); // 工具條,項(xiàng)目默認(rèn)生成一個(gè) // 工具條上放的是菜單常用的菜單項(xiàng) // 所以工具條和菜單共用QAction,得通過(guò)代碼添加 ui->toolBar->addAction(ui->actionne); ui->toolBar->addAction(ui->actionopen); ui->toolBar->addAction(ui->actionsave); ui->toolBar->addAction(ui->actionPDF); ui->toolBar->addAction(ui->actionundo); ui->toolBar->addAction(ui->actionredo); ui->toolBar->addAction(ui->actioncopy); ui->toolBar->addAction(ui->actionpatse); ui->toolBar->addAction(ui->actioncolor); ui->toolBar->addAction(ui->actionfont); ui->toolBar->addAction(ui->actioncut); ui->toolBar->addSeparator(); ui->toolBar->addAction(ui->actionexit); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_actionexit_triggered() { close(); } void MainWindow::on_actioncolor_triggered() { QColor c = QColorDialog::getColor(color,this,"顏色選擇框"); if(c.isValid()){ color = c; // 設(shè)置文本框的文本顏色 // 1. 從光標(biāo)開(kāi)始新輸入的文本顏色被設(shè)置 // 2. 鼠標(biāo)選中的文本顏色設(shè)置 ui->textEdit->setTextColor(c); } } void MainWindow::on_actionfont_triggered() { bool ok; // 用戶字體對(duì)話框保存是否選擇了字體的結(jié)構(gòu) // 第一個(gè)參數(shù)是判斷用戶是否選擇了字體,第二個(gè)是字體對(duì)話框的初始值 QFont f = QFontDialog::getFont(&ok,font,this,"選擇文本框要設(shè)置的字體"); if(ok){ font = f; // 1. 從當(dāng)前光標(biāo)開(kāi)始 // 2. 鼠標(biāo)選中的文本的字體 ui->textEdit->setCurrentFont(f); } } void MainWindow::on_actionne_triggered() { QMessageBox::warning(this,tr("Warning"), tr("創(chuàng)建新文件?"), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No); currentFile.clear(); ui->textEdit->setText(QString()); } void MainWindow::on_actionopen_triggered() { QString fileName = QFileDialog::getOpenFileName(this, "打開(kāi)文件"); QFile file(fileName); currentFile = fileName; if (!file.open(QIODevice::ReadOnly | QFile::Text)) { QMessageBox::warning(this, "警告", "無(wú)法打開(kāi)文件: " + file.errorString()); return; } setWindowTitle(fileName); QTextStream *in = new QTextStream(&file); in->setCodec("UTF-8"); QString text = in->readAll(); ui->textEdit->setText(text); delete in; file.close(); } void MainWindow::on_actionsave_triggered() { QString fileName; // 若沒(méi)有文件,重新創(chuàng)建一個(gè) if (currentFile.isEmpty()) { fileName = QFileDialog::getSaveFileName(this, "Save"); currentFile = fileName; } else { fileName = currentFile; } // 打開(kāi)文件 QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QFile::Text)) { QMessageBox::warning(this, "警告", "無(wú)法打開(kāi)文件: " + file.errorString()); return; } setWindowTitle(fileName); QTextStream out(&file); out.setCodec("UTF-8"); QString text = ui->textEdit->toPlainText(); out << text; file.close(); } void MainWindow::on_actionasfile_triggered() { QString fileName = QFileDialog::getSaveFileName(this, "另存為"); QFile file(fileName); if (!file.open(QFile::WriteOnly | QFile::Text)) { QMessageBox::warning(this, "警告", "無(wú)法打開(kāi)文件: " + file.errorString()); return; } currentFile = fileName; setWindowTitle(fileName); QTextStream out(&file); QString text = ui->textEdit->toPlainText(); out << text; file.close(); } void MainWindow::on_actioncut_triggered() { ui->textEdit->cut(); } void MainWindow::on_actioncopy_triggered() { ui->textEdit->copy(); } void MainWindow::on_actionundo_triggered() { ui->textEdit->undo(); } void MainWindow::on_actionredo_triggered() { ui->textEdit->redo(); } void MainWindow::on_actionpatse_triggered() { ui->textEdit->paste(); } void MainWindow::on_actionAbout_triggered() { static AboutWidget about; about.show(); } void MainWindow::on_actionAboutQT_triggered() { QDesktopServices::openUrl(QUrl(QLatin1String("https://www.qt.io/zh-cn/"))); } void MainWindow::on_actionPDF_triggered() { static ToPdf pdf; pdf.show(); }
topdf.cpp
#include "topdf.h" #include "ui_topdf.h" #include <QFileDialog> #include <QMessageBox> #include <QPainter> #include <QtPrintSupport/QPrinter> ToPdf::ToPdf(QWidget *parent) : QWidget(parent), ui(new Ui::ToPdf) { ui->setupUi(this); } ToPdf::~ToPdf() { delete ui; } bool ToPdf::pictureToPDF(QString sourth, QString sDir) { try { QPixmap pixmap(sourth); //圖片生成pdf QPrinter printerPixmap(QPrinter::HighResolution); printerPixmap.setPageSize(QPrinter::Custom); //設(shè)置紙張大小為A4 printerPixmap.setOutputFormat(QPrinter::PdfFormat); //設(shè)置輸出格式為pdf printerPixmap.setOutputFileName(sDir); //設(shè)置輸出路徑 double dHeight = 300; double dWidth = (double)pixmap.width() / (double)pixmap.height() * dHeight; printerPixmap.setPageSizeMM(QSize(dWidth, dHeight)); printerPixmap.setPageMargins(0, 0, 0, 0, QPrinter::DevicePixel); QPainter painterPixmap; painterPixmap.begin(&printerPixmap); QRect rect = painterPixmap.viewport(); float multiple = (double(rect.width()) / pixmap.width()); float yMultiple = (double(rect.height()) / pixmap.height()); float fMin = (multiple < yMultiple) ? multiple : yMultiple; painterPixmap.scale(fMin, fMin); //將圖像(所有要畫的東西)在pdf上放大multiple-1倍 painterPixmap.drawPixmap(0, 0, pixmap.width(), pixmap.height(), pixmap); //畫圖 painterPixmap.end(); return true; } catch (...) { return false; } } void ToPdf::on_pictureBtn_clicked() { //定義文件對(duì)話框類 QFileDialog *fileDialog = new QFileDialog(this); //定義文件對(duì)話框標(biāo)題 fileDialog->setWindowTitle(tr("選擇圖片")); //設(shè)置默認(rèn)文件路徑 //fileDialog->setDirectory("."); //設(shè)置文件過(guò)濾器 fileDialog->setNameFilter(tr("Images(*.png *.jpg *.jpeg *.bmp)")); //設(shè)置可以選擇多個(gè)文件,默認(rèn)為只能選擇一個(gè)文件QFileDialog::ExistingFiles //fileDialog->setFileMode(QFileDialog::ExistingFiles); //設(shè)置視圖模式 fileDialog->setViewMode(QFileDialog::Detail); //打印所有選擇的文件的路徑 // 獲取選擇的文件名 QStringList fileNameList; // exec()模態(tài)對(duì)話框 if(fileDialog->exec()){ fileNameList = fileDialog->selectedFiles(); } ui->pictureFileName->setText(fileNameList[0]); //emit fileName(fileNameList); } void ToPdf::on_saveBtn_clicked() { //定義文件對(duì)話框類 QFileDialog *fileDialog = new QFileDialog(this); //定義文件對(duì)話框標(biāo)題 fileDialog->setWindowTitle(tr("選擇PDF")); fileDialog->setViewMode(QFileDialog::Detail); //打印所有選擇的文件的路徑 //設(shè)置文件過(guò)濾器 fileDialog->setNameFilter(tr("*.pdf")); // 獲取選擇的文件名 QStringList fileNameList; // exec()模態(tài)對(duì)話框 if(fileDialog->exec()){ fileNameList = fileDialog->selectedFiles(); } ui->saveFileName->setText(fileNameList[0]); } void ToPdf::on_startBtn_clicked() { QString picture = ui->pictureFileName->text(); QString pdf = ui->pictureFileName->text(); if(pictureToPDF(picture,pdf)){ QMessageBox::information(this,"轉(zhuǎn)換成功","轉(zhuǎn)換成功?。。?); }else{ QMessageBox::information(this,"轉(zhuǎn)換失敗","轉(zhuǎn)換失?。?); } }
4. 改進(jìn)
有許多改進(jìn)的地方
- 首先是圖片轉(zhuǎn)PDF這塊,需要選中一個(gè)pdf文件,而不是選中目錄
- 然后可以寫一個(gè)PDF轉(zhuǎn)圖片,加一些小功能,水印什么的
- 然后可以開(kāi)始兼容doc,docx文件,實(shí)現(xiàn)一個(gè)小小的wps
- 然后程序里沒(méi)有用到多線程,有些時(shí)候會(huì)卡頓,有些地方?jīng)]有異常處理,會(huì)造成閃退
總之,如果你真想用這個(gè)軟件來(lái)編輯文本,那還是很難受的,不好用,但是作為練手的項(xiàng)目來(lái)說(shuō),還不錯(cuò)
到此這篇關(guān)于Qt5實(shí)現(xiàn)文本編輯器(附圖片轉(zhuǎn)PDF與詳細(xì)代碼)的文章就介紹到這了,更多相關(guān)Qt5 文本編輯器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ubuntu20.04安裝使用jsoncpp、json-c庫(kù)的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Ubuntu20.04安裝使用jsoncpp、json-c庫(kù)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作就有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-04-04C語(yǔ)言中實(shí)現(xiàn)itoa函數(shù)的實(shí)例
這篇文章主要介紹了C語(yǔ)言中實(shí)現(xiàn)itoa函數(shù)的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10c++ 如何在libuv中實(shí)現(xiàn)tcp服務(wù)器
這篇文章主要介紹了c++ 如何在libuv中實(shí)現(xiàn)tcp服務(wù)器,幫助大家更好的理解和使用libuv,感興趣的朋友可以了解下2021-02-02C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的學(xué)生學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07C語(yǔ)言SQLite3事務(wù)和鎖的操作實(shí)例
這篇文章主要介紹了C語(yǔ)言SQLite3事務(wù)和鎖的操作,結(jié)合完整實(shí)例形式分析了C語(yǔ)言針對(duì)SQLite3數(shù)據(jù)庫(kù)的事務(wù)與鎖相關(guān)操作技巧,需要的朋友可以參考下2017-07-07C++實(shí)現(xiàn)LeetCode(141.單鏈表中的環(huán))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(141.單鏈表中的環(huán)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07