Python QWiget不';t与之对齐';s QTreeWidgetItem

Python QWiget不';t与之对齐';s QTreeWidgetItem,python,pyqt5,Python,Pyqt5,我有一个QTreeWidget,它有一个顶级“分支”和一个秒级“分支”。每个分支都有QTreeWidgetItems,该QTreeWidgetItems具有QLabel和Qpixmap,并且为了节省内存,仅当用户展开分支项目时才生成Qpixmap。此QTtreeWidgetItem的每个子级都获得一个带有setItemWidget()的QLabel,并且PIXMap在另一个线程中生成。当我双击QLabel时,我想打印出公式 当我想在qrunbale生成完成后将每个QPixmap设置为每个相应的Q

我有一个QTreeWidget,它有一个顶级“分支”和一个秒级“分支”。每个分支都有QTreeWidgetItems,该QTreeWidgetItems具有QLabel和Qpixmap,并且为了节省内存,仅当用户展开分支项目时才生成Qpixmap。此QTtreeWidgetItem的每个子级都获得一个带有
setItemWidget()
的QLabel,并且PIXMap在另一个线程中生成。当我双击QLabel时,我想打印出公式

当我想在qrunbale生成完成后将每个QPixmap设置为每个相应的QLabel时,就会出现问题。第一次扩建支行时,情况如下:

请注意每个QTreeWidgetItem的高度是如何正确的(有6个公式,悬停在每个项目上,您可以看到有6个项目,这里我悬停在第五个项目上),双击每个项目会打印出正确的公式(第一个项目上的v=s/t,最后一个项目上的v2-v02=2,即使它没有图像)。但是这里的Qpixmap/Qlabel与QTreeWidgetItems不对齐。再次折叠和展开同一项目将产生:

突然,由于某种原因,每个QPixmap都对齐了。(另外,我的鼠标在两张图片中的位置相同,悬停在相同的QTreeItemWidget上,双击可打印出相同的公式)

代码如下:

从PyQt5.QtGui导入*
从PyQt5.QtWidgets导入*
从PyQt5.QtCore导入*
导入系统
导入matplotlib
将matplotlib.pyplot导入为mpl
从matplotlib.backends.backend_agg导入图Canvasagg
从sympy.printing进口乳胶
从sympy.parsing导入parse_expr
从sympy导入Eq
matplotlib.rcParams[“mathtext.fontset”]=“cm”
数据=[
{
“速度”:[“V”,“物体速度”]
},
{
“Fysik”:{
“运动学”:{
“v=s/t”:{},
“a=v/t”:{},
“v=v0+a*t”:{},
“s=v0*t+(a*t**2)/2”:{},
“s=(v+v0)/2*t”:{},
“v**2-v0**2=2*a*s”:{},
}
}
}
]
def mathTex_到QPixmap(mathTex,fs,图):
"""
从LaTeX创建QPixMap
https://stackoverflow.com/questions/32035251/displaying-latex-in-pyqt-pyside-qtablewidget
:param mathTex:str
乳胶串
:param fs:int
字号
:param fig:matplotlib.figure.figure
Matplotlib图形
:return:QPixmap
包含乳胶图像的QPixMap
"""
图clf()
图贴片设置面颜色(“无”)
fig.set_帆布(FigureCanvasAgg(图))
renderer=fig.canvas.get_renderer()
ax=图添加轴([0,0,1,1])
ax.轴(“关闭”)
ax.patch.set_facecolor(“无”)
t=ax.text(0,0,mathTex,ha=“left”,va=“bottom”,fontsize=fs)
fwidth,fheight=图尺寸(英寸)
fig_bbox=fig.get_window_区段(渲染器)
text\u bbox=t.get\u window\u区段(渲染器)
紧密宽度=文本宽度*宽度/图宽度
紧度=文本高度*高度/图高度
图设置尺寸英寸(紧密宽度、紧密高度)
buf,size=fig.canvas.print_to_buffer()
qimage=qimage.rgbSwapped(qimage(buf,大小[0],大小[1],qimage.Format_ARGB32))
qpixmap=qpixmap(qimage)
返回qpixmap
类迟发信号(QObject):
finished=pyqtSignal()
电流=PYQT信号(int)
输出=PYQT信号(列表)
LaTeXWorker类(无法命名):
定义初始化(自我,公式列表):
超级(最新工作人员,自我)。\uuuu初始
self.formula\u list=formula\u list
self.fig=mpl.figure()
self.signals=LaTeXSignals()
@pyqtSlot()
def运行(自)->无:
"""
根据提供的公式创建QPixMap
按self.formula\u列表
:return:list
QPixMap列表
"""
out=[]
对于i,枚举中的公式(self.formula_列表):
expr=公式分割(“=”)
left=parse_expr(expr[0],evaluate=False)
right=parse_expr(expr[1],evaluate=False)
latex_pixmap=mathTex_to_QPixmap(
f“${latex(Eq(左、右))}$”,
15,
fig=self.fig,
)
out.append(latex\u pixmap)
自信号电流发射(i)
self.signals.output.emit(out)
self.signals.finished.emit()
类测试(QMainWindow):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.info=数据[0]
self.formulas=数据[1]
self.threadpool=QThreadPool()
self.threadpool.setMaxThreadCount(1)
self.init_ui()
self.add_公式()
self.init_绑定()
def初始用户界面(自身):
"""
创建用户界面
"""
self.FormulaTree=QTreeWidget()
self.setCentralWidget(self.FormulaTree)
def添加_公式(自身):
"""
初始化树
"""
对于self.formulas中的分支:
父项=QTreeWidgetItem(self.FormulaTree)
parent.setText(0,分支)
对于self.formulas[branch]中的sub_分支:
子项=QTreeWidgetItem(父项)
child.setText(0,分支)
对于self中的公式。公式[分支][分支]:
公式_child=QTreeWidgetItem(子项)
公式_label=QLabel()
formula_label.setObjectName(f“{formula}”)
self.FormulaTree.setItemWidget(公式\子项,0,公式\标签)
def初始绑定(自):
self.FormulaTree.itemDoubleClicked.connect(self.formula\u tree\u选中)
self.FormulaTree.itemExpanded.connect(self.expanded\u子)
self.FormulaTree.itemclopsed.connect(self.collapsed\u sub)
def扩展_子项(自身,项目):
#折叠其他所有内容,只展开用户单击的内容
root=self.FormulaTree.invisibleRootItem()
对于范围内的i(root.childCount()):
胸罩