鱼C论坛

 找回密码
 立即注册
查看: 1055|回复: 2

PyQt5界面切换重影

[复制链接]
发表于 2020-6-23 10:55:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 timmylulu2010 于 2020-6-23 14:20 编辑

求助请教一个折腾了很久的问题,一直找不到解决问题的办法。
问题:设计一个界面分为左右两部分,左边是一个tree,下拉多个item;右边是一个widget,widget里的控件随着点击左边tree上不同的item而不停切换(这里的切换我为了后期灵活扩展方便,并没有预先做好不同item对应的widget,而是在每次点击item的时候,根据item的配置信息临时生成右边widge里的内容,每次生成新的内容前会把右边widget先做一次清空处理)。逻辑上来看没什么问题,但是实际使用的时候遇到一个麻烦,如果鼠标点击切换不同item时候手速很快,就会产生右边界面重影现象,貌似就是上一次的widget没有清空完毕,新的widget就生成了的感觉。所以为了解决这个问题,试了多种方案,例如创建一个全局变量,通过true false来限制界面生成函数的执行;还试过用锁去将函数入口锁住,等函数执行完再释放。但这些方案都不起作用。贴上两段代码:
下面是点击tree下的item时,回调函数里的内容,其中self.resultUpdateShow(itemname)是用来实现右边widget擦除后重建的函数。
  1.     def onClicked(self,qmodeLindex):
  2.         self.tree.blockSignals(True)
  3.         item=self.tree.currentItem()
  4.         if self.notice['selectAll'][self.language] == item.text(0):
  5.             print('不做任何操作')
  6.             self.tree.setCurrentItem(self.lastItem)
  7.         else:
  8.             #onClickSemaphore.acquire()
  9.             print('click状态为')
  10.             print(self.onClickStatus)
  11.             if self.onClickStatus:
  12.                 time.sleep(0.1)
  13.                 self.lastItem = item
  14.                 print('点击调用')
  15.                 itemname = item.text(0)
  16.                 self.resultUpdateShow(itemname)
  17.                 ##onClickSemaphore.release()
  18.                 currentModeName = self.project['itemList'][self.project['defaultChipId']][self.project['defaultMode'][self.project['defaultChipId']]]['name']
  19.                 currentItemList = self.project['itemList'][self.project['defaultChipId']][self.project['defaultMode'][self.project['defaultChipId']]]['item']
  20.                 print('点击项目名称后,当前的项目列表的长度为')
  21.                 print(len(self.itemList))
  22.                 print('当前项目名称为')
  23.                 print(self.project['name'])
  24.                 if currentModeName == 'VR' or currentModeName == 'SP':
  25.                     if self.itemList[len(self.itemList) - 1].checkState(0) == 2:
  26.                         micLPESQID = self.itemNameTab.index('micLoutQualityL')
  27.                         micRPESQID = self.itemNameTab.index('micLoutQualityR')
  28.                         micLLevelID = self.itemNameTab.index('micLoutLevelL')
  29.                         micRLevelID = self.itemNameTab.index('micLoutLevelR')
  30.                         noiseLID = self.itemNameTab.index('noiseFloorL')
  31.                         noiseRID = self.itemNameTab.index('noiseFloorR')
  32.                         self.itemList[micLPESQID].setCheckState(0,Qt.Checked)
  33.                         self.itemList[micRPESQID].setCheckState(0,Qt.Checked)
  34.                         self.itemList[micLLevelID].setCheckState(0,Qt.Checked)
  35.                         self.itemList[micRLevelID].setCheckState(0,Qt.Checked)
  36.                         self.itemList[noiseLID].setCheckState(0,Qt.Checked)
  37.                         self.itemList[noiseRID].setCheckState(0,Qt.Checked)
  38.                 for i in range(len(self.itemList)):
  39.                     currentItemList[i]['select'] = self.itemList[i].checkState(0)
  40.                 print('Key=%s'%(item.text(0)))
  41.                 saveProjectParam(self.project)
  42.             else:
  43.                 print('-----------------不动不动-------------------')
  44.                 self.tree.setCurrentItem(self.lastItem)
  45.         self.tree.blockSignals(False)
复制代码


