1.便捷类
1.1 便捷类包含QListWidget,QTableWidget,QTreeWidget,没有MVC(模型/视图)方式方便灵活
2. QListWidget
//添加项目方式1
new QListWidgetItem("a",&listWidget);
//添加项目方式2
QListWidgetItem* listWidgetItem = new QListWidgetItem;
listWidgetItem->setText("b");
listWidgetItem->setToolTip("this is b!");
listWidget.insertItem(1,listWidgetItem);
//降序排列项目
listWidget.sortItems(Qt::DescendingOrder);
listWidget.show();
3. QTreeWidget
QTreeWidget treeWidget;
//必须设置列数treeWidget.setColumnCount(2);
//添加表头
QStringList headView;
headView << "name" << "age";
treeWidget.setHeaderLabels(headView);
//添加数据项
QTreeWidgetItem *grade1 = new QTreeWidgetItem(&treeWidget);
grade1->setText(0,"Grade1");
QTreeWidgetItem* student = new QTreeWidgetItem(grade1);
student->setText(0,"Tom");
student->setText(1,"1986");
QTreeWidgetItem* grade2 = new QTreeWidgetItem(&treeWidget,grade1);
grade2->setText(0,"Grade2");
treeWidget.show();
3.1使用之前必须设置列数
3.2 顶层项:使用树部件作为其父项来创建,插入顺序随便
3.3 顶层项与深层项操作不同
删除项:树部件->takeTopLevelItem(),父项->takeChild();
插入项:树部件->insertTopLevelItem(),父项->insertChild();
删除项的代码
//先获取当前项目的父项
QTreeWidgetItem currentItem;
QTreeWidgetItem* itemParent = currentItem->parent();
int index;
if (itemParent) {
index = itemParent->indexOfChild(treeWidget->currentItem());
delete itemParent->takeChild(index);
} else {
index = treeWidget->indexOfTopLevelItem(treeWidget->currentItem());
delete treeWidget->takeTopLevelItem(index);
}
插入项
QTreeWidgetItem* itemParent = currentItem->parent();
QTreeWidgetItem* newItem;
if (itemParent) {
newItem = new QTreeWidgetItem(itemParent,treeWidget->currentItem())
} else {
newItem = new QTreeWidgetItem(treeWidget,treeWidget->currentItem())
}
4 QTableWidget
//插入指定位置
QTableWidget tableWidget(3,2);
QTableWidgetItem item11("qt");
tableWidget.setItem(1,1,&item11);
//创建表格项目,并将它们作为标头
QTableWidgetItem *headerV = new QTableWidgetItem("frist");
tableWidget.setVerticalHeaderItem(0,headerV);
QTableWidgetItem *headerH = new QTableWidgetItem("Id");
tableWidget.setHorizontalHeaderItem(0,headerH);
tableWidget.show();
5 共性 QTableWidget,QTreeWidget,QListWidget
QListWidgetItem,QTreeWidgetItem提供了setHidden()函数奖项目隐藏,判断是否隐藏isHidden()函数
3个便捷类的selectedItems()函数来获取被选择的项目,返回一个项目列表
findeItems()函数来查找项目,也会返回一个项目列表
5 在便捷类中启用拖放操作
5.1 拖放功能实现
启用项目拖拽,需要设置drapEnable属性为true;
要允许用户将内部或外部的项目放入视图中,需要设置视图的viewport()的acceptDrops属性为true
要显示现在用户拖拽的项目将要被放置的位置,需要设置showDropIndicator属性
//设置选择模式为单选
listWidget.setSelectionMode(QAbstractItemView::SingleSelection);
//启用该拖动
listWidget.setDragEnabled(true);
//设置拖放
listWidget.viewport()->setAcceptDrops(true);
//实质显示将要被放置的位置
listWidget.setDropIndicatorShown(true);
//设置拖放模式为移动项目,如果不设置,默认为复制项目
listWidget.setDragDropMode(QAbstractItemView::InternalMove);
5.2 在模型/视图类中启用拖放
listView.setSelectionMode(QAbstractItemView::ExtendedSelection);
listView.setDragEnabled(true);
listView.viewport()->setAcceptDrops(true);
listView.setDropIndicatorShown(true);
因为视图中显示的数据是由模型控制的,所以要为使用的模型提供拖放操作支持
Qt::DropActions supportedDropActions() const; //设置支持放入动作
QStringList mimeTypes() const; //设置在拖放操作中导出的条目的数据的编码类型
QMimeData *mimeData(const QModelIndexList &indexes) const; //将拖放的数据放入QMimeData中
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); //将拖放的数据放入模型中
实现下面的函数
//设置支持放入动作
Qt::DropActions StringListModel::supportedDropActions() const
{
return Qt::CopyAction | Qt::MoveAction;
}
//设置在拖放操作中导出的条目的数据的编码类型
QStringList StringListModel::mimeTypes() const
{
QStringList types;
// "application/vnd.text.list"是自定义的类型,在后面的函数中要保持一致
types << "application/vnd.text.list";
return type;
}
//将拖放的数据放入QMimeData中
QMimeData *StringListModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeData = new QMimeData();
QByteArray encodeData;
QDataStream stream(&encodeData,QIODevice::WriteOnly);
foreach (const QModelIndex &index, indexes) {
if (index.isValid()) {
QString text = data(index,Qt::DisplayRole).toString();
stream << text;
}
}
//将数据放入QMimeData中
mimeData->setData("application/vnd.text.list",encodeData);
return mimeData;
}
//将拖放的数据放入模型中
bool StringListModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
const QModelIndex &parent)
{
//如果放入动作是Qt::IgnoreAction,那么返回true
if (action == Qt::IgnoreAction) return true;
//如果数据的格式不是指定的格式,那么返回false
if (!data->hasFormat( "application/vnd.text.list")) return false;
//因为这里是列表,只用一列,所以大于0时返回false
if (column > 0) return false;
//设置开始插入的行
int beginRow;
if (row != -1) {
beginRow = row
}
else if (parent.isValid()) {
beginRow = parent.row();
}
else {
beginRow = rowCount(QModelIndex());
}
//将数据从QMimeData中读取出来,然后插入到模型中
QByteArray encodeData = data->data("application/vnd.text.list");
QDataStream stream(&encodeData,QIODevice::ReadOnly);
QStringList newItems;
int rows = 0;
while (! stream.atEnd()) {
QString text;
stream >> text;
newItems << text;
++rows;
}
insertRows(beginRow,rows,QModelIndex);
foreach (const QString& text,newItems) {
QModelIndex idx = index(beginRow,0,QModelIndex());
setData(idx,text);
beginRow++;
}
return true;
}
修改flags
Qt::ItemFlags StringListModel::flags(const QModelIndex &index) const
{
if (!index.isValid()) return Qt::ItemIsEnabled|Qt::ItemIsDropEnabled;
return QAbstractItemModel::flags(index)|Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled;
}