效果如下图所示:
红色的就是我实现的软件缩放到系统托管栏里面
正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。正则表达式可以在文本中查找、替换、提取和验证特定的模式。
1、利用QT实现正则表达式,
Qt中实现正则表达式的方法主要有以下几种:
- 使用QRegExp类,这是一个用于处理正则表达式的类,它提供了一些方法和属性来创建、验证、搜索和替换正则表达式。QRegExp类支持Perl风格的正则表达式语法,也可以选择其他的语法模式。例如,您可以使用QRegExp类来验证一个邮箱地址是否合法:
代码部分如下:
// 创建一个正则表达式对象,匹配邮箱地址的格式
QRegExp rx("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");
// 创建一个邮箱地址字符串
QString email = "abc@example.com";
// 使用exactMatch()方法判断字符串是否完全符合正则表达式
bool valid = rx.exactMatch(email); // 返回true
- 使用QRegularExpression类,这是一个用于处理正则表达式的类,它是在Qt5中引入的,基于PcRE库实现,比QRegExp类更加强大和灵活2。QRegularExpression类支持ECMAScript风格的正则表达式语法,也可以选择其他的语法模式3。例如,您可以使用QRegularExpression类来查找一个字符串中所有的单词,并统计它们出现的次数:
- 代码部分如下:
// 创建一个正则表达式对象,匹配单词边界和字母数字字符
QRegularExpression re("\\b\\w+\\b");
// 创建一个字符串
QString text = "Hello, world! This is a test.";
// 使用globalMatch()方法返回一个匹配迭代器
QRegularExpressionMatchIterator i = re.globalMatch(text);
// 创建一个哈希表,用于存储单词和出现次数
QHash<QString, int> wordCount;
// 遍历匹配结果
while (i.hasNext()) {
// 获取当前匹配对象
QRegularExpressionMatch match = i.next();
// 获取匹配到的单词
QString word = match.captured(0);
// 将单词转换为小写
word = word.toLower();
// 在哈希表中增加单词出现的次数
wordCount[word]++;
}
在这里我选择第二种来进行演示:
注意要包含头文件 #include <QRegExpValidator>,不然会报错。
// 调用match()方法,传入一个要匹配的字符串
ui->textEdit->clear();
QString need = ui->lineEdit->text();
// 创建一个QRegularExpression对象,表示匹配一个整数的模式
QRegularExpression re(need);
for(const QString file : message)
{
QString p=file;
QRegularExpressionMatch match = re.match(p);
bool hasMatch = match.hasMatch(); // true
if (hasMatch)//如果符合正则表达式,那么就输出该文件名
{
// 输出该行
qDebug() << p;
ui->textEdit->append(p);
}
else{
qDebug()<<"没有匹配";
qDebug()<<need;
}
if(need=="")
{
ui->textEdit->append(p);
}
}
上述代码部分,主要是通过QlineEdit获取用户输入的正则表达式(比如:.*[指定字符].*就表示包含指定字符的任意字符段)然后就利用QRegularExpression来定义QT自带的正则表达式执行函数,QRegularExpressionMatch则是你需要匹配的string段,bool hasMatch = match.hasMatch(); 定义了一个布尔值,如果匹配成功,则会返回一个true,方便我们进行判断。
2、利用QT实现将软件缩小到,系统托管栏里面。
实现代码如下:需要包含头文件#include <QSystemTrayIcon>,不然会报错的
// 创建一个系统托盘图标
trayIcon = new QSystemTrayIcon(this);
trayIcon->setIcon(QIcon(":/Acrylic.png")); // 设置图标
trayIcon->setToolTip("最小化到托盘"); // 设置提示文本
trayIcon->show();
// 创建一个QMenu对象
QMenu *trayMenu = new QMenu(this);
// 添加菜单项
trayMenu->addAction("Show", this, SLOT(show()));
trayMenu->addAction("Hide", this, SLOT(hide()));
trayMenu->addSeparator();
trayMenu->addAction("Exit", qApp, SLOT(quit()));
// 设置系统托盘图标的菜单
trayIcon->setContextMenu(trayMenu);
// 连接系统托盘图标的activated()信号到自定义的槽函数
connect(trayIcon, &QSystemTrayIcon::activated, this, &log_device::iconActivated);
// this->show();
其中connect里面的槽函数isconActivated()函数里面的·代码如下图所示:
switch (reason) {
case QSystemTrayIcon::Trigger: // 单击左键
// 切换主窗口的可见性
setVisible(!isVisible());
break;
case QSystemTrayIcon::DoubleClick: // 双击左键
// 显示主窗口,并激活它
show();
activateWindow();
break;
case QSystemTrayIcon::MiddleClick: // 单击中键
// 在系统托盘中显示消息
trayIcon->showMessage("Message", "This is a message from tray icon");
break;
default:
break;
}
简单概述上面的功能实现:首先创建一个QSystemTrayIcon对象,然后设置好缩小到任务托管栏里面的Icon的图标进行显示,然后还有就是设置鼠标移动到软件图标的时候,出现的提示信息setToolTip(“你所想要展现的提示信息!”)。
3、实现Listview的双击触发事件
在UI界面上,拖拽出listview,选择转入槽,再选择clicked(QModellndex),即可。 然后,在on_listView_doubleClicked(const QModelIndex &index)函数下面写,自己想要实现的功能。
void log_device::on_listView_doubleClicked(const QModelIndex &index)
{
QString trans=index.data().toString();
qDebug()<<"成功"<<trans;
QString send_text_path=path+"/"+trans;
filter=new text_filter;
filter->show();
this->hide();
filter->text_show(send_text_path);
connect(filter,SIGNAL(open_main_window()), this, SLOT(rebulid_main()));
}
比如说我在这里,就是实现一个双击弹出,另一个子窗口实例化,并且当这个子窗口点击关闭的时候,会再次显示出来主窗口,而不会程序终止。
结合前面博客里面的QTimer,这里我们可以实现一个特别有意义的功能,我们可以利用QTime和QFileDialog实现,对我们日常系统的日志进行管理,包括日志的快速查看,还有对日志进行定期删除和管理(以避免日志太多,导致占据太多电脑的存储空间),具体实现设计功能如下:
首先初始化界面,进行一次判定,判定功能为:最早的日志文件和当前时间之间的天数差。(因此强烈建议将日志文件命名为_20230708_来表示日志产生的日期),比较日期大小最好的方法就是:直接算天数,年份*365天+月份*30+日期,然后直接比较差值大小。
然后,由于我们需要对定期处理这个文件夹下面的日志,所以我们需要设置定时器,让这个软件在后台,每过24小时就执行前面所描述的判定。如何实现软件后台管理,咱们只需要新建一个子线程用来进行QTimer的计时,采用子线程的目的,是为了避免堵塞主线程,从而导致咱们下一步的查看日志功能受阻。
最后就是实现查看日志功能,我接合了listview显示当前文件夹目录下面的所有文件,然后双击触发子窗口,在子窗口里面显示文本,并设置了输入栏,让用户输入正则表达式来实现,过滤一些不重要的日志信息,从而快速浏览到我们想要的日志信息。(在实现这个功能的时候,我顺便将listview部分进行了不可编辑处理,来避免不必要的麻烦,另外还优化了逻辑,比如子窗口的关闭会返回到主窗口的显示,而子窗口在显示过程中,直接隐藏主窗口,另外还添加了隐藏在任务托管栏里面的软件图标,三个右键选项【hide,show,exit】)
以上就是我的软件设计心得。