下面是self.resultUpdateShow(itemname)函数实体内容。
  1.     def resultUpdateShow(self, itemname):
  2.         print('\n所申请')
  3.         resultUpdateSemaphore.acquire()
  4.         self.gl = globalGet()
  5.         self.language = self.gl['language']
  6.         self.projectList = self.gl['project']
  7.         Flag, self.project = getProjectParam(self.projectList['list'][self.projectList['default']])
  8.         self.resultTab = {}
  9.         self.checkTab = {}
  10.         print('清除右边窗口')
  11.         #for childWidget in self.right_widget.children():
  12.         #    self.right_widget.removeItem(childWidget)
  13.         #    childWidget.close()
  14.         #    childWidget.destroy(True, True)
  15.         for i in range(self.right_layout.count()):
  16.             tempwidget = self.right_layout.itemAt(0).widget()
  17.             #self.right_layout.itemAt(0).widget().close()
  18.             self.right_layout.removeWidget(tempwidget)
  19.             tempwidget.close()
  20.             tempwidget.destroy(True, True)
  21.         #self.main_layout.removeWidget(self.right_widget)
  22.         #resultUpdateSemaphore.release()
  23.         currentItemList = self.project['itemList'][self.project['defaultChipId']][self.project['defaultMode'][self.project['defaultChipId']]]['item']
  24.         self.currentItemID = self.itemTab.index(itemname)
  25.         resultLabel = QLabel(itemname)
  26.         self.right_layout.addWidget(resultLabel)
  27.         currentItemName = currentItemList[self.currentItemID]['name']
  28.         currentItemThreshold = currentItemList[self.currentItemID]['threshold']
  29.         print(currentItemName)
  30.         print('新建右边窗口')
  31.         #resultUpdateSemaphore.acquire()
  32.         if const['itemList'][currentItemName]['type'] == 'value':
  33.             if 'resultTab' in currentItemList[self.currentItemID]:
  34.                 self.resultTab = currentItemList[self.currentItemID]['resultTab']
  35.             if 'checkTab' in currentItemList[self.currentItemID]:
  36.                 self.checkTab = currentItemList[self.currentItemID]['checkTab']
  37.             self.TableWidget = QTableWidget()
  38.             self.TableWidget.setStyleSheet("background-color: rgb(255,255, 255)")
  39.             resultTableVHeader = []
  40.             self.TableWidget.setRowCount(len(const['itemList'][currentItemName]['resultSection']))
  41.             for resultSection in const['itemList'][currentItemName]['resultSection']:
  42.                 resultTableVHeader.append(resultSection['display'][self.language])
  43.             if currentItemThreshold:
  44.                 self.TableWidget.setColumnCount(5)
  45.             else:
  46.                 self.TableWidget.setColumnCount(2)
  47.             self.TableWidget.setHorizontalHeaderLabels(self.notice['resultTableHHeader'][self.language])
  48.             self.TableWidget.setVerticalHeaderLabels(resultTableVHeader)
  49.             self.TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
  50.             self.TableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
  51.             
  52.             self.TableWidget.clearContents()
  53.             self.valueInit(self.TableWidget)
  54.             self.right_layout.addWidget(self.TableWidget)

  55.         elif const['itemList'][currentItemName]['type'] == 'curve':
  56.             if 'resultTab' in currentItemList[self.currentItemID]:
  57.                 self.resultTab = currentItemList[self.currentItemID]['resultTab']
  58.             if 'checkTab' in currentItemList[self.currentItemID]:
  59.                 self.checkTab = currentItemList[self.currentItemID]['checkTab']
  60.             logButton = QPushButton()
  61.             logButton.setText(self.notice['logaxis'][self.language])
  62.             LinearButton = QPushButton()
  63.             LinearButton.setText(self.notice['linearaxis'][self.language])
  64.             self.checkLabel = QLabel()
  65.             #self.checkLabel.setText('xxx')
  66.             #self.checkLabel.setStyleSheet("font:24pt '楷体';color: rgb(255, 0, 0)")
  67.             self.fig = plt.Figure()
  68.             self.canvas = FC(self.fig)
  69.             self.canvas.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
  70.             self.canvas.updateGeometry()
  71.             if const['itemList'][currentItemName]['method'] == 'FR':
  72.                 ylabel = 'dBFS'
  73.             elif const['itemList'][currentItemName]['method'] == 'THD':
  74.                 ylabel = '%'
  75.             elif const['itemList'][currentItemName]['method'] == 'SPL':
  76.                 ylabel = 'dBSPL'
  77.             self.curveInit(self.fig, self.canvas, ylabel)
  78.             LinearButton.clicked.connect(self.slot_btn_start)
  79.             logButton.clicked.connect(self.slot_btn_start1)
  80.             buttonWidget = QWidget()
  81.             buttonLayout = QHBoxLayout()
  82.             buttonWidget.setLayout(buttonLayout)
  83.             buttonLayout.addWidget(logButton)
  84.             buttonLayout.addWidget(LinearButton)
  85.             labelWidget = QWidget()
  86.             labelWidget.setStyleSheet("background-color: rgb(255, 255, 255)")
  87.             labelLayout = QHBoxLayout()
  88.             labelWidget.setLayout(labelLayout)
  89.             labelLayout.addStretch(1)
  90.             labelLayout.addWidget(self.checkLabel)
  91.             labelLayout.addStretch(1)
  92.             self.right_layout.addWidget(self.canvas)
  93.             self.right_layout.addWidget(labelWidget)
  94.             self.right_layout.addWidget(buttonWidget)
  95.             self.right_layout.setSpacing(0)
  96.         elif const['itemList'][currentItemName]['type'] == 'waveform':
  97.             if 'resultTab' in currentItemList[self.currentItemID]:
  98.                 self.resultTab = currentItemList[self.currentItemID]['resultTab']
  99.             if 'checkTab' in currentItemList[self.currentItemID]:
  100.                 self.checkTab = currentItemList[self.currentItemID]['checkTab']
  101.             self.TableWidget = QTableWidget()
  102.             self.TableWidget.setMaximumHeight(150)
  103.             self.TableWidget.setStyleSheet("background-color: rgb(255,255, 255)")
  104.             resultTableVHeader = []
  105.             tablerowCount = 0
  106.             for resultSection in const['itemList'][currentItemName]['resultSection']:
  107.                 if resultSection['type'] == 'sample' or resultSection['type'] == 'value':
  108.                     tablerowCount = tablerowCount +1
  109.                     resultTableVHeader.append(resultSection['display'][self.language])
  110.             self.TableWidget.setRowCount(tablerowCount)
  111.             if currentItemThreshold:
  112.                 self.TableWidget.setColumnCount(5)
  113.             else:
  114.                 self.TableWidget.setColumnCount(2)
  115.             self.TableWidget.setHorizontalHeaderLabels(self.notice['resultTableHHeader'][self.language])
  116.             self.TableWidget.setVerticalHeaderLabels(resultTableVHeader)
  117.             self.TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
  118.             self.TableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
  119.             self.TableWidget.clearContents()
  120.             self.valueInit(self.TableWidget)
  121.             self.right_layout.addWidget(self.TableWidget)

  122.             buttonWidget = QWidget()
  123.             buttonWidget.setStyleSheet("background-color: rgb(255, 255, 255)")
  124.             buttonLayout = QHBoxLayout()
  125.             buttonWidget.setLayout(buttonLayout)
  126.             for resultSection in const['itemList'][currentItemName]['resultSection']:
  127.                 if resultSection['type'] == 'curve':
  128.                     waveformButton = PPathButton(self, resultSection['display'][self.language])
  129.                     waveformButton.click.connect(self.wave_btn_start)
  130.                     buttonLayout.addWidget(waveformButton)
  131.             plt.ylim(-40000, 40000)
  132.             plt.xlim(0,30)
  133.             self.fig = plt.Figure()
  134.             self.canvas = FC(self.fig)
  135.             self.canvas.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
  136.             self.canvas.updateGeometry()
  137.             for resultSection in const['itemList'][currentItemName]['resultSection']:
  138.                 if resultSection['type'] == 'curve':
  139.                     self.waveformInit(self.fig, self.canvas, resultSection)
  140.                     break
  141.             self.right_layout.addWidget(self.canvas)
  142.             self.right_layout.addWidget(buttonWidget)
  143.         self.main_layout.addWidget(self.right_widget)
  144.         #time.sleep(1)
  145.         resultUpdateSemaphore.release()
  146.         print('锁释放\n')
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-23 10:56:35 | 显示全部楼层
手动高亮……不累吗?
而且请用代码格式发布……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-23 11:14:58 | 显示全部楼层
我快瞎了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 09:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表