利用QT实现正则表达式搜索和缩小到系统托管任务栏里面

效果如下图所示:

红色的就是我实现的软件缩放到系统托管栏里面 

正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。正则表达式可以在文本中查找、替换、提取和验证特定的模式。

1、利用QT实现正则表达式,

Qt中实现正则表达式的方法主要有以下几种:

  • 使用QRegExp类,这是一个用于处理正则表达式的类,它提供了一些方法和属性来创建、验证、搜索和替换正则表达式。QRegExp类支持Perl风格的正则表达式语法,也可以选择其他的语法模式。例如,您可以使用QRegExp类来验证一个邮箱地址是否合法:

        代码部分如下:

// 创建一个正则表达式对象,匹配邮箱地址的格式
QRegExp rx("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");
// 创建一个邮箱地址字符串
QString email = "[email protected]";
// 使用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,方便我们进行判断。

扫描二维码关注公众号,回复: 16113544 查看本文章

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】)

以上就是我的软件设计心得。

猜你喜欢

转载自blog.csdn.net/Helloorld_1/article/details/132146359