(1)生成如下窗体,其对应的 ui_widget . h 头文件如下,以此学习列表窗体的代码使用 :
++
#ifndef UI_WIDGET_H
#define UI_WIDGET_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QListWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_Widget
{
public:
QVBoxLayout * verticalLayout;
QPushButton * pushButton;
QListWidget * listWidget;
void setupUi(QWidget * Widget)
{
if (Widget->objectName().isEmpty())
Widget->setObjectName(QString::fromUtf8("Widget"));
Widget->resize(96, 108);
QFont font;
font.setPointSize(14);
Widget->setFont(font); //这一段是设置主窗体的,并给予了垂直布局。
Widget->setContextMenuPolicy(Qt::CustomContextMenu);
verticalLayout = new QVBoxLayout(Widget);
verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
pushButton = new QPushButton(Widget); //把按钮加入到窗体布局中
pushButton->setObjectName(QString::fromUtf8("pushButton"));
verticalLayout->addWidget(pushButton);
listWidget = new QListWidget(Widget); //生成带了元素的列表窗体,并加入垂直布局。
new QListWidgetItem(listWidget); //没有指针变量接收这三个堆区条目,
new QListWidgetItem(listWidget); //但顺带被加入了列表窗体容器。
new QListWidgetItem(listWidget);
listWidget->setObjectName(QString::fromUtf8("listWidget"));
verticalLayout->addWidget(listWidget);
retranslateUi(Widget);
QMetaObject::connectSlotsByName(Widget); //允许信号与槽的名称连接。
} // setupUi
void retranslateUi(QWidget *Widget)
{
Widget ->setWindowTitle(QCoreApplication::translate("Widget", "H", nullptr));
pushButton->setText (QCoreApplication::translate("Widget",
"pushButton", nullptr));
const bool __sortingEnabled = listWidget->isSortingEnabled();
listWidget->setSortingEnabled(false); //先取消列表窗体里对元素的布局要求,以便修改元素数据。
QListWidgetItem * ___qlistwidgetitem = listWidget->item(0); //避免变量重名。
___qlistwidgetitem->setText(QCoreApplication::translate("Widget", "a", nullptr));
QListWidgetItem * ___qlistwidgetitem1 = listWidget->item(1);
___qlistwidgetitem1->setText(QCoreApplication::translate("Widget", "b", nullptr));
QListWidgetItem * ___qlistwidgetitem2 = listWidget->item(2);
___qlistwidgetitem2->setText(QCoreApplication::translate("Widget", "c", nullptr));
listWidget->setSortingEnabled(__sortingEnabled); //恢复程序员对表格窗体设置的排序要求。
} // retranslateUi
};
namespace Ui {
class Widget: public Ui_Widget {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_WIDGET_H
(2)接着学习 列表窗体的元素类型 QListWidgetItem 。因为前面已经学习过表格窗体 QTableWidget 的元素类型 QTableWidgetItem。这些类型都大同小异。这里就不详细注释了。以下的举例都用上面的例子框架,本类型也是可以被数据流类型接收的 :
(3) 接着学习本元素类 QListWidgetItem 的成员函数 :
(4)给出本 QListWidgetItem 类的源代码 , 定义于头文件 qlistwidget . h :
/*
The QListWidgetItem class provides an item for use with the QListWidget item view class.
Detailed Description :
QListWidgetltem 代表 QListWidget中的单个项目。每个项目可以包含几条信息,并会适当地显示它们。
项目视图便捷类采用经典的基于项目的接口,而非纯粹的模式/视图方法。
为了获得更灵活的列表视图小部件,可以考虑使用带有标准模型的 QListView 类。
列表项可以在构建时自动插入到列表中,通过指定列表小部件:
new QListWidgetItem(tr("Hazel"), listWidget);
或者,列表项也可以在没有父小部件的情况下创建,并通过QListWidget::insertitem()方法插入到列表中。
列表项通常用于显示text()和icon()。这些是通过setText()和setlcon()函数设置的。
可以使用 setFont()、setForeground()和setBackground()自定义文本的外观。
可以使用 setTextAlignment()函数对齐列表项中的文本。
可以使用setToolTip()、setstatusTip()和setWhatsThis()将
工具提示、状态提示和What's This?帮助添加到列表项中。
默认情况下,项目是启用的、可选的、可检查的,并且可以作为拖放操作的来源。
By default, items are enabled, selectable, checkable,
and can be the source of drag and drop operations.
每个项目的标志可以通过调用setFlags ()函数并传入相应的值来更改(参见Qt:ltemFlags)。
可检查项目可以通过setcheckstate ()函数进行全选、全不选和部分选中。
相应的checkState() 函数则指示项目的当前选中状态。
isHidden()函数可用于确定项目是否被隐藏。要隐藏一个项目,请使用setHidden()。
Subclassing :
在通过子类化QListWidgetitem来提供自定义项时,可以为其定义新的类型,以便与标准项区分开来。
对于需要此功能的子类,请确保在构造函数中调用基类构造函数,传入一个等于或大于UserType的新类型值。
*/
class Q_WIDGETS_EXPORT QListWidgetItem
{
friend class QListModel ;
friend class QListWidget;
private:
QListModel * listModel() const; //因为不存在视图对应的模型了
int rtti; //存储本条目的类型,可以是自定义类型,来自于构造函数中的 type。
QListWidgetItemPrivate * d ; //数据成员在这里。但其是保密定义,没有源码。
QListWidget * view; //记录本条目所属的列表窗体对象。
Qt::ItemFlags itemFlags; //记录本条目具有的操作属性。这是个对象型数据成员。
public:
enum ItemType {
Type = 0,//The default type for list widget items.
UserType = 1000 //The minimum value for custom types.
// Values below UserType are reserved by Qt.
};
//Constructs an empty list widget item of the specified type with the given parent.
//使用给定的父项构造指定类型的空列表小部件项。
//如果未指定parent,则需要使用 QListWidget::insertItem()将该项目插入到列表小部件中。
//此构造函数将项插入到传递给构造函数的父级的模型中。
//如果模型已排序,则插入的行为是不确定的,因为模型将在此时尚未构造的项上调用"<"运算符方法。
//为避免未确定的行为,我们建议不要指定父级,而是使用 QListWidget::insertltem().
explicit QListWidgetItem(QListWidget * listview = nullptr, int type = Type);
//总之,不要为已排序的列表添加条目,应取消排序后,再添加条目。
explicit QListWidgetItem(const QString & text,
QListWidget * listview = nullptr, int type = Type);
explicit QListWidgetItem(const QIcon & icon,
const QString & text,
QListWidget * listview = nullptr, int type = Type);
QListWidgetItem(const QListWidgetItem & other); // copy构造函数
QListWidgetItem & operator=(const QListWidgetItem & other); // copy赋值运算符函数
virtual ~QListWidgetItem(); //析构函数
virtual bool operator<(const QListWidgetItem & other) const; //比较运算符
virtual QListWidgetItem * clone() const; //Creates an exact copy of the item.
inline QListWidget * listWidget() const { return view; }
//Returns the list widget containing the item.
bool isSelected() const;
void setSelected(bool select);
inline bool isHidden() const
{
return
(
view
? view->isRowHidden(view->row(this))
: false
);
}
inline void setHidden(bool hide)
{
if (view)
view->setRowHidden(view->row(this), hide);
}
inline Qt::ItemFlags flags() const { return itemFlags; }
void setFlags(Qt::ItemFlags flags);
inline int type() const { return rtti; }
virtual void read(QDataStream & in ) ; //与数据流之间的读写
virtual void write(QDataStream & out) const;
virtual QVariant data(int role) const;
virtual void setData(int role, const QVariant & value);
//******************************************************************************
//******************以下是读写本条目中存储的数据,按角色加以区分************************
//******************************************************************************
inline QString text() const
{ return data(Qt::DisplayRole).toString(); }
inline void setText(const QString & text)
{ setData(Qt::DisplayRole, text); }
inline QIcon icon() const
{ return qvariant_cast<QIcon>(data(Qt::DecorationRole)); }
inline void setIcon(const QIcon & icon)
{ setData(Qt::DecorationRole, icon); }
inline QString statusTip() const
{ return data(Qt::StatusTipRole).toString(); }
inline void setStatusTip(const QString & statusTip)
{ setData(Qt::StatusTipRole, statusTip); }
inline QString toolTip() const
{ return data(Qt::ToolTipRole).toString(); }
inline void setToolTip(const QString & toolTip)
{ setData(Qt::ToolTipRole, toolTip); }
inline QString whatsThis() const
{ return data(Qt::WhatsThisRole).toString(); }
inline void setWhatsThis(const QString & whatsThis)
{ setData(Qt::WhatsThisRole, whatsThis); }
inline QFont font() const
{ return qvariant_cast<QFont>(data(Qt::FontRole)); }
inline void setFont(const QFont & font)
{ setData(Qt::FontRole, font); }
inline int textAlignment() const
{ return data(Qt::TextAlignmentRole).toInt(); }
inline void setTextAlignment(int alignment)
{ setData(Qt::TextAlignmentRole, alignment); }
inline QBrush background() const
{ return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); }
inline void setBackground(const QBrush & brush)
{ setData(Qt::BackgroundRole,
brush.style() != Qt::NoBrush
? QVariant(brush)
: QVariant());
}
inline QBrush foreground() const
{ return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); }
inline void setForeground(const QBrush & brush)
{ setData(Qt::ForegroundRole,
brush.style() != Qt::NoBrush
? QVariant(brush)
: QVariant());
}
inline Qt::CheckState checkState() const
{ return static_cast<Qt::CheckState>(data(Qt::CheckStateRole).toInt()); }
inline void setCheckState(Qt::CheckState state)
{ setData(Qt::CheckStateRole, static_cast<int>(state)); }
inline QSize sizeHint() const
{ return qvariant_cast<QSize>(data(Qt::SizeHintRole)); }
inline void setSizeHint(const QSize & size)
{
setData(Qt::SizeHintRole,
size.isValid()
? QVariant(size)
: QVariant());
}
}; //完结 class QListWidgetItem
Q_WIDGETS_EXPORT
QDataStream & operator<<(QDataStream & out, const QListWidgetItem & item);
Q_WIDGETS_EXPORT
QDataStream & operator>>(QDataStream & in, QListWidgetItem & item);
(5)
谢谢