关于QTreeWidget显示类似QTableWidget网格的实现

先上个图看看效果:

我的实现方式选择了样式表,下面是代码:

QTreeView::item

{
    border-right:1px solid rgb(179,216,247);
    border-bottom:1px solid rgb(179,216,247);
    padding: 2px;
    margin: 0px;
    margin-left:-2px;
}
QTreeView::branch {
        border-bottom:1px solid rgb(179,216,247);
}
因为这样设置后,有子节点的父节点前面的三角形会消失,所以仍然使用样式表添加:

QTreeView::branch:has-children:closed {

        image: url("://image/branch_with_childen_closed.png");
}
QTreeView::branch:has-children:closed:hover {
        image: url("://image/branch_with_childen_closed_hover.png");
}
QTreeView::branch:has-children:open {
        image: url("://image/branch_with_childen_open.png");
}
QTreeView::branch:has-children:open:hover {
        image: url("://image/branch_with_childen_open_hover.png");
}
至此,实现了网格显示的效果,至于后面根据内容样式显示不同的控件的,本文暂不讨论。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是通过QUndoGroup实现QTreeWidgetQTableWidget支持撤销与恢复功能的代码示例: ``` #include <QtWidgets> class TreeWidgetItem : public QTreeWidgetItem { public: explicit TreeWidgetItem(QTreeWidget *parent = nullptr) : QTreeWidgetItem(parent) { } void setData(int column, int role, const QVariant &value) override { QUndoCommand *cmd = new TreeWidgetItemDataCommand(this, column, role, text(column), value.toString()); cmd->setText(QString("Edit %1 \"%2\" to \"%3\"").arg(parent()->objectName(), text(column), value.toString())); undoStack()->push(cmd); } QUndoStack *undoStack() const { return treeWidget()->property("undoStack").value<QUndoStack *>(); } }; class TreeWidgetItemDataCommand : public QUndoCommand { public: explicit TreeWidgetItemDataCommand(TreeWidgetItem *item, int column, int role, const QString &oldValue, const QString &newValue) : item(item), column(column), role(role), oldValue(oldValue), newValue(newValue) { } void undo() override { item->setText(column, oldValue); } void redo() override { item->setText(column, newValue); } private: TreeWidgetItem *item; int column; int role; QString oldValue; QString newValue; }; class TableWidgetItem : public QTableWidgetItem { public: explicit TableWidgetItem(QTableWidget *parent = nullptr) : QTableWidgetItem(parent) { } void setData(int role, const QVariant &value) override { QUndoCommand *cmd = new TableWidgetItemDataCommand(this, role, data(role), value.toString()); cmd->setText(QString("Edit %1 \"%2\" to \"%3\"").arg(parent()->objectName(), data(Qt::DisplayRole).toString(), value.toString())); undoStack()->push(cmd); } QUndoStack *undoStack() const { return tableWidget()->property("undoStack").value<QUndoStack *>(); } }; class TableWidgetItemDataCommand : public QUndoCommand { public: explicit TableWidgetItemDataCommand(TableWidgetItem *item, int role, const QString &oldValue, const QString &newValue) : item(item), role(role), oldValue(oldValue), newValue(newValue) { } void undo() override { item->setData(role, oldValue); } void redo() override { item->setData(role, newValue); } private: TableWidgetItem *item; int role; QString oldValue; QString newValue; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); QUndoGroup undoGroup; // 创建 QTreeWidget QTreeWidget treeWidget; treeWidget.setObjectName("TreeWidget"); treeWidget.setProperty("undoStack", QVariant::fromValue(&undoGroup.createUndoStack())); // 创建 QTableWidget QTableWidget tableWidget; tableWidget.setObjectName("TableWidget"); tableWidget.setProperty("undoStack", QVariant::fromValue(&undoGroup.createUndoStack())); tableWidget.setColumnCount(2); tableWidget.setRowCount(2); // 添加测试数据 treeWidget.setHeaderLabels({"Name", "Value"}); QTreeWidgetItem *root = new QTreeWidgetItem(&treeWidget, {"Root"}); TreeWidgetItem *child1 = new TreeWidgetItem(root); child1->setText(0, "Child 1"); child1->setText(1, "1"); TreeWidgetItem *child2 = new TreeWidgetItem(root); child2->setText(0, "Child 2"); child2->setText(1, "2"); tableWidget.setItem(0, 0, new TableWidgetItem(&tableWidget)); tableWidget.setItem(0, 1, new TableWidgetItem(&tableWidget)); tableWidget.setItem(1, 0, new TableWidgetItem(&tableWidget)); tableWidget.setItem(1, 1, new TableWidgetItem(&tableWidget)); // 创建一个窗口并显示 QMainWindow window; window.setCentralWidget(&treeWidget); window.setMenuBar(new QMenuBar); window.menuBar()->addAction(undoGroup.createUndoAction(&window)); window.menuBar()->addAction(undoGroup.createRedoAction(&window)); window.show(); return app.exec(); } ``` 在上面的代码中,我们创建了两个自定义的QTreeWidgetItem和QTableWidgetItem类,用于处理数据更改操作。这些类都继承了QUndoCommand类,以便我们可以将更改操作添加到QUndoStack中。 我们还使用QTreeWidgetQTableWidget的setProperty方法将undoStack属性设置为创建的QUndoStack对象。这使得我们可以通过使用undoStack()方法来获取当前对象的QUndoStack对象。 最后,我们创建了一个窗口并将其显示出来。我们将撤销和重做操作添加到菜单栏中,以便用户可以轻松地撤销和恢复更改操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值