当前位置:网站首页>QT专题:组合会话框和文本编辑器
QT专题:组合会话框和文本编辑器
2022-08-02 09:29:00 【迷途君】
目录
QT中已经帮我们内置了一些对话框,可以帮助我们快速的完成一些基础功能界面的绘制,接下来我会介绍一些基础的会话框,并且通过这些会话框完成文本编辑器基础功能的实现。
1.颜色对话框 QColor
bt_color = new QPushButton("颜色");//创建一个颜色按钮
connect(bt_color, &QPushButton::clicked, this, &Widget::get_color);//将按钮和后台槽函数进行链接
QColor color = QColorDialog::getColor(); //弹出一个颜色对话框,并且返回用户选择的颜色
2.错误消息提示框 QErrorMessage
我们经常可以看到一些软件会有错误警告框,在软件发生错误时,提示用户,QT也给我们提供了这样一个消息框。
bt_errmsg = new QPushButton("错误消息");
connect(bt_errmsg, SIGNAL(clicked(bool)), this, SLOT(show_errmsg()));
void Widget::show_errmsg()
{
QErrorMessage emg; //TODO
emg.showMessage("aaaaaaaaaaaaaaaaaaaaaa");
emg.exec();//模态显示,只能操作当前会话框
}
3.文件路径选择框 GFileDialog
bt_file = new QPushButton("文件路径选择");
connect(bt_file, SIGNAL(clicked(bool)), this, SLOT(get_filepath()));
void Widget::get_filepath()
{
//QString filepath = QFileDialog::getOpenFileName(); //弹出一个文件选择对话框,并且返回文件路径
QStringList filepaths = QFileDialog::getOpenFileNames(this, "打开文件", "C:\\Users\\admin\\Desktop\\12-CPP-QT课程已加密", "Images (*.png *.bmp *.jpg)"); //弹出一个文件选择对话框,并且返回一堆文件路径
for(int i=0; i<filepaths.length(); i++)
te->append(filepaths[i]);
}
4.字体选择框 QFont
在一些文本编辑器中都有将文字字体改变的功能,而QT也给我们提供了这样一个会话框。
bt_font = new QPushButton("字体选择");
connect(bt_font, &QPushButton::clicked, this, &Widget::get_font);
void Widget::get_font()
{
// QFontDialog *d = new QFontDialog;
// d->exec();
bool ok;
QFont font = QFontDialog::getFont(&ok); //弹出字体对话框,并且界面小时的时候反馈用户选择的字体
if(ok)
{
//te->setFont(font); //设置整个文本框的字体
te->setCurrentFont(font); //设置被选中的文字的字体
}
}注意:QFontDialog::getFont()表示该函数是这个字体类的一个静态成员函数,所以可以直接这样调用。

5. 输入框 QInputDialog
bt_input = new QPushButton("输入框");
connect(bt_input, SIGNAL(clicked(bool)), this, SLOT(get_input()));
void Widget::get_input()
{
QString name = QInputDialog::getText(this, "xxx", "你的名字");//该函数也是输入类的一个静态函数
te->append(name);
}
6.消息框 QMessageBox
bt_msg = new QPushButton("消息");
connect(bt_msg, SIGNAL(clicked(bool)), this, SLOT(show_msg()));
void Widget::show_msg()
{
QMessageBox msgBox;
msgBox.setText("The document has been modified.");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);//设置选项的函数
qDebug() << msgBox.exec();
}
setStandarButtons是一个消息类设置选项的一个成员函数这里通过对象进行调用。
7.进度框 QProgressDialog
bt_progress = new QPushButton("进度");
connect(bt_progress, SIGNAL(clicked(bool)), this, SLOT(show_progress()));
void Widget::show_progress()
{
QProgressDialog progress("正在下载", "取消", 0, 100);
progress.setValue(60);
progress.exec();
}
下面我们可以通过上面这些知识编写一个文本编辑器实现一些基本的功能了
文本编辑器案例
这里补充一个小知识,如果你想要将一些图标图片资源和程序放在一起进行编译,那么可以创建resources文件,将图片放进去,这样在程序中使用起来会更方便。


