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()
。这两种方法有以下区别:
-
show()
方法:show()
方法是非模态的,即它不会阻塞调用它的线程。调用show()
后,对话框会立即显示,并且用户可以与其他窗口进行交互。show()
方法返回后,程序将继续执行下面的代码,而不会等待对话框关闭。- 对话框的生命周期不受
show()
方法的影响。即使对话框被关闭,它的实例仍然存在,可以重新显示或销毁。
-
exec()
方法:exec()
方法是模态的,它会阻塞调用它的线程,直到对话框被关闭。- 调用
exec()
后,对话框会显示,并且用户只能与对话框进行交互。在对话框被关闭之前,程序不会继续执行下面的代码。 exec()
方法返回一个整数值,表示对话框的退出码。如果对话框被关闭,则返回QDialog::Accepted
(接受),否则返回QDialog::Rejected
(拒绝)。
通常情况下,如果您希望对话框以非模态的方式显示,并且希望在对话框显示期间能够与其他部分进行交互,您可以使用 show()
方法。这对于较简单的对话框或在需要对话框的同时执行其他操作的情况很有用。
而如果您需要在对话框关闭之后,继续执行下面的代码,并且需要获取对话框的退出状态,您可以使用 exec()
方法。这对于需要等待用户完成对话框操作后再继续的情况很有用,例如获取对话框中用户的选择或输入。
需要注意的是,对话框可以通过点击关闭按钮、调用 accept()
或 reject()
方法来关闭。在 show()
方法下,对话框关闭后,您可以通过 isVisible()
来检查对话框的可见性。而在 exec()
方法下,可以通过返回的退出码来判断对话框的关闭状态。
Qt isNumber 与 isDigit 区别
在 Qt 中,QString
类提供了两个用于字符判断的函数:isNumber()
和 isDigit()
。这两个函数的区别如下:
-
isNumber()
函数:isNumber()
函数用于判断字符串是否表示一个有效的数字。它会检查字符串中的字符是否组成一个数字,包括正负号、小数点以及科学计数法表示的数字。- 如果字符串可以解析为一个有效的数字,
isNumber()
函数返回true
,否则返回false
。
-
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
类中,提供了一系列函数用于判断字符的类型。下面是这些函数的详细解释:
-
isPrint()
:- 用于判断字符是否可打印(即可显示)。这包括空格、数字、字母、标点符号、符号字符等。
- 如果字符是可打印字符,则返回
true
,否则返回false
。
-
isSpace()
:- 用于判断字符是否为空白字符,如空格、制表符、换行符等。
- 如果字符是空白字符,则返回
true
,否则返回false
。
-
isMark()
:- 用于判断字符是否为标记字符。标记字符通常与其他字符组合以形成复合字符。
- 如果字符是标记字符,则返回
true
,否则返回false
。
-
isPunct()
:- 用于判断字符是否为标点符号字符。标点符号通常用于标点、分隔和强调等目的。
- 如果字符是标点符号字符,则返回
true
,否则返回false
。
-
isSymbol()
:- 用于判断字符是否为符号字符。符号字符通常表示特殊符号、货币符号、数学符号等。
- 如果字符是符号字符,则返回
true
,否则返回false
。
-
isLetter()
:- 用于判断字符是否为字母字符。
- 如果字符是字母字符,则返回
true
,否则返回false
。
-
isNumber()
:- 用于判断字符是否为数字字符。
- 如果字符是数字字符,则返回
true
,否则返回false
。
-
isLetterOrNumber()
:- 用于判断字符是否为字母或数字字符。