本文续写(继承)自:一个项目带你入门qt - 记事本(上)-优快云博客
没看过的朋友还请线了解前文
目录
字体缩放(大Ctrl+Shift+= 小Ctrl+Shift+- )
效果演示视频:
什么?你还在用普通的记事本?快来试试QT小项目——记事本,让你成为记事本界的王者!_哔哩哔哩_bilibili
项目学到的qt知识总结:
前置知识
C++模版
基本写法引入:
#include <iostream>
using namespace std;
class PrintIn{
public:
int data;
void printIn();
void setIn(int data);
};
void PrintIn::printIn()
{
cout<<this ->data<<endl;
}
void PrintIn::setIn(int data)
{
this->data = data;
}
class PrintStr{
public:
string data;
void printStr();
void setStr(string data);
};
void PrintStr::printStr()
{
cout<<this ->data<<endl;
}
void PrintStr::setStr(string data)
{
this->data = data;
}
int main()
{
PrintIn in;
in.setIn(10);
in.printIn();
PrintStr str;
str.setStr("mxjun");
str.printStr();
return 0;
}
可以看到只是 成员变量不一样,却要重写类的函数,很麻烦
我们引入类模版可以解决
概念
在 C++ 中,模板(Template)是一种通用的编程工具,允许程序员编写泛型代码,使得类或函数能够适用于多种不同的数据类型而不需要重复编写相似的代码。C++ 提供了两种主要类型的模板:类模板和函
数模板。
类模板(Class Templates):
类模板允许定义通用的类,其中某些类型可以作为参数。这样的类可以处理不同类型的数据,而不需要为每个数据类型编写单独的类
#include <iostream>
using namespace std;
template <typename T>
class PrintEvething{
public:
T data;
void printEvething()
{
cout<<data<<endl;
}
void setEvething(T data)
{
this->data = data;
}
};
// 注意模版不支持类外实例化
//void PrintEvething::printStr()
//{
// cout<<this ->data<<endl;
//}
//void PrintEvething::setEvething(string data)
//{
// this->data = data;
//}
int main()
{
PrintEvething<int> ev; //模版类实例化创建对象的时候鼻血指定类型
ev.setEvething(10);
ev.printEvething();
PrintEvething<string> sev;
sev.setEvething("这是一个泛型");
sev.printEvething();
return 0;
}
函数模版:
#include <iostream>
using namespace std;
template<typename TE>
TE add(TE a,TE b)
{
return a+b;
}
int main()
{
int sumInt = add(4,5);
double sumDouble = add(4.4,5.5);
cout<< sumInt<<endl;
cout<< sumDouble<<endl;
return 0;
}
QList
概念
在 Qt 框架中, QList 是一个容器类,它在内部实现上类似于一个数组,但也提供了一些链表的特性。
QList 的设计旨在提供一个在多数情况下既高效又方便的通用列表容器。
用于存储元素列表。它提供了丰富的功能,包括添加、移除、访问元素等。
QList 的内部工作原理:
1. 数组式存储: QList 在大多数情况下使用连续内存存储其元素,类似于数组。这意味着它提供了快速的索引访问(通过下标操作符 [] ),以及相对高效的迭代性能。
2. 动态调整大小:与静态数组不同, QList 可以动态增长和缩减,自动管理内存分配。
3. 链表特性:虽然 QList 主要基于数组,但它也提供了一些链表的操作,比如在列表的开始或结束
处添加和移除元素。这些操作通常比在数组中间插入或删除元素更高效。
4. 复制时共享内存: QList 使用一种称为“隐式共享”(implicit sharing)或“写时复制”(copy-on -write)的技术。这意味着当你复制一个 QList 时,它不会立即复制所有元素,而是共享相同的数据,直到你尝试修改其中一个列表,此时才进行实际的复制。这使得复制 QList 变得非常高效。
使用场景:
当你需要快速的随机访问(如通过索引访问元素)时, QList 是一个不错的选择。
如果你的主要操作是在列表的两端添加或移除元素, QList 也表现得很好。
基本用法
包含头文件:首先,你需要包含 QList 的头文件
#include <QList>
创建 QList 实例:创建一个 QList 对象,并指定存储的元素类型。
QList<int> list;
添加元素:使用 append 或 push_back 方法添加元素
list.append(1);
list.append(2);
list.append(3);
访问元素:可以使用下标操作符或 at() 方法访问元素。
int firstElement = list[0];
int secondElement = list.at(1);
遍历列表:使用迭代器或范围基的 for 循环遍历列表。
for(int i = 0; i < list.size(); ++i) { // size = sizeof(arr)/sizeof(arr[0])
qDebug() << list[i];
}
// 或者使用范围基的 for 循环
for(int item : list) {
qDebug() << item;
}
移除元素:使用 removeAt 、 removeOne 或 clear 方法移除元素
list.removeAt(1); // 移除索引为 1 的元素
list.removeOne(3); // 移除一个值为 3 的元素
list.clear(); // 清空整个列表
ExtraSelection
简介
QTextEdit::ExtraSelection 是一个在 QTextEdit 中用来表示额外的文本选择和高亮的结构。
如何工作
1. ExtraSelection 结构体: QTextEdit::ExtraSelection 是一个结构体,包含了两个主要成员:
QTextCursor 和 QTextCharFormat 。
QTextCursor 表示在文本中的一个位置或者区间,而
QTextCharFormat 用于定义这个区间的格式,比如背景颜色、字体等。
2. 设置 ExtraSelection:你可以创建一个或多个 ExtraSelection 对象,为它们设置相应的光标位
置和格式,然后通过 QTextEdit 的 setExtraSelections 方法将这些对象应用到文本编辑器中。
这样,你可以对文本的特定部分应用特定的格式,而不影响其他文本。
3. 高亮当前行:要高亮显示当前行,你需要在 cursorPositionChanged() 信号的槽函数中创建一个ExtraSelection 对象。使用当前的 QTextCursor 对象(通过 textCursor() 方法获取)来确
定当前行的位置,并设置背景颜色为你选择的高亮颜色。
QTextCharFormat
QTextCharFormat 类是 Qt 框架中的一部分,用于描述文本字符的格式。这个类提供了丰富的接口来设置和获取文本字符的各种属性,如字体、颜色、背景色等。 QTextCharFormat 通常用于富文本处理,可以在像 QTextEdit 和 QTextDocument 这样的类中使用
常用功能和方法
下面列出了 QTextCharFormat 的一些常用功能和方法:
1. 设置和获取字体样式:
使用 setFont() 方法设置字体。
通过 font() 方法获取当前字体2. 设置字体属性:
setFontWeight() : 设置字体的粗细。
setFontItalic() : 设置字体是否倾斜。
setFontUnderline() : 设置是否有下划线。3. 设置文本颜色和背景色:
setForeground() : 设置文本的前景色(即字体颜色)。
setBackground() : 设置文本的背景色。4. 其他文本属性:
setToolTip() : 设置文本的工具提示。
setAnchor() : 设置文本是否为超链接。
setAnchorHref() : 设置超链接的目标 URL。
总程序:
ui总图
更多空间细节请参考上篇:一个项目带你入门qt - 记事本(上)-优快云博客
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QMessageBox>
#include <QShortcut>
#include <QWheelEvent>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->textEdit->installEventFilter(this);
QShortcut *shortcutOpen = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")),this);
QShortcut *shortcutSave = new QShortcut(QKeySequence(tr("Ctrl+S", "File|Sa