目录
一:常用类
01 QApplication:管理应用程序的控制流和主要设置。
02 QWidget:所有用户界面的基础类,提供窗口和控件的基本功能。
03 QMainWindow:提供主窗口的框架,包括菜单、工具栏和状态栏。
04 QPushButton:表示一个可点击的按钮。
05 QLabel:用于显示文本或图像的标签控件。
06 QLineEdit:单行文本输入框。
07 QTextEdit:多行文本输入框,支持富文本格式。
08 QComboBox:下拉列表框,允许用户选择选项。
09 QListView / QTableView:用于显示列表或表格数据的视图。
10 QTimer:用于定时执行任务。
11 QFile:处理文件读写操作。
12 QNetworkAccessManager:用于处理网络请求。
13 QListWidgetItem 是 Qt 中用于表示列表项的类
14 QIcon 是 Qt 中用于表示图标的类
15 QTableWidget 用于创建和管理表格数据。
16 QTabWidget 用于创建带有选项卡的界面,允许用户在不同的页面之间切换。
17 QPropertyAnimation 是 Qt 中用于动画化属性的类
geometry : 表示窗口部件的位置和大小
opacity : 表示控件的透明度。
18 QScopedPointer 是 Qt 框架中用于管理动态分配对象的智能指针类。它的主要功能是确保在超出作用域时自动释放其所持有的指针,从而避免内存泄漏。
19 QList 是 Qt 框架中提供的一个模板类,专门用于存储和管理动态数组的数据类型。它是一个容器类,可以存储任意类型的对象,包括基本数据类型和自定义对象。
20 QTimer 是 Qt 中的一个类,用于定时执行某个操作。
21 QTextCodec 是 Qt 框架中的一个类,主要用于处理文本编码
23 QScrollArea 是 Qt 框架中的一个类,用于提供一个可滚动的区域,允许用户查看超过视图窗口的内容。
24 QTextStream 用于处理文本流的输入和输出,它提供了一种方便的方式来读取和写入文本数据,支持多种编码格式。
25 QStringList是 Qt 框架中的一个类,用于存储和操作字符串的列表。它是 QString 的一个列表(或数组),提供了一些便利的功能来处理多个字符串。
二:容器类
1.QList
2. QVector
3. QMap
4. QHash
5. QSet
6. QLinkedList
7.QVariant
三:TCP网络类
1 QTcpSocket:用于客户端与服务器之间的 TCP 通信,提供发送和接收数据的功能。
2 QTcpServer:用于创建 TCP 服务器,监听和接受客户端连接。
3 QAbstractSocket:QTcpSocket 和 QUdpSocket 的基类,提供网络套接字的基本功能和信号。
4 QHostAddress:表示主机地址(IPv4 和 IPv6)。
5 QNetworkInterface:提供网络接口的信息,例如 IP 地址和状态。
QT项目记录:
QStackedWidget
setCurrentIndex(int index)
一:常用类
01 QApplication:管理应用程序的控制流和主要设置。
02 QWidget:所有用户界面的基础类,提供窗口和控件的基本功能。
03 QMainWindow:提供主窗口的框架,包括菜单、工具栏和状态栏。
04 QPushButton:表示一个可点击的按钮。
05 QLabel:用于显示文本或图像的标签控件。
构造函数:
QLabel(QWidget *parent = nullptr)
: 创建一个 QLabel,parent
是其父控件。设置文本:
void setText(const QString &text)
: 设置标签显示的文本。QString text() const
: 获取当前显示的文本。设置图片:
void setPixmap(const QPixmap &pixmap)
: 设置标签显示的图像。QPixmap pixmap() const
: 获取当前显示的图像。设置缩放:
void setScaledContents(bool scaled)
: 设置是否缩放内容以适应标签大小。文本格式:
void setAlignment(Qt::Alignment alignment)
: 设置文本对齐方式(如左对齐、居中、右对齐)。void setWordWrap(bool enable)
: 设置是否允许文本换行。样式:
void setStyleSheet(const QString &styleSheet)
: 设置控件的样式表,用于自定义外观。获取尺寸:
QSize sizeHint() const
: 获取建议的大小,通常用于布局管理
pLabel->setScaledContents(true);
的意思是将QLabel
设置为缩放内容以适应标签的大小
setPixmap
方法:这个方法用于设置QLabel
显示的图像内容。它接受一个QPixmap
类型的参数。举例:
QString strPath = QString(":/images/LunBo/mrfz%1.jpg").arg(i + 1); // 生成图像路径
pLabel->setPixmap(QPixmap(strPath)); // 将图像加载到 QLabel 中
06 QLineEdit:单行文本输入框。
07 QTextEdit:多行文本输入框,支持富文本格式。
08 QComboBox:下拉列表框,允许用户选择选项。
09 QListView / QTableView:用于显示列表或表格数据的视图。
10 QTimer:用于定时执行任务。
11 QFile:处理文件读写操作。
12 QNetworkAccessManager:用于处理网络请求。
13 QListWidgetItem 是 Qt 中用于表示列表项的类
构造函数
QListWidgetItem()
: 创建一个空的列表项。QListWidgetItem(const QString &text)
: 创建一个带文本的列表项。QListWidgetItem(const QIcon &icon, const QString &text)
: 创建一个带图标和文本的列表项。设置文本和图标
void setText(const QString &text)
: 设置列表项的文本。QString text() const
: 获取列表项的文本。void setIcon(const QIcon &icon)
: 设置列表项的图标。QIcon icon() const
: 获取列表项的图标。状态和选中
void setSelected(bool selected)
: 设置列表项是否被选中。bool isSelected() const
: 检查列表项是否被选中。void setFlags(Qt::ItemFlags flags)
: 设置项的标志(例如,是否可选)。背景和前景
void setBackground(const QBrush &brush)
: 设置项的背景颜色。QBrush background() const
: 获取项的背景颜色。void setForeground(const QBrush &brush)
: 设置项的前景颜色。QBrush foreground() const
: 获取项的前景颜色。其他
void setData(int role, const QVariant &value)
: 设置项的自定义数据。QVariant data(int role) const
: 获取项的自定义数据。void setSizeHint(const QSize &size)
: 设置项的推荐大小。QSize sizeHint() const
: 获取项的推荐大小。
14 QIcon 是 Qt 中用于表示图标的类
构造函数
QIcon()
: 创建一个空的图标。QIcon(const QString &fileName)
: 从文件路径创建图标。QIcon(const QPixmap &pixmap)
: 从像素图创建图标。加载图标
bool loadFromData(const uchar *data, int size)
: 从字节数组加载图标。获取图标
QPixmap pixmap(const QSize &size, QIcon::Mode mode = QIcon::Normal, QIcon::State state = QIcon::Off) const
: 获取指定大小和状态的图标。QPixmap pixmap(int width, int height) const
: 获取指定宽高的图标。状态和模式
QIcon::Mode
: 定义图标的显示模式(如Normal
,Active
,Disabled
)。QIcon::State
: 定义图标的状态(如Off
,On
)。图标组合
QIcon operator+(const QIcon &icon)
: 将两个图标合并。
15 QTableWidget 用于创建和管理表格数据。
创建和初始化
QTableWidget(rows, columns)
: 初始化表格,设置行和列的数量。行列操作
setRowCount(count)
: 设置行数。setColumnCount(count)
: 设置列数。insertRow(position)
: 在指定位置插入行。removeRow(position)
: 删除指定位置的行。insertColumn(position)
: 在指定位置插入列。removeColumn(position)
: 删除指定位置的列。单元格操作
setItem(row, column, QTableWidgetItem)
: 设置特定单元格的内容。item(row, column)
: 获取特定单元格的QTableWidgetItem
。setCellWidget(row, column, widget)
: 在特定单元格中放置一个小部件。数据操作
setHorizontalHeaderLabels(labels)
: 设置列的标题。setVerticalHeaderLabels(labels)
: 设置行的标题。clear()
: 清空表格数据。setSortingEnabled(enabled)
: 启用或禁用排序功能。选择和排序
setSelectionMode(mode)
: 设置选择模式(如单选或多选)。sortItems(column, order)
: 对指定列进行排序。信号
itemChanged
: 当单元格内容改变时发出信号。cellChanged
: 当单元格内容改变时发出信号。
16 QTabWidget
用于创建带有选项卡的界面,允许用户在不同的页面之间切换。
基本操作
addTab(widget, label)
: 添加一个选项卡,并指定显示的小部件和标签。insertTab(index, widget, label)
: 在指定位置插入一个选项卡。removeTab(index)
: 移除指定位置的选项卡。setTabText(index, label)
: 设置指定选项卡的文本标签。tabText(index)
: 获取指定选项卡的文本标签。选项卡管理
setCurrentIndex(index)
: 设置当前显示的选项卡。currentIndex()
: 获取当前选中的选项卡的索引。currentWidget()
: 获取当前显示的小部件。选项卡样式
setTabShape(shape)
: 设置选项卡的形状(如矩形或圆角)。setTabPosition(position)
: 设置选项卡的位置(如顶部、底部、左侧、右侧)。setTabsClosable(closable)
: 设置选项卡是否可关闭。setTabIcon(index, icon)
: 设置指定选项卡的图标。信号
tabChanged(int index)
: 当当前选项卡改变时发出信号。tabCloseRequested(int index)
: 当请求关闭选项卡时发出信号。
17 QPropertyAnimation
是 Qt 中用于动画化属性的类
构造函数
QPropertyAnimation(QObject *target, const QByteArray &propertyName)
: 创建一个动画,指定目标对象和要动画化的属性名称。- 窗口属性:
geometry :
表示窗口部件的位置和大小
opacity :
表示控件的透明度。设置持续时间
void setDuration(int duration)
: 设置动画的持续时间(以毫秒为单位)。设置起始值和结束值
void setStartValue(const QVariant &value)
: 设置动画的起始值。void setEndValue(const QVariant &value)
: 设置动画的结束值。设置当前值
void setCurrentTime(int msec)
: 设置动画当前的时间(用于手动控制)。设置缓动曲线
void setEasingCurve(const QEasingCurve &curve)
: 设置动画的缓动曲线(如线性、缓入、缓出等)。启动动画
void start()
: 启动动画。暂停和恢复
void pause()
: 暂停动画。void resume()
: 恢复暂停的动画。动画状态
QAbstractAnimation::State state() const
: 获取当前动画的状态(如正在运行、暂停等)。连接信号
void finished()
: 当动画结束时发出信号,可以连接自定义槽函数。
QPropertyAnimation *animation = new QPropertyAnimation(&myWidget, "pos");
animation->setDuration(1000);
animation->setStartValue(QPoint(0, 0));
animation->setEndValue(QPoint(100, 100));
animation->setEasingCurve(QEasingCurve::OutBounce);
animation->start();
18 QScopedPointer
是 Qt 框架中用于管理动态分配对象的智能指针类。它的主要功能是确保在超出作用域时自动释放其所持有的指针,从而避免内存泄漏。
QScopedPointer<MyClass> ptr(new MyClass());
它会自动管理MyClass
类型的对象。由于是模板类,QScopedPointer
可以与各种类型一起使用,提供灵活的内存管理解决方案。是一种局部的、自动释放的智能指针,通常用于在作用域结束时自动删除指针所指向的对象。
19 QList
是 Qt 框架中提供的一个模板类,专门用于存储和管理动态数组的数据类型。它是一个容器类,可以存储任意类型的对象,包括基本数据类型和自定义对象。
20 QTimer
是 Qt 中的一个类,用于定时执行某个操作。
构造函数:
QTimer(QObject *parent = nullptr)
:创建一个定时器,指定其父对象。启动定时器:
void start(int msec)
:启动定时器,并设置超时时间(毫秒)。void start()
:启动定时器,使用之前设置的超时时间。停止定时器:
void stop()
:停止定时器。检查状态:
bool isActive() const
:返回定时器是否处于活动状态(即是否正在计时)。设置和获取超时时间:
void setInterval(int msec)
:设置定时器的超时时间(毫秒)。int interval() const
:返回当前设置的超时时间(毫秒)。信号:
void timeout()
:当定时器超时时发出此信号。
21 QTextCodec
是 Qt 框架中的一个类,主要用于处理文本编码
它可以帮助你在不同的字符编码之间转换文本,比如从 UTF-8 转换为 GBK 或 ISO-8859-1 等。
QTextCodec *codec = QTextCodec::codecForName("UTF-8");//或者"GBK",不分大小写
- 这行代码通过
codecForName
函数获取名为 "UTF-8" 的编码器。codecForName
函数可以接受编码名称(不区分大小写),返回对应的QTextCodec
对象。如果指定的编码不存在,则返回nullptr
。QTextCodec::setCodecForLocale(codec);
- 这行代码将获取的
codec
设置为当前区域的编码。这意味着在本地化应用程序时,所有通过QString
和QByteArray
进行的文本操作将使用这个编码。- 这对于确保程序在不同语言和区域下正确显示和处理文本非常重
23 QScrollArea
是 Qt 框架中的一个类,用于提供一个可滚动的区域,允许用户查看超过视图窗口的内容。
构造函数
QScrollArea(QWidget *parent = nullptr)
: 创建一个滚动区域。内容设置
void setWidget(QWidget *widget)
: 设置要在滚动区域中显示的控件。QWidget* widget() const
: 获取当前设置的控件。内容尺寸
void setWidgetResizable(bool resizable)
: 设置是否在调整滚动区域大小时自动调整内容控件的大小。滚动条控制
void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy policy)
: 设置水平滚动条的显示策略。void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy policy)
: 设置垂直滚动条的显示策略。QScrollBar* horizontalScrollBar() const
: 获取水平滚动条。QScrollBar* verticalScrollBar() const
: 获取垂直滚动条。滚动位置
void ensureVisible(int x, int y, int xMargin = 0, int yMargin = 0)
: 确保指定的点在可视区域内。void verticalScrollBar()->setValue(int value)
: 设置垂直滚动条的位置。尺寸管理
void setMinimumSize(const QSize &size)
: 设置最小尺寸。void setMaximumSize(const QSize &size)
: 设置最大尺寸。
24 QTextStream 用于处理文本流的输入和输出,它提供了一种方便的方式来读取和写入文本数据,支持多种编码格式。
构造函数:
QTextStream(QIODevice *device)
: 使用指定的QIODevice
(如QFile
)初始化一个QTextStream
对象。读取数据:
QString readLine()
: 读取一行文本。QString readAll()
: 读取整个文本流。QString read(int maxLength)
: 读取最多maxLength
个字符。写入数据:
void operator<<(const QString &str)
: 将字符串写入流。void operator<<(int i)
: 将整数写入流。void operator<<(double d)
: 将浮点数写入流。设置和获取格式:
void setCodec(const QString &codec)
: 设置字符编码,例如"UTF-8"
。QString codec() const
: 获取当前使用的编码。流状态:
bool status() const
: 获取流的状态。void reset()
: 重置流状态。控制流:
void setFormat(QTextStream::FieldFormat format)
: 设置字段格式。void setPadChar(QChar padChar)
: 设置填充字符。QTextStream in(&file); while(in.atEnd() == false) //atEnd()用于检查是否到达文件末尾。
25 QStringList是 Qt 框架中的一个类,用于存储和操作字符串的列表。它是 QString
的一个列表(或数组),提供了一些便利的功能来处理多个字符串。
构造和初始化:
QStringList()
: 默认构造函数,创建一个空的字符串列表。QStringList(const QStringList &list)
: 拷贝构造函数。添加和移除元素:
void append(const QString &str)
: 在列表末尾添加一个字符串。void removeAt(int index)
: 移除指定索引的元素。void clear()
: 清空列表。访问元素:
QString at(int index) const
: 获取指定索引的字符串。QString first() const
: 获取第一个元素。QString last() const
: 获取最后一个元素。查找和处理:
int indexOf(const QString &str) const
: 查找字符串的位置。QStringList split(const QString &separator) const
: 根据分隔符分割字符串。举例:
QStringList lineList = path3.split("-"); //path3.split("-") 将字符串 path3 根据 "-" 分隔符分割成多个子字符串, //并返回一个 QStringList。lineList 中将包含所有以 "-" 分割出的部分。
二:容器类
1.QList
- 描述:动态数组,支持存储任意类型的对象。
- 常用接口:
append(const T &value)
:添加元素。insert(int index, const T &value)
:在指定位置插入元素。removeAt(int index)
:删除指定位置的元素。at(int index)
:访问指定位置的元素。size()
:返回元素个数。
2. QVector
- 描述:动态数组,优化了内存分配,通常比
QList
更高效。- 常用接口:
push_back(const T &value)
:在末尾添加元素。insert(int index, const T &value)
:在指定位置插入元素。removeAt(int index)
:删除指定位置的元素。operator[](int index)
:随机访问元素。
3. QMap
- 描述:键值对的有序集合。
- 常用接口:
insert(const Key &key, const T &value)
:插入键值对。remove(const Key &key)
:删除指定键的元素。value(const Key &key)
:获取指定键的值。keys()
:获取所有的键。
4. QHash
- 描述:键值对的无序集合,基于哈希表实现。
- 常用接口:
insert(const Key &key, const T &value)
:插入键值对。remove(const Key &key)
:删除指定键的元素。value(const Key &key)
:获取指定键的值。keys()
:获取所有的键。
5. QSet
- 描述:存储唯一值的集合。
- 常用接口:
insert(const T &value)
:插入元素。remove(const T &value)
:删除元素。contains(const T &value)
:检查集合中是否包含指定元素。size()
:返回集合中元素的个数。
6. QLinkedList
- 描述:双向链表。
- 常用接口:
append(const T &value)
:在末尾添加元素。prepend(const T &value)
:在开头添加元素。remove(const T &value)
:删除指定元素。first()
:获取第一个元素。
7.QVariant
是 Qt 框架中的一个类,主要用于存储不同类型的数据。它可以在运行时容纳多种数据类型,是 Qt 的类型安全的通用数据容器。
QVariant
对象可以存储整数、浮点数、字符串、布尔值、以及自定义类型等。
构造函数:
QVariant()
:默认构造函数。QVariant(const QVariant &other)
:复制构造函数。QVariant(const T &value)
:模板构造函数,可以用于存储不同类型的数据。类型查询:
int type() const
:返回存储数据的类型(例如QVariant::Int
、QVariant::String
)。bool isNull() const
:检查QVariant
是否为空。类型转换:
template<typename T> T value() const
:返回存储的值,转换为指定类型T
。QString toString() const
:将QVariant
转换为QString
。int toInt(bool *ok = nullptr) const
:将QVariant
转换为整数,返回值可以指示转换是否成功。赋值与比较:
QVariant &operator=(const QVariant &other)
:赋值运算符。bool operator==(const QVariant &other) const
:比较两个QVariant
是否相等。bool operator!=(const QVariant &other) const
:比较两个QVariant
是否不相等。设置值:
void setValue(const T &value)
:设置存储的值为指定类型。
三:TCP网络类
1 QTcpSocket:用于客户端与服务器之间的 TCP 通信,提供发送和接收数据的功能。
connectToHost(const QString &host, quint16 port):连接到指定的主机和端口。
write(const QByteArray &data):发送数据到连接的主机。
readAll():读取所有接收到的数据。
disconnectFromHost():断开与主机的连接。
error():获取最近的错误代码。
2 QTcpServer:用于创建 TCP 服务器,监听和接受客户端连接。
listen(const QHostAddress &address, quint16 port):开始监听指定的地址和端口。
nextPendingConnection():返回下一个待处理的客户端连接。
close():关闭服务器,停止监听
3 QAbstractSocket:QTcpSocket 和 QUdpSocket 的基类,提供网络套接字的基本功能和信号。
state():获取当前套接字的状态(如连接、断开等)。
errorString():返回最近的错误信息。
connected():信号,当套接字成功连接时发出
4 QHostAddress:表示主机地址(IPv4 和 IPv6)。
toString():将地址转换为字符串表示。
isNull():检查地址是否为空。
5 QNetworkInterface:提供网络接口的信息,例如 IP 地址和状态。
allAddresses():获取所有可用的 IP 地址。
hardwareAddress():获取网络接口的硬件地址(MAC 地址)。
QT项目记录:
在父类中声明子类界面的对象,并将父对象的this指针,作为参数给到子类对象,就可以将子类对象那个界面显示到父类界面。
但是在声明结构体的时候,一定要把初始化。p(new widgetprivate)
问题_Qss文件怎么使用:
// 加载样式表
QFile file(":/styles/style.qss");
// 假设样式表在资源文件中
file.open(QFile::ReadOnly);
QString styleSheet = file.readAll();
file.close();
// 应用样式表到整个应用
qApp->setStyleSheet(styleSheet);
// 或者应用到特定的窗口
yourMainWindow->setStyleSheet(styleSheet);
问题:QScrollArea是什么,QVBoxLayout是什么
QScrollArea:是可以滚动的区间 //取消掉水平和垂直放方向滚动条。 ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Qt中提升为自定义的类
将
QWidget
提升为自定义类(或称为“提升”)指的是在设计时使用 Qt Designer 或代码中,替换一个现有的QWidget
控件为一个自定义的派生类。这样做的目的通常是为了扩展或定制控件的功能和外观。将基类窗口提升为自定义的窗口,首先一个类只能提升一次,不能连续提升两次,如果要改变提升的窗口,要先将当前的窗口取消提升,然后再提升为其他的窗口,还有就是提升类要继承自提升的基类才能提升。这是对控件的扩展。
Qt中将次要界面设置为主要界面的两种方法:
一种是类的提升,还有一种将new一个自定义界面类的对象,并且将自定义对象的父类指针设置为主界面。
QT中自定义信号signals: void SongMessage(const QString& Song,const QString& singer);自定义的信号为什么还有参数?
自定义信号可以带参数,以便在信号发出时传递额外的信息。你的信号
SongMessage
带有两个参数Song
和singer
,这意味着当这个信号被发出时,它可以传递当前播放的歌曲名称和歌手的信息。这样,接收这个信号的槽函数可以直接使用这些参数,进行相应的处理。信号的参数主要是传递给连接的槽函数。具体来说,当信号被发出时,它会将参数传递给所有连接到该信号的槽函数。如果是lambda表达式,你可以直接使用这些信号发出来的参数[](const QString& song, const QString& singer) {});
QObject::connect(&player, &MusicPlayer::songMessage,
[ ](const QString& song, const QString& singer) { qDebug() << "Now playing:" << song << "by" << singer; // 处理信号 });
自定义信号是怎么发出来的?
是通过执行自定义中的某个函数方法来发出来的void musiclist::on_songlist_2_itemDoubleClicked(QListWidgetItem *item) {QString SongName = static_cast<SongList*>(ui->songlist_2 ->itemWidget(item))->GetSongName();QString SingerName = static_cast<SongList*>(ui->songlist_2 ->itemWidget(item))->GetSongerName();qDebug()<<SongName<<" "<<SingerName;emit SongMessage(SongName,SingerName); }
问题stackwidget控件中如何切换界面?
QStackedWidget
QStackedWidget
是一个容器类,允许在多个页面之间切换。它的每个页面可以是任意的 QWidget(如按钮、文本框等),但一次只能显示一个页面。
setCurrentIndex(int index)
- 功能:这个函数设置当前显示的页面索引。
- 参数:
index
是你希望显示的页面的索引(从 0 开始计数)。- 例子:
setCurrentIndex(0)
会显示第一个页面,setCurrentIndex(1)
会显示第二个页面,以此类推。ui->stackedWidget->setCurrentIndex(0);//表示设置当前界面
QT问题积累:使用信号返回来的参数时,怎样在槽函数中使用这个参数
[signal] void QListWidget::itemClicked(QListWidgetItem *item) 这个信号返回了一个参数item连接这个信号 connect(ui->listWidget_1,&QListWidget::itemClicked,this,&Widget::setTab);我们如果想要使用这个参数的时候,可以直接在槽函数使用,不过槽函数的声明必须要接收这个参数,但是connect中的槽函数只需要引用名字即可。如上所示 槽函数如下:void Widget::setTab(QListWidgetItem *item) {int row=ui->listWidget_2->row(item);ui->stackedWidget->setCurrentIndex(row); }
这里的槽函数需要接收这个signal信号这个返回的参数。
Qt问题积累当listwidget中的item设置的不是文本而是一个widget时,即使将item将item删除了,还是会留下widget?如何将item中设置widget呢。
如何将item中设置widget,答:
使用setItemWidget(item, widget)这个函数来进行设置,
并且还可以通过item->setSizeHint();来使得窗口行适应item行。这样可使得列表更加美观。
自定义 Widget 关联: 当你使用
setItemWidget(item, widget)
将一个 widget 设置为item
的显示控件时,这个 widget 仍然存在于内存中。QListWidget
只管理QListWidgetItem
的生命周期,而不直接管理与之关联的 widget。