Qt开发学习笔记04

这篇博客详细介绍了Qt开发中的多个实用知识点,包括Qt C++中的静态全局常量、查找并关闭子窗口的方法、QDialog的show和exec的区别、Qt中isNumber和isDigit的差异、QChar类中用于判断字符类型的函数、QString常用函数、QLineEdit去除鼠标焦点的技巧、添加阴影效果的方法、QtConcurrent的异步处理方法以及如何检测IP地址是否能ping通。此外,还探讨了QTimer的setSingleShot作用、Qt在Windows下的部署步骤、Qt应用在触摸设备上的滑动支持、Qt输入框在不同编译模式下的显示问题、简单的加密解密方法、进度条颜色修改、QString的number方法、日志输出到文件以及在非GUI线程中处理QWidget的错误。博客内容涵盖了Qt开发的多个方面,对开发者具有很高的参考价值。
摘要由CSDN通过智能技术生成

Qt C++ 静态全局常量

QStackedWidget为例

在 Qt C++ 中,QStackedWidget 是一个用于管理多个界面堆叠的控件。它可以显示其中一个界面,并允许您在堆栈中切换界面。

如果您想在整个程序中共享一个静态全局常量 QStackedWidget 实例,您可以在全局范围内声明一个指向 QStackedWidget 对象的指针,并在程序的适当位置创建和初始化该对象。

以下是一个示例代码,演示了如何定义和使用静态全局常量 QStackedWidget

// 在某个头文件中声明静态全局常量
// header.h
#ifndef HEADER_H
#define HEADER_H

#include <QStackedWidget>

class Globals {
   
public:
    static QStackedWidget* stackedWidget;
};

#endif // HEADER_H
// 在某个源文件中定义静态全局常量
// source.cpp
#include "header.h"

QStackedWidget* Globals::stackedWidget = nullptr;

在上述示例中,我们在头文件 header.h 中声明了一个名为 Globals 的类,并在其中定义了一个静态指针变量 stackedWidget,其类型为 QStackedWidget*

然后,在源文件 source.cpp 中,我们通过使用 Globals::stackedWidget 来定义和初始化静态全局常量,将其初始值设置为 nullptr

在程序的适当位置(例如 main() 函数或其他初始化代码中),您可以创建一个 QStackedWidget 对象,并将其地址分配给 Globals::stackedWidget,以便在整个程序中共享该对象。

以下是一个简单的示例,演示了如何使用静态全局常量 QStackedWidget

#include <QApplication>
#include <QStackedWidget>
#include "header.h"

int main(int argc, char *argv[]) {
   
    QApplication app(argc, argv);

    // 创建 QStackedWidget 对象
    QStackedWidget stackedWidget;
    stackedWidget.addWidget(new QWidget());  // 添加界面部件

    // 将 QStackedWidget 对象分配给静态全局常量
    Globals::stackedWidget = &stackedWidget;

    // 显示主界面
    stackedWidget.show();

    return app.exec();
}

在上述示例中,我们在 main() 函数中创建了一个 QStackedWidget 对象,并将其地址分配给 Globals::stackedWidget 静态全局常量。然后,我们显示了 stackedWidget,并运行了应用程序的事件循环。

现在,在整个程序的其他地方,您可以通过访问 Globals::stackedWidget 来使用和操作 QStackedWidget 对象。

请注意,静态全局常量的使用需要小心处理,并确保在适当的时间创建和初始化相关对象,以及正确管理对象的生命周期。

查找子窗口并关闭

以 overlayWidget 为例

有两种查找方式:

  • FindDirectChildrenOnly ,只查找直系子节点

    QWidgetList childWidgets = overlayWidget->findChildren<QWidget *>(QString(), Qt::FindDirectChildrenOnly);
        for (QWidget *childWidget : childWidgets) {
            childWidget->close();
        }
    
  • FindChildrenRecursively ,递归地查找子节点

    QWidgetList childWidgets = overlayWidget->findChildren<QWidget *>(QString(), Qt::FindChildrenRecursively);
        for (QWidget *childWidget : childWidgets) {
            childWidget->close();
        }
    

如果使用 FindChildrenRecursively 方式,可以写成:

QWidgetList childWidgets = overlayWidget->findChildren<QWidget *>();
    for (QWidget *childWidget : childWidgets) {
        childWidget->close();
    }

默认方式为 FindChildrenRecursively

QDialog 的show和exec的区别

在 Qt 中,QDialog 是一个用于显示对话框的类。QDialog 类提供了两种方法来显示对话框:show()exec()。这两种方法有以下区别:

  1. show() 方法:

    • show() 方法是非模态的,即它不会阻塞调用它的线程。调用 show() 后,对话框会立即显示,并且用户可以与其他窗口进行交互。
    • show() 方法返回后,程序将继续执行下面的代码,而不会等待对话框关闭。
    • 对话框的生命周期不受 show() 方法的影响。即使对话框被关闭,它的实例仍然存在,可以重新显示或销毁。
  2. exec() 方法:

    • exec() 方法是模态的,它会阻塞调用它的线程,直到对话框被关闭。
    • 调用 exec() 后,对话框会显示,并且用户只能与对话框进行交互。在对话框被关闭之前,程序不会继续执行下面的代码。
    • exec() 方法返回一个整数值,表示对话框的退出码。如果对话框被关闭,则返回 QDialog::Accepted(接受),否则返回 QDialog::Rejected(拒绝)。

