Python PySide:即时工具提示(显示工具提示前无延迟)
我正在构建的工具使用工具提示在单击文件之前显示有关该文件的额外信息。如果有人能对如何实现这一点提供一些见解,那就太好了。我进入PySide大约一个月了,所以我在网上找到的这些高级示例/答案在破译上有困难,所以一个简单的代码示例和一些注释将对我有很大帮助 这是我到目前为止所拥有的。对于事件,我不知道我在做什么,因此这是我所能做的最好的代码示例:Python PySide:即时工具提示(显示工具提示前无延迟),python,tooltip,pyside,qtreeview,Python,Tooltip,Pyside,Qtreeview,我正在构建的工具使用工具提示在单击文件之前显示有关该文件的额外信息。如果有人能对如何实现这一点提供一些见解,那就太好了。我进入PySide大约一个月了,所以我在网上找到的这些高级示例/答案在破译上有困难,所以一个简单的代码示例和一些注释将对我有很大帮助 这是我到目前为止所拥有的。对于事件,我不知道我在做什么,因此这是我所能做的最好的代码示例: from PySide import QtCore, QtGui from shiboken import wrapInstance import may
from PySide import QtCore, QtGui
from shiboken import wrapInstance
import maya.OpenMayaUI as mui
def get_parent():
ptr = mui.MQtUtil.mainWindow()
return wrapInstance( long( ptr ), QtGui.QWidget )
############################################
''' Classes '''
############################################
class Main_Window( QtGui.QDialog ):
def __init__( self, parent=get_parent() ):
super( Main_Window, self ).__init__( parent )
self.setMouseTracking(True) # Set tracking
self.create_gui()
self.create_layout()
self.create_connections()
self.get_contents()
self.shapeItems = []
#-------------------------------------------------------------------- # Mouse things
def mouseMoveEvent(self, event):
if (event.buttons() & QtCore.Qt.LeftButton):
self.moveItemTo(event.pos())
#-------------------------------------------------------------------- # Mouse things
def event(self, event):
if event.type() == QtCore.QEvent.ToolTip:
helpEvent = event
index = self.itemAt(helpEvent.pos())
if index != -1:
QtGui.QToolTip.showText(helpEvent.globalPos(), self.shapeItems[index].toolTip())
else:
QtGui.QToolTip.hideText()
event.ignore()
return True
return super(Main_Window, self).event(event)
#--------------------------------------------------------------------
def create_gui( self ):
self.tv_model=MyModel()
self.tv_file_list = File_List( self )
#--------------------------------------------------------------------
def create_layout( self ):
self.main_layout = QtGui.QVBoxLayout( self )
self.main_layout.addWidget( self.tv_file_list )
self.setLayout( self.main_layout )
#--------------------------------------------------------------------
def get_contents(self):
self.tv_model.clear()
self.tv_model.setHorizontalHeaderLabels(["name","date"])
contents=["path1","path2"]
for path in contents:
date = self.get_date(path)
self.add_file(path,date)
self.tv_file_list.setColumnWidth(0, 150)
#--------------------------------------------------------------------
def add_file(self, name, date):
name = QtGui.QStandardItem(name)
name.setToolTip(name.text())
name.setIcon(self.style().standardIcon(QtGui.QStyle.SP_DirOpenIcon))
date = QtGui.QStandardItem(date)
self.tv_model.appendRow([name, date])
#--------------------------------------------------------------------
def get_date(self, path):
return "a date"
#--------------------------------------------------------------------
def create_connections( self ):
self.tv_file_list.clicked.connect( self.on_click )
# slots --------------------------------------------------------------
def on_click(self, item ):
index = self.tv_file_list.selectedIndexes()[0]
item = self.tv_model.itemFromIndex(index).text()
print item
############################################
class MyModel(QtGui.QStandardItemModel):
def __init__(self, parent=None):
super(MyModel, self).__init__(parent)
#--------------------------------------------------------------------
def flags(self, index):
flag = QtCore.Qt.ItemIsEnabled
if index.isValid():
flag |= QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable
return flag
############################################
class File_List( QtGui.QTreeView ):
''' Create the file filters '''
def __init__( self, mainUIWindow, parent=get_parent() ):
super( File_List, self ).__init__( parent )
self.setModel(mainUIWindow.tv_model)
self.setIndentation(0)
self.setColumnWidth(0,500)
self.setFocusPolicy(QtCore.Qt.NoFocus)
self.setStyleSheet("QToolTip { color: rgb(170,170,170); background-color: rgb(20,20,20); border: 1px rgb(20,20,20); }")
############################################
if __name__ == "__main__":
# workaround for a bug in maya
try:
tree_view_ui.close()
tree_view_ui.deleteLater()
except:
pass
tree_view_ui = Main_Window()
tree_view_ui.show()
try:
tree_view_ui.show()
except:
tree_view_ui.close()
tree_view_ui.deleteLater()
是一篇描述如何创建即时工具提示的文章,但是没有任何代码示例,我对如何编写这篇文章感到不知所措。文档也没有什么帮助(对于初学者来说,应该有一些简单的例子)
是一段显示如何实现鼠标移动事件的代码,但在上面的示例中,我还无法使其正常工作。我不断收到这样的错误:“TypeError:super(type,obj):obj必须是type的实例或子类型”和“AttributeError:'Main_Window'对象没有属性'itemAt'”
再说一次,任何帮助或想法都会很好。多谢各位
解决方案
from PySide import QtCore, QtGui
from shiboken import wrapInstance
import maya.OpenMayaUI as mui
def get_parent():
ptr = mui.MQtUtil.mainWindow()
return wrapInstance( long( ptr ), QtGui.QWidget )
############################################
''' Classes '''
############################################
class Main_Window( QtGui.QDialog ):
def __init__( self, parent=get_parent() ):
super( Main_Window, self ).__init__( parent )
self.create_gui()
self.create_layout()
self.create_connections()
self.get_contents()
#--------------------------------------------------------------------
def create_gui( self ):
self.tv_model=MyModel()
self.tv_file_list = File_List( self )
self.tv_file_list.setMouseTracking(True) # Set mouse tracking
#--------------------------------------------------------------------
def create_layout( self ):
self.main_layout = QtGui.QVBoxLayout( self )
self.main_layout.addWidget( self.tv_file_list )
self.setLayout( self.main_layout )
#--------------------------------------------------------------------
def get_contents(self):
self.tv_model.clear()
self.tv_model.setHorizontalHeaderLabels(["name","date"])
contents=["path1","path2"]
for path in contents:
date = self.get_date(path)
self.add_file(path,date)
self.tv_file_list.setColumnWidth(0, 150)
#--------------------------------------------------------------------
def add_file(self, name, date):
name = QtGui.QStandardItem(name)
user = "me"
name.setToolTip("<b>{0}</b><br><b>{1}</b>".format(name.text(), user) ) # Here's where I set the tooltip
name.setIcon(self.style().standardIcon(QtGui.QStyle.SP_DirOpenIcon))
date = QtGui.QStandardItem(date)
self.tv_model.appendRow([name, date])
#--------------------------------------------------------------------
def get_date(self, path):
return "a date"
#--------------------------------------------------------------------
def create_connections( self ):
self.tv_file_list.clicked.connect( self.on_click )
self.tv_file_list.entered.connect( self.handleItemEntered ) # New connection
# slots --------------------------------------------------------------
def on_click(self, item ):
index = self.tv_file_list.selectedIndexes()[0]
item = self.tv_model.itemFromIndex(index).text()
print item
#--------------------------------------------------------------------
def handleItemEntered(self, index): # New slot
if index.isValid():
QtGui.QToolTip.showText(
QtGui.QCursor.pos(),
index.data(),
self.tv_file_list.viewport(),
self.tv_file_list.visualRect(index)
)
############################################
class MyModel(QtGui.QStandardItemModel):
def __init__(self, parent=None):
super(MyModel, self).__init__(parent)
def flags(self, index):
flag = QtCore.Qt.ItemIsEnabled
if index.isValid():
flag |= QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable
return flag
############################################
class File_List( QtGui.QTreeView ):
''' Create the file filters '''
def __init__( self, mainUIWindow, parent=get_parent() ):
super( File_List, self ).__init__( parent )
self.setModel(mainUIWindow.tv_model)
self.setIndentation(0)
self.setColumnWidth(0,500)
self.setFocusPolicy(QtCore.Qt.NoFocus)
self.setStyleSheet("QToolTip { color: rgb(170,170,170); background-color: rgb(20,20,20); border: 1px rgb(20,20,20); }")
############################################
if __name__ == "__main__":
# workaround for a bug in maya
try:
tree_view_ui.close()
tree_view_ui.deleteLater()
except:
pass
tree_view_ui = Main_Window()
tree_view_ui.show()
try:
tree_view_ui.show()
except:
tree_view_ui.close()
tree_view_ui.deleteLater()
从PySide导入QtCore、QtGui
从shiboken进口包装箱
将maya.OpenMayaUI导入为mui
def get_parent():
ptr=mui.MQtUtil.mainWindow()
返回包装状态(长(ptr),QtGui.QWidget)
############################################
“类”
############################################
类主窗口(QtGui.QDialog):
def uu init uu(self,parent=get_parent()):
超级(主窗口,自我)。\uuuuu初始化\uuuuuu(父级)
self.create_gui()
self.create_布局()
self.create_connections()
self.get_内容()
#--------------------------------------------------------------------
def创建图形用户界面(自我):
self.tv_model=MyModel()
self.tv\u file\u list=文件列表(self)
self.tv_file_list.setMouseTracking(True)#设置鼠标跟踪
#--------------------------------------------------------------------
def创建_布局(自):
self.main_layout=QtGui.QVBoxLayout(self)
self.main\u layout.addWidget(self.tv\u文件列表)
self.setLayout(self.main_布局)
#--------------------------------------------------------------------
def get_内容(自身):
self.tv_model.clear()
self.tv_model.setHorizontalHeaderLabels([“名称”,“日期])
内容=[“路径1”、“路径2”]
对于目录中的路径:
日期=self.get_日期(路径)
self.add_文件(路径、日期)
self.tv\u file\u list.setColumnWidth(0,150)
#--------------------------------------------------------------------
def add_文件(自身、名称、日期):
name=QtGui.QStandardItem(名称)
user=“我”
name.setToolTip(“{0}
{1}”.format(name.text(),user))#这里是我设置工具提示的地方
name.setIcon(self.style().standardIcon(QtGui.QStyle.SP_DirOpenIcon))
日期=QtGui.QStandardItem(日期)
self.tv\u model.appendRow([名称,日期])
#--------------------------------------------------------------------
def get_日期(自身、路径):
返回“日期”
#--------------------------------------------------------------------
def创建_连接(自):
self.tv\u文件\u列表。单击。连接(self.on\u单击)
self.tv_file_list.entered.connect(self.handleItemEntered)#新建连接
#槽--------------------------------------------------------------
单击时的def(自身,项目):
index=self.tv\u文件\u列表。SelectedIndex()[0]
item=self.tv\u model.itemFromIndex(index.text)()
打印项目
#--------------------------------------------------------------------
def handleItemEntered(自身,索引):#新插槽
如果index.isValid():
QtGui.QToolTip.showText(
QtGui.QCursor.pos(),
index.data(),
self.tv\u文件\u列表.viewport(),
self.tv\u file\u list.visualRect(索引)
)
############################################
类MyModel(QtGui.QStandardItemModel):
def uuu init uuu(self,parent=None):
超级(MyModel,self)。\uuuuu init\uuuuuu(父级)
def标志(自、索引):
flag=QtCore.Qt.ItemIsEnabled
如果index.isValid():
标志|=QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable
返回标志
############################################
类文件列表(QtGui.QTreeView):
''创建文件筛选器''
def uuu init uuuu(self,mainuwindow,parent=get_parent()):
超级(文件列表,自我)。\uuuuu初始化\uuuuuu(父级)
self.setModel(mainUIWindow.tv_模型)
self.setIndentation(0)
self.setColumnWidth(0500)
self.setFocusPolicy(QtCore.Qt.NoFocus)
self.setStyleSheet(“QToolTip{color:rgb(170170170);背景色:rgb(20,20,20);边框:1px rgb(20,20,20);}”)
############################################
如果名称=“\uuuuu main\uuuuuuuu”:
#maya中错误的解决方法
尝试:
树\视图\用户界面关闭()
树\视图\ ui.deleteLater()
除:
通过
树\视图\用户界面=主\窗口()
树\视图\用户界面显示()
尝试:
树\视图\用户界面显示()
除:
树\视图\用户界面关闭()
树\视图\ ui.deleteLater()
使用treeview的信号执行此操作要容易得多。如果使用的重载接受rect
参数,QToolTip
将自动执行其余操作
下面是一个简单的演示:
from PySide import QtCore, QtGui
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
self.view = QtGui.QTreeView(self)
self.view.setMouseTracking(True)
self.view.entered.connect(self.handleItemEntered)
model = QtGui.QStandardItemModel(self)
for text in 'One Two Three Four Five'.split():
model.appendRow(QtGui.QStandardItem(text))
self.view.setModel(model)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.view)
def handleItemEntered(self, index):
if index.isValid():
QtGui.QToolTip.showText(
QtGui.QCursor.pos(),
index.data(),
self.view.viewport(),
self.view.visualRect(index)
)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.setGeometry(500, 300, 200, 200)
window.show()
sys.exit(app.exec_())
非常感谢。这对于访问项目名称非常有用,但我希望在将项目添加到视图时能够访问存储在每个项目下的其他数据(在我的主代码中,我存储创建文件的用户以及文件的图像)。你有没有想过如何做到这一点?我在想我得换一个