pyqt5 QTreeWidget表头设置

QTreeWidget 树结构控件的一些透明化的一些注意事项

今天在使用pyqt5中的QTreeWidget树结构控件的时候,本来想设置该控件透明状态,但根据网上的答案设置却无法做到对表头的透明,如下图

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.resize(500, 600)
        self.setWindowTitle("树结构控件透明设置")
        # 主窗口背景色
        self.setStyleSheet("background-color: lightblue;")

        # 为了验证透明状态,设置一个label
        label1 = QLabel("标签位于树结构下方",self)
        label1.setGeometry(350,200,150,40)

        label1 = QLabel("标签位于树结构下方", self)
        label1.setGeometry(350, 20, 150, 40)

        # 创建 QTreeWidget
        self.treeWidget = QTreeWidget(self)

        # 创建表头
        self.treeWidget.setHeaderLabels(["列1", "列2"])
        self.treeWidget.setGeometry(20, 20, 400, 500)
        # 创建根节点和子节点
        root = QTreeWidgetItem(self.treeWidget)
        root.setText(0, "根节点")

        child1 = QTreeWidgetItem(root)
        child1.setText(0, "子节点1")
        child1.setText(1, "子节点1的数据")

        child2 = QTreeWidgetItem(root)
        child2.setText(0, "子节点2")
        child2.setText(1, "子节点2的数据")

        self.treeWidget.setStyleSheet("""QTreeWidget{
                background-color:rgba(255,255,255,0.5); 
                Color:black; 
                font : 16px; 
                border:1px solid gray}
            QHeaderView:section{background-color:transparent}""")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

经过不断的探索,终于发现问题所在;

实际上,QTreeWidget表头一共有3层!!! 笔者称其为内容层,section层,header层,上面的代码只是将内容层以及seciton层设置为透明状态,header层仍然默认为白色;

经过测试,内容层位于最底层,section层位于中间,header层位于顶层

所以,需要添加以下代码即可解决问题,成功使表头透明化,

        # 设置 QTreeWidget 的表头为透明
        header = self.treeWidget.header()
        header.setStyleSheet("background-color: transparent;border:1px solid gray")

运行结果如下:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt TreeWidget是一种常用的树形控件,它允许用户通过拖拽的方式对树节点进行操作。然而,Qt TreeWidget并没有原生支持节点之间的连线,需要自行实现。 要实现Qt TreeWidget节点之间的拖拽连线,首先需要对TreeWidget添加一个自定义的标志,用于判断节点是否可以被拖拽。可以通过重写TreeWidget的mousePressEvent()和mouseMoveEvent()方法,检测鼠标事件,判断是否为合法的拖拽操作。 接下来,需要通过重写TreeWidget的dropEvent()方法,处理节点的拖拽放置。在dropEvent()方法中,可以获取到放置的目标节点以及拖拽的源节点,可以根据需要进行处理。 在处理节点拖拽放置时,可以使用Qt的GraphicsScene和GraphicsLineItem来实现节点之间的连接线。可以在节点被拖拽放置时,绘制一条连接源节点和目标节点的线条。可以通过GraphicsScene的addItem()方法和GraphicsLineItem的setLine()方法来添加和设置线条对象。 除了拖拽连线外,还可以考虑添加节点选择、编辑、删除等功能,以增加TreeWidget的交互性和实用性。 综上所述,实现Qt TreeWidget节点之间的拖拽连线,需要添加拖拽标志,重写相关事件方法,处理节点拖拽放置,并使用GraphicsScene和GraphicsLineItem来绘制连接线条。在实现过程中,可以根据实际需求进行进一步的功能扩展和优化。 ### 回答2: Qt TreeWidget是一个用于显示树形结构的控件,而拖拽连线是指在该控件中实现拖拽节点并连接的功能。 首先,我们需要设置TreeWidget控件的属性,使其具有拖拽功能。可以通过设置setDragEnabled(True)来启用拖拽。接着,我们需要重写TreeWidget控件的两个事件函数:mousePressEvent和dragMoveEvent。 在mousePressEvent中,我们需要获取被拖拽的节点以及相关的数据,并将其打包成一个QMimeData对象。然后调用startDrag()函数开始拖拽操作。 ```cpp void TreeWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { QTreeWidgetItem *item = currentItem(); if (item) { QByteArray data = serializeItemData(item); QMimeData *mimeData = new QMimeData; mimeData->setData("application/x-treewidget-item", data); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->exec(Qt::CopyAction); } } QTreeWidget::mousePressEvent(event); } ``` 在dragMoveEvent中,我们需要在拖拽时显示一个可放置的节点。可以通过调用setDropIndicatorShown(True)来显示放置指示器,并将拖拽进入的节点设为当前节点。 ```cpp void TreeWidget::dragMoveEvent(QDragMoveEvent *event) { QTreeWidgetItem *item = itemAt(event->pos()); if (item) { setDropIndicatorShown(true); setCurrentItem(item); event->acceptProposedAction(); } QTreeWidget::dragMoveEvent(event); } ``` 接下来就是实现连线的逻辑。在TreeWidget控件中,我们可以通过itemDropped信号来获取拖拽结束后的节点和放置位置的节点,然后进行连线操作。可以在TreeWidget的构造函数中连接itemDropped信号。 ```cpp connect(this, &TreeWidget::itemDropped, this, &TreeWidget::linkItems); ``` 在linkItems函数中,我们可以获取sourceItem和targetItem两个节点,并根据实际需求进行连线操作,例如使用QGraphicsItem创建一条折线连接这两个节点。 ```cpp void TreeWidget::linkItems(QTreeWidgetItem *sourceItem, QTreeWidgetItem *targetItem) { // 连线操作 ... } ``` 通过以上步骤,我们就可以在Qt的TreeWidget中实现拖拽连线的功能。 ### 回答3: Qt TreeWidget提供了拖拽连线的功能。要实现这个功能,我们需要设置相应的属性和信号与槽函数。 首先,我们需要设置TreeWidget的属性来启用拖拽: ```cpp treeWidget->setDragEnabled(true); treeWidget->setAcceptDrops(true); treeWidget->setDragDropMode(QAbstractItemView::InternalMove); ``` 其中,`setDragEnabled(true)`启用拖拽功能,`setAcceptDrops(true)`允许接受拖拽事件,`setDragDropMode(QAbstractItemView::InternalMove)`设置拖拽方式为内部移动。 接下来,我们需要实现`dragEnterEvent`和`dropEvent`两个事件函数来处理拖拽过程中的操作。 在`dragEnterEvent`函数中,我们需要检查所拖动的项是否可以接受拖拽,如果可以接受,则设置拖拽操作为移动操作,并接受拖拽事件: ```cpp void TreeWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { event->setDropAction(Qt::MoveAction); event->accept(); } else { event->ignore(); } } ``` 在`dropEvent`函数中,我们需要获取拖放的数据并执行相应操作,比如实现连线功能。这里以树形结构中的节点间连线为例,我们可以通过获取拖拽的项和放置的项来进行连线操作: ```cpp void TreeWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { QByteArray itemData = event->mimeData()->data("application/x-qabstractitemmodeldatalist"); QDataStream dataStream(&itemData, QIODevice::ReadOnly); while (!dataStream.atEnd()) { int row, col; QMap<int, QVariant> roleDataMap; dataStream >> row >> col >> roleDataMap; // 连线操作 // 根据拖拽项和放置项进行连线 // 添加连线到视图上 } event->setDropAction(Qt::MoveAction); event->accept(); } else { event->ignore(); } } ``` 通过以上操作,我们可以实现Qt TreeWidget的拖拽连线功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值