图片中可以看到我们使用了mainwindow这个窗口,当我们功能比较多时就会选择用这种类型的窗口界面来进行编程。
1.首先我们要将文本编辑器所有的功能动作action创建出来,并将他们和槽函数进行关联,来实现对应的功能。
//0. 构造所有的action
QAction *new_action = new QAction(QIcon(":/img/new.png"), "新建");
new_action->setShortcut(QKeySequence("Ctrl+N"));
connect(new_action, SIGNAL(triggered(bool)), this, SLOT(new_file()));
QAction *open_action = new QAction(QIcon(":/img/open.png"), "打开");
open_action->setShortcut(QKeySequence("Ctrl+O"));
connect(open_action, SIGNAL(triggered(bool)), this, SLOT(open_file()));
//open_action->setEnabled(false);
QAction *saveas_action = new QAction(QIcon(":/img/saveas.png"), "另存为");
saveas_action->setShortcut(QKeySequence("Ctrl+Y"));
connect(saveas_action, SIGNAL(triggered(bool)), this, SLOT(saveas_file()));
QAction *save_action = new QAction(QIcon(":/img/save.png"), "保存");
save_action->setShortcut(QKeySequence("Ctrl+s"));
connect(save_action, SIGNAL(triggered(bool)), this, SLOT(save_file()));
QAction *close_action = new QAction(QIcon(":/img/close.png"), "关闭");
close_action->setShortcut(QKeySequence("Ctrl+X"));
connect(close_action, SIGNAL(triggered(bool)), this, SLOT(close_file()));
QAction *font_action = new QAction(QIcon(":/img/font.png"), "字体");
font_action->setShortcut(QKeySequence("Ctrl+f"));
connect(font_action, SIGNAL(triggered(bool)), this, SLOT(set_font()));
QAction *color_action = new QAction(QIcon(":/img/color.png"), "颜色");
color_action->setShortcut(QKeySequence("Ctrl+f"));
connect(color_action, SIGNAL(triggered(bool)), this, SLOT(set_color()));
QAction *copy_action = new QAction(QIcon(":/img/copy.png"), "复制");
copy_action->setShortcut(QKeySequence("Ctrl+c"));
connect(copy_action, SIGNAL(triggered(bool)), this, SLOT(set_copy()));
QAction *paste_action = new QAction(QIcon(":/img/paste.png"), "粘贴");
paste_action->setShortcut(QKeySequence("Ctrl+v"));
connect(paste_action, SIGNAL(triggered(bool)), this, SLOT(set_paste()));
QAction *cut_action = new QAction(QIcon(":/img/cut.png"), "剪切");
cut_action->setShortcut(QKeySequence("Ctrl+r"));
connect(cut_action, SIGNAL(triggered(bool)), this, SLOT(set_cut()));2.获取菜单栏,并给菜单栏添加选项
//1. 获取菜单栏menuBar(),添加菜单->addMenu,添加选项
QMenu *fileMenu = menuBar()->addMenu("&File"); //&F: 用键盘Alt+f
fileMenu->addAction(new_action);
fileMenu->addAction(open_action);
fileMenu->addAction(save_action);
fileMenu->addAction(saveas_action);
fileMenu->addAction(close_action);
fileMenu->addAction(copy_action);
fileMenu->addAction(paste_action);
fileMenu->addAction(cut_action);
QMenu *editMenu = menuBar()->addMenu("&Edit"); //&E: 用键盘Alt+e
editMenu->addAction(font_action);
editMenu->addAction(color_action);3.将一些常用的功能放到工具栏
//2. 工具栏
QToolBar *filetoolbar = addToolBar("file"); //添加一个工具栏,并且放入常用的action
filetoolbar->addAction(new_action);
filetoolbar->addAction(open_action);
filetoolbar->addAction(save_action);
filetoolbar->addAction(saveas_action);
filetoolbar->addAction(close_action);
filetoolbar->addAction(copy_action);
filetoolbar->addAction(paste_action);
filetoolbar->addAction(cut_action);
QToolBar *edittoolbar = addToolBar("edit"); //添加一个工具栏,并且放入常用的action
edittoolbar->addAction(font_action);
edittoolbar->addAction(color_action);
QToolBar *xxxtoolbar = addToolBar("编译"); //添加一个工具栏,并且放入常用的action
QToolButton *tb = new QToolButton;
tb->setText("编译");
xxxtoolbar->addWidget(tb);
4.设置中央部件
这里我们只需在中间添加一个文本编辑框即可
//3. 设置中央部件
te = new QTextEdit;
te->setMinimumSize(640, 480);
this->setCentralWidget(te);
te->setDisabled(true);5.设置状态栏
我们可以通过状态栏来展示文件的状态,是否被编辑等
//4. 状态栏
lb = new QLabel;
QStatusBar *st = statusBar();
st->addWidget(lb);
connect(te, &QTextEdit::textChanged, [&]{
if(!lb->text().contains('*'))
lb->setText(lb->text()+'*');
});//朗达表达式也叫无名函数,不需要再编写槽函数进行关联使用这里我们使用了无名函数(朗达表达式的方式来替换原来的槽函数,这是一个比较高级的写法)这里的意思如果文本被编辑内容被改变那么状态栏就会加上*号来展示。
6.编写槽函数完成相应功能
//设置字体的槽函数
void MainWindow::set_font()
{
qDebug() << "set font........";
bool ok;
QFont font = QFontDialog::getFont(&ok);
if(ok)
te->setCurrentFont(font);//设置选中的文本内容的字体
}
//设置字体颜色的槽函数
void MainWindow::set_color()
{
qDebug() << "set color........";
QColor color = QColorDialog::getColor();
te->setTextColor(color);
}
//新建文件的槽函数
void MainWindow::new_file()
{
qDebug() << "new........";
te->setEnabled(true);
if(lb->text().contains('*')) //有文件在编辑中
{
close_file();
}
else
{
//清除工作区
te->clear();
lb->clear();
}
}
//打开文件的槽函数
void MainWindow::open_file()
{
qDebug() << "open........";
te->setEnabled(true);
//1. 提取文件路径
QString path = QFileDialog::getOpenFileName();
//2. 提取出文件内容 QFile
QFile f(path);
f.open(QIODevice::ReadOnly);
QByteArray buf = f.readAll();
f.close();
//3. 将内容显示在文本编辑框
te->setText(buf);
//4. 显示文件路径在状态栏
lb->setText(path);
}
//保存文件内容的槽函数
void MainWindow::save_file()
{
//1. 提取文件路径
QString str = lb->text();
if(!str.contains('*')) //如果文件未有改动
return;
str.chop(1);
if(str.isEmpty()) //这是一个新建的文件
{
saveas_file();
return;
}
//2. 提取文本编辑框的内容
QString buf = te->toPlainText();
//3. 将内容写入文件
QFile f(str);
f.open(QIODevice::WriteOnly);
f.write(buf.toStdString().c_str());
f.close();
//4. 更新状态栏
lb->setText(str);
}
//将文件另存为的槽函数
void MainWindow::saveas_file()
{
//1. 提取文件路径
QString str = QFileDialog::getSaveFileName();
if(str.isEmpty())
return;
//2. 提取文本编辑框的内容
QString buf = te->toPlainText();
//3. 将内容写入文件
QFile f(str);
f.open(QIODevice::WriteOnly);
f.write(buf.toStdString().c_str());
f.close();
//3. 更新状态栏
lb->setText(str);
}
//关闭文件的槽函数
void MainWindow::close_file()
{
qDebug() << "close........";
if(lb->text().contains('*')) //有文件被编辑中
{
//1. 弹框提示是否需要保存
QMessageBox msgBox;
msgBox.setText("The document has been modified.");
msgBox.setInformativeText("Do you want to save your changes?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
//2. 如果要保存
if(QMessageBox::Save == ret)
save_file();
else if(QMessageBox::Cancel == ret)
return;
}
//清除工作区
te->clear();
lb->clear();
}
void MainWindow::set_copy()
{
te->copy();
}
void MainWindow::set_paste()
{
te->paste();
}
void MainWindow::set_cut()
{
te->cut();
}
MainWindow::~MainWindow()
{
}
边栏推荐
- Pytorch的LSTM参数解释
- Jenkins--基础--5.4--系统配置--全局工具配置
- Openwrt_树莓派B+_Wifi中继
- 用汇编实现爱心特效【七夕来袭】
- 日元疲软令游戏机在日本变身“理财产品”:黄牛大赚
- js引擎运行中的预解析(变量提升和函数提升)及相关实操案例
- WebGPU 导入[1] - 入门常见问题与个人分享
- 【云原生】快出数量级的性能是怎样炼成的?就提升了亿点点
- The use of thread pool and analysis of ThreadPoolExecutor source code
- Spend 2 hours a day to make up for Tencent T8, play 688 pages of SSM framework and Redis, and successfully land on Meituan
猜你喜欢

Have you ever learned about these architecture designs and architecture knowledge systems?(Architecture book recommendation)

Two-dimensional array piecemeal knowledge sorting

The perceptron perceptron of Li Hang's "Statistical Learning Methods" notes

The use of thread pool and analysis of ThreadPoolExecutor source code

Supervised learning of Li Hang's "Statistical Learning Methods" Notes

In the whole development of chi V853 board tried to compile QT test

node封装一个图片拼接插件

Jenkins--基础--5.4--系统配置--全局工具配置

The god-level Alibaba "high concurrency" tutorial "basic + actual combat + source code + interview + architecture"

Daily practice of dynamic programming (3)
随机推荐
初学者怎么快速学会SQL
SAP 云平台上一种 Low Code Development(低代码开发)解决方案
HikariCP数据库连接池,太快了!
Overview of Edge Computing Open Source Projects
一文带你了解推荐系统常用模型及框架
tf中tensor的大小输出
Supervised learning of Li Hang's "Statistical Learning Methods" Notes
【Flink 问题】Flink 如何提交轻量jar包 依赖该如何存放 会遇到哪些问题
每天花2小时恶补腾讯T8纯手打688页SSM框架和Redis,成功上岸美团
Facebook's automated data analysis solution saves worry and effort in advertising
node制作一个视频帧长图生成器
ORBSLAM代码阅读
【云原生】快出数量级的性能是怎样炼成的?就提升了亿点点
数据库mysql
Jenkins--基础--6.2--Pipeline--语法--声明式
C语言volatile关键字、内嵌汇编volatile与编译器的爱恨情仇
AutoJs学习-存款计算器
【Redis】通用命令
百战RHCE(第四十七战:运维工程师必会技-Ansible学习2-Ansible安装配置练习环境)
js引擎运行中的预解析(变量提升和函数提升)及相关实操案例