通常情况下,如果您希望对话框以非模态的方式显示,并且希望在对话框显示期间能够与其他部分进行交互,您可以使用 show() 方法。这对于较简单的对话框或在需要对话框的同时执行其他操作的情况很有用。

而如果您需要在对话框关闭之后,继续执行下面的代码,并且需要获取对话框的退出状态,您可以使用 exec() 方法。这对于需要等待用户完成对话框操作后再继续的情况很有用,例如获取对话框中用户的选择或输入。

需要注意的是,对话框可以通过点击关闭按钮、调用 accept()reject() 方法来关闭。在 show() 方法下,对话框关闭后,您可以通过 isVisible() 来检查对话框的可见性。而在 exec() 方法下,可以通过返回的退出码来判断对话框的关闭状态。

Qt isNumber 与 isDigit 区别

在 Qt 中,QString 类提供了两个用于字符判断的函数:isNumber()isDigit()。这两个函数的区别如下:

  1. isNumber() 函数:

    • isNumber() 函数用于判断字符串是否表示一个有效的数字。它会检查字符串中的字符是否组成一个数字,包括正负号、小数点以及科学计数法表示的数字。
    • 如果字符串可以解析为一个有效的数字,isNumber() 函数返回 true,否则返回 false
  2. isDigit() 函数:

    • isDigit() 函数用于判断字符串是否只包含数字字符。它会检查字符串中的每个字符是否是十进制数字(0-9)。
    • 如果字符串中的所有字符都是数字字符,则 isDigit() 函数返回 true,否则返回 false

以下是一个示例代码,演示了 isNumber()isDigit() 函数的用法:

#include <QDebug>
#include <QString>

int main() {
   
    QString str1 = "12345";
    QString str2 = "3.14";
    QString str3 = "-42";
    QString str4 = "abc123";

    qDebug() << "isNumber()";
    qDebug() << str1 << "is a number:" << str1.isNumber();
    qDebug() << str2 << "is a number:" << str2.isNumber();
    qDebug() << str3 << "is a number:" << str3.isNumber();
    qDebug() << str4 << "is a number:" << str4.isNumber();

    qDebug() << "isDigit()";
    qDebug() << str1 << "contains only digits:" << str1.isDigit();
    qDebug() << str2 << "contains only digits:" << str2.isDigit();
    qDebug() << str3 << "contains only digits:" << str3.isDigit();
    qDebug() << str4 << "contains only digits:" << str4.isDigit();

    return 0;
}

运行上述代码,将会输出类似以下内容:

isNumber()
"12345" is a number: true
"3.14" is a number: true
"-42" is a number: true
"abc123" is a number: false
isDigit()
"12345" contains only digits: true
"3.14" contains only digits: false
"-42" contains only digits: false
"abc123" contains only digits: false

从输出结果可以看出,isNumber() 函数对于字符串 “12345”、“3.14” 和 “-42” 都返回了 true,因为它们都可以解析为有效的数字。而对于字符串 “abc123”,isNumber() 函数返回了 false,因为它不能解析为有效的数字。

isDigit() 函数对于字符串 “12345” 返回了 true,因为它只包含数字字符。对于字符串 “3.14”、“-42” 和 “abc123”,isDigit() 函数都返回了 false,因为它们中包含了除数字字符外的其他字符。

QChar 类中提供用于判断字符类型的函数

在 Qt 的 QChar 类中,提供了一系列函数用于判断字符的类型。下面是这些函数的详细解释:

  1. isPrint()

    • 用于判断字符是否可打印(即可显示)。这包括空格、数字、字母、标点符号、符号字符等。
    • 如果字符是可打印字符,则返回 true,否则返回 false
  2. isSpace()

    • 用于判断字符是否为空白字符,如空格、制表符、换行符等。
    • 如果字符是空白字符,则返回 true,否则返回 false
  3. isMark()

    • 用于判断字符是否为标记字符。标记字符通常与其他字符组合以形成复合字符。
    • 如果字符是标记字符,则返回 true,否则返回 false
  4. isPunct()

    • 用于判断字符是否为标点符号字符。标点符号通常用于标点、分隔和强调等目的。
    • 如果字符是标点符号字符,则返回 true,否则返回 false
  5. isSymbol()

    • 用于判断字符是否为符号字符。符号字符通常表示特殊符号、货币符号、数学符号等。
    • 如果字符是符号字符,则返回 true,否则返回 false
  6. isLetter()

    • 用于判断字符是否为字母字符。
    • 如果字符是字母字符,则返回 true,否则返回 false
  7. isNumber()

    • 用于判断字符是否为数字字符。
    • 如果字符是数字字符,则返回 true,否则返回 false
  8. isLetterOrNumber()

    • 用于判断字符是否为字母或数字字符。
  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丢了尾巴的猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值