- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想在 QTreeWidget
中拖动时隐藏“拖动指示器”(拖动的行屏幕截图)只显示鼠标箭头,这可能吗?
我尝试重新实现 mouseMoveEvent
,“拖动指示器”消失了,但同时,拖放被禁用,我错过了什么
代码:
#!/usr/bin/env python2
import os
import sys
import re
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt, QString
class MyTreeWidget(QtGui.QTreeWidget):
def mouseMoveEvent_xxx(self, e):
mimeData = QtCore.QMimeData()
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
# pixmap = QtGui.QPixmap()
# drag.setPixmap(pixmap)
# drag.setHotSpot(e.pos())
# QtGui.QTreeWidget.mouseMoveEvent(self,e)
drag.exec_(QtCore.Qt.MoveAction)
def dropEvent(self,e):
QtGui.QTreeWidget.dropEvent(self,e)
self.expandAll()
e.accept()
class TheUI(QtGui.QDialog):
def __init__(self, args=None, parent=None):
super(TheUI, self).__init__(parent)
self.layout = QtGui.QVBoxLayout(self)
treeWidget = MyTreeWidget()
button = QtGui.QPushButton('Add')
self.layout.addWidget(treeWidget)
self.layout.addWidget(button)
treeWidget.setHeaderHidden(True)
self.treeWidget = treeWidget
self.button = button
self.button.clicked.connect(lambda *x: self.addCmd())
HEADERS = ( "script", "chunksize", "mem" )
self.treeWidget.setHeaderLabels(HEADERS)
self.treeWidget.setColumnCount( len(HEADERS) )
self.treeWidget.setColumnWidth(0,160)
self.treeWidget.header().show()
self.treeWidget.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
self.resize(500,500)
for i in xrange(6):
item =self.addCmd(i)
if i in (3,4):
self.addCmd('%s-1' % i,parent=item)
self.treeWidget.expandAll()
self.setStyleSheet("QTreeWidget::item{ height: 30px; }")
def addCmd(self, i,parent=None):
'add a level to tree widget'
root = self.treeWidget.invisibleRootItem()
if not parent:
parent=root
item = QtGui.QTreeWidgetItem(parent,['script %s' %i,'1','150'])
return item
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
gui = TheUI()
gui.show()
app.exec_()
截图:
我想隐藏蓝色拖动栏,同时保持鼠标箭头。(或者给它一些自定义像素图,或者更好地在拖动栏周围画一个虚线轮廓),这个想法不想掩盖它后面的树内容,(在我的系统中,合成管理器被禁用,所以半透明是不可能的)
如果您将 mouseMoveEvent_xxx 重命名为 mouseMoveEvent,您将明白我的意思,拖动被禁用,尽管我已将 dragDropMode 设置为 InternalMove
最佳答案
非常有趣!
我在 Qt 4 (C++) 中找到了拖动指示器的行为。最后,我发现方法void QAbstractItemView::startDrag(Qt::DropActions supportedActions)
是控件开始拖拽指示器。在 Line 3217 - 3238可以判断拖动行为和第 3229 行是否是您想要的(设置新图像或不设置)。好的,解决方案是找到任何方法将第 3229 行删除或替换为新图像。绝对,我们必须重写这个方法。但是,新问题是 C++ 和你在 python 中的使用。我们必须改变一些东西,把它放在 python 中才能工作。 (铁杆...)
好的,就是这样。覆盖方法 QAbstractItemView.startDrag (self, Qt.DropActions supportedActions)
;
来自 C++;
.
.
.
void QAbstractItemView::startDrag(Qt::DropActions supportedActions)
{
Q_D(QAbstractItemView);
QModelIndexList indexes = d->selectedDraggableIndexes();
if (indexes.count() > 0) {
QMimeData *data = d->model->mimeData(indexes);
if (!data)
return;
QRect rect;
QPixmap pixmap = d->renderToPixmap(indexes, &rect);
rect.adjust(horizontalOffset(), verticalOffset(), 0, 0);
QDrag *drag = new QDrag(this);
drag->setPixmap(pixmap);
drag->setMimeData(data);
drag->setHotSpot(d->pressedPosition - rect.topLeft());
Qt::DropAction defaultDropAction = Qt::IgnoreAction;
if (supportedActions & Qt::CopyAction && dragDropMode() != QAbstractItemView::InternalMove)
defaultDropAction = Qt::CopyAction;
if (drag->exec(supportedActions, defaultDropAction) == Qt::MoveAction)
d->clearOrRemove();
}
}
.
.
.
对python;
class QCustomTreeWidget (QtGui.QTreeWidget):
.
.
.
def startDrag (self, supportedActions):
listsQModelIndex = self.selectedIndexes()
if listsQModelIndex:
dataQMimeData = self.model().mimeData(listsQModelIndex)
if not dataQMimeData:
return None
dragQDrag = QtGui.QDrag(self)
# dragQDrag.setPixmap(QtGui.QPixmap('test.jpg')) # <- For put your custom image here
dragQDrag.setMimeData(dataQMimeData)
defaultDropAction = QtCore.Qt.IgnoreAction
if ((supportedActions & QtCore.Qt.CopyAction) and (self.dragDropMode() != QtGui.QAbstractItemView.InternalMove)):
defaultDropAction = QtCore.Qt.CopyAction;
dragQDrag.exec_(supportedActions, defaultDropAction)
实验结果
我测试了这段代码并实现了代码,工作正常。但是,我无法在拖动指示器期间捕获图片。 (我用的是 windows 7)
有用的引用:QDrag Class Reference , QAbstractItemView
关于python - 在QTreeWidget中拖动时如何在释放之前隐藏屏幕截图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25430088/
我有一个 GUI,用户可以从列表中选择气体成分并将其移至“选择”,另一个按钮从“选择”中获取包含以下列的文本:气体成分、分子量、摩尔%。前两列从我创建的字典中获取信息,最后一列是用户输入。 当点击按钮
我的 QT 应用程序中有两个 QTreeWidget,使用 python (PyQt4)。 我想要 手动将 TreeWidget 1 展开为一个项目,然后。如果此项目位于 TreeWidget 2 中
我有两列的 QTreeWidget。第一列是文本,第二列是 QPushButton。我无法指定按钮的大小和第二列的大小。当您尝试设置内容栏的大小时,第二栏消失了。如何改变第二列的宽度? tree_wi
我有两列的 QTreeWidget。第一列是文本,第二列是 QPushButton。我无法指定按钮的大小和第二列的大小。当您尝试设置内容栏的大小时,第二栏消失了。如何改变第二列的宽度? tree_wi
我需要在 QTreeWidget 中的项目激活时执行一些操作,但下面的代码没有给我预期的结果: class MyWidget(QTreeWidget): def __init__(self,
我有一个文件,其中列出了绝对文件路径,每行 1 个。列出的文件是按顺序排列的,因此例如所有文件/Documents/ dir 将在文件中列在彼此之后。 我想要做的是将所有这些文件放在 QTreeWid
我想在我的程序中实现一个带有嵌套子级别的树,我正在寻找这两种( View /小部件)中的哪一种最适合我的目标。 我有一个任务完成/错过/失败的天数列表,每个任务都有完成/错过/失败的次数,最后是当天的
有谁知道是否可以在 QTreeWidget 上选择多个项目以及如何启用多项选择? 我想要选择的所有项目都是顶级 QTreeWidgetItems 并且它们的所有子项都设置为禁用(即 QTreeWidg
我对 Python 还很陌生,所以请耐心等待。我正在尝试从元组填充 QTreeWidget,但我似乎无法让它正常工作。 TreeList = ({ 'Header1': ((
我想不显示父 QWidgetItem 之间的空格和子项...我该怎么做。 style-Sheet ?.. 谢谢你!!! 这是 QTreeWidget . 最佳答案 http://qt-project.
我正在开发 python 插件。我使用 PYQT4 设计器来制作表单。我将查询结果列出到 QTreeWidget 中,如下所示: items = [] for row in c.f
我的 Qt 表单中有一个 treewidget。它显示了一个文件树,显示了一个代表它们的图标,以及它们的名称。 我使用 treeItem->setIcon(0, *icon) 和 treeItem->
我有一个 QTreeWidget,我的设置是这样的...... ModelTreeWidget::ModelTreeWidget(QWidget *parent):QTreeWidget(parent
默认情况下,QTreeWidget 管理行的选择(当您单击一行时它会突出显示它,当您单击另一行时它会突出显示并取消选择前一行) ,我不想要这个,也不知道如何关闭它。 最佳答案 你可以使用setSele
当我将选择模式设置为 ExtendSelection 时,“选定效果”(使用 TAB 时获得的效果)始终存在于我的 QTreeWidget 中(我需要它才能选择多个项目)。 如果我从代码中删除这一行,
我有一个 QTreeWidget,其中填充了自定义小部件。我从外部 API 检索项目类型,它可能是文本值、数值或其他任何值。根据类型,我为 QTreeWidgetItem 提供了不同的控件。例如用于文
我有一个 QTreeWidget,我想添加图标,是否有默认设置可供选择,例如资源管理器中的文件夹和一张空白纸图标? 最佳答案 默认有几个图标,例如: 与 QStyle::standardIcon(..
嗯。我正在开发一个 IDE。你们中的一些人可能看到了一篇关于它的帖子。好吧,我不知道 QTreeWidget 和 QtreeWidgetItem 是如何工作的,因为找不到演示并且文档也没有帮助。好吧,
我想要一个带有 1 列标题的 qtreewidget,但它的子项有更多列,我尝试了下面的代码,但我也想隐藏补贴标题。 treeView = new QTreeView; treeView->setMo
我正在尝试进行某种递归。如果您打开 P,那么您可以再次打开 P 或执行其他操作。这是我的问题: 我不能两次添加相同的项目。 while (*it) { if ((*it)->text(0) =
我是一名优秀的程序员,十分优秀!