QtCreator 项目视图的便捷类QListWidget,QTableWidget,QTreeWidget

32 篇文章 0 订阅
16 篇文章 0 订阅

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值