鱼C论坛

 找回密码
 立即注册
查看: 848|回复: 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擦除后重建的函数。
    def onClicked(self,qmodeLindex):
        self.tree.blockSignals(True)
        item=self.tree.currentItem()
        if self.notice['selectAll'][self.language] == item.text(0):
            print('不做任何操作')
            self.tree.setCurrentItem(self.lastItem)
        else:
            #onClickSemaphore.acquire()
            print('click状态为')
            print(self.onClickStatus)
            if self.onClickStatus:
                time.sleep(0.1)
                self.lastItem = item
                print('点击调用')
                itemname = item.text(0)
                self.resultUpdateShow(itemname)
                ##onClickSemaphore.release()
                currentModeName = self.project['itemList'][self.project['defaultChipId']][self.project['defaultMode'][self.project['defaultChipId']]]['name']
                currentItemList = self.project['itemList'][self.project['defaultChipId']][self.project['defaultMode'][self.project['defaultChipId']]]['item']
                print('点击项目名称后,当前的项目列表的长度为')
                print(len(self.itemList))
                print('当前项目名称为')
                print(self.project['name'])
                if currentModeName == 'VR' or currentModeName == 'SP':
                    if self.itemList[len(self.itemList) - 1].checkState(0) == 2:
                        micLPESQID = self.itemNameTab.index('micLoutQualityL')
                        micRPESQID = self.itemNameTab.index('micLoutQualityR')
                        micLLevelID = self.itemNameTab.index('micLoutLevelL')
                        micRLevelID = self.itemNameTab.index('micLoutLevelR')
                        noiseLID = self.itemNameTab.index('noiseFloorL')
                        noiseRID = self.itemNameTab.index('noiseFloorR')
                        self.itemList[micLPESQID].setCheckState(0,Qt.Checked)
                        self.itemList[micRPESQID].setCheckState(0,Qt.Checked)
                        self.itemList[micLLevelID].setCheckState(0,Qt.Checked)
                        self.itemList[micRLevelID].setCheckState(0,Qt.Checked)
                        self.itemList[noiseLID].setCheckState(0,Qt.Checked)
                        self.itemList[noiseRID].setCheckState(0,Qt.Checked)
                for i in range(len(self.itemList)):
                    currentItemList[i]['select'] = self.itemList[i].checkState(0)
                print('Key=%s'%(item.text(0)))
                saveProjectParam(self.project)
            else:
                print('-----------------不动不动-------------------')
                self.tree.setCurrentItem(self.lastItem)
        self.tree.blockSignals(False)

下面是self.resultUpdateShow(itemname)函数实体内容。
    def resultUpdateShow(self, itemname):
        print('\n所申请')
        resultUpdateSemaphore.acquire()
        self.gl = globalGet()
        self.language = self.gl['language']
        self.projectList = self.gl['project']
        Flag, self.project = getProjectParam(self.projectList['list'][self.projectList['default']])
        self.resultTab = {}
        self.checkTab = {}
        print('清除右边窗口')
        #for childWidget in self.right_widget.children():
        #    self.right_widget.removeItem(childWidget)
        #    childWidget.close()
        #    childWidget.destroy(True, True)
        for i in range(self.right_layout.count()):
            tempwidget = self.right_layout.itemAt(0).widget()
            #self.right_layout.itemAt(0).widget().close()
            self.right_layout.removeWidget(tempwidget)
            tempwidget.close()
            tempwidget.destroy(True, True)
        #self.main_layout.removeWidget(self.right_widget)
        #resultUpdateSemaphore.release()
        currentItemList = self.project['itemList'][self.project['defaultChipId']][self.project['defaultMode'][self.project['defaultChipId']]]['item']
        self.currentItemID = self.itemTab.index(itemname)
        resultLabel = QLabel(itemname)
        self.right_layout.addWidget(resultLabel)
        currentItemName = currentItemList[self.currentItemID]['name']
        currentItemThreshold = currentItemList[self.currentItemID]['threshold']
        print(currentItemName)
        print('新建右边窗口')
        #resultUpdateSemaphore.acquire()
        if const['itemList'][currentItemName]['type'] == 'value':
            if 'resultTab' in currentItemList[self.currentItemID]:
                self.resultTab = currentItemList[self.currentItemID]['resultTab']
            if 'checkTab' in currentItemList[self.currentItemID]:
                self.checkTab = currentItemList[self.currentItemID]['checkTab'] 
            self.TableWidget = QTableWidget()
            self.TableWidget.setStyleSheet("background-color: rgb(255,255, 255)")
            resultTableVHeader = []
            self.TableWidget.setRowCount(len(const['itemList'][currentItemName]['resultSection']))
            for resultSection in const['itemList'][currentItemName]['resultSection']:
                resultTableVHeader.append(resultSection['display'][self.language])
            if currentItemThreshold:
                self.TableWidget.setColumnCount(5)
            else:
                self.TableWidget.setColumnCount(2)
            self.TableWidget.setHorizontalHeaderLabels(self.notice['resultTableHHeader'][self.language])
            self.TableWidget.setVerticalHeaderLabels(resultTableVHeader)
            self.TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
            self.TableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
            
            self.TableWidget.clearContents()
            self.valueInit(self.TableWidget)
            self.right_layout.addWidget(self.TableWidget)

        elif const['itemList'][currentItemName]['type'] == 'curve':
            if 'resultTab' in currentItemList[self.currentItemID]:
                self.resultTab = currentItemList[self.currentItemID]['resultTab']
            if 'checkTab' in currentItemList[self.currentItemID]:
                self.checkTab = currentItemList[self.currentItemID]['checkTab'] 
            logButton = QPushButton()
            logButton.setText(self.notice['logaxis'][self.language])
            LinearButton = QPushButton()
            LinearButton.setText(self.notice['linearaxis'][self.language])
            self.checkLabel = QLabel()
            #self.checkLabel.setText('xxx')
            #self.checkLabel.setStyleSheet("font:24pt '楷体';color: rgb(255, 0, 0)")
            self.fig = plt.Figure()
            self.canvas = FC(self.fig)
            self.canvas.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
            self.canvas.updateGeometry()
            if const['itemList'][currentItemName]['method'] == 'FR':
                ylabel = 'dBFS'
            elif const['itemList'][currentItemName]['method'] == 'THD':
                ylabel = '%'
            elif const['itemList'][currentItemName]['method'] == 'SPL':
                ylabel = 'dBSPL'
            self.curveInit(self.fig, self.canvas, ylabel)
            LinearButton.clicked.connect(self.slot_btn_start)
            logButton.clicked.connect(self.slot_btn_start1)
            buttonWidget = QWidget()
            buttonLayout = QHBoxLayout()
            buttonWidget.setLayout(buttonLayout)
            buttonLayout.addWidget(logButton)
            buttonLayout.addWidget(LinearButton)
            labelWidget = QWidget()
            labelWidget.setStyleSheet("background-color: rgb(255, 255, 255)")
            labelLayout = QHBoxLayout()
            labelWidget.setLayout(labelLayout)
            labelLayout.addStretch(1)
            labelLayout.addWidget(self.checkLabel)
            labelLayout.addStretch(1)
            self.right_layout.addWidget(self.canvas)
            self.right_layout.addWidget(labelWidget)
            self.right_layout.addWidget(buttonWidget)
            self.right_layout.setSpacing(0)
        elif const['itemList'][currentItemName]['type'] == 'waveform':
            if 'resultTab' in currentItemList[self.currentItemID]:
                self.resultTab = currentItemList[self.currentItemID]['resultTab']
            if 'checkTab' in currentItemList[self.currentItemID]:
                self.checkTab = currentItemList[self.currentItemID]['checkTab']
            self.TableWidget = QTableWidget()
            self.TableWidget.setMaximumHeight(150)
            self.TableWidget.setStyleSheet("background-color: rgb(255,255, 255)")
            resultTableVHeader = []
            tablerowCount = 0
            for resultSection in const['itemList'][currentItemName]['resultSection']:
                if resultSection['type'] == 'sample' or resultSection['type'] == 'value':
                    tablerowCount = tablerowCount +1
                    resultTableVHeader.append(resultSection['display'][self.language])
            self.TableWidget.setRowCount(tablerowCount)
            if currentItemThreshold:
                self.TableWidget.setColumnCount(5)
            else:
                self.TableWidget.setColumnCount(2)
            self.TableWidget.setHorizontalHeaderLabels(self.notice['resultTableHHeader'][self.language])
            self.TableWidget.setVerticalHeaderLabels(resultTableVHeader)
            self.TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
            self.TableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
            self.TableWidget.clearContents()
            self.valueInit(self.TableWidget)
            self.right_layout.addWidget(self.TableWidget)

            buttonWidget = QWidget()
            buttonWidget.setStyleSheet("background-color: rgb(255, 255, 255)")
            buttonLayout = QHBoxLayout()
            buttonWidget.setLayout(buttonLayout)
            for resultSection in const['itemList'][currentItemName]['resultSection']:
                if resultSection['type'] == 'curve':
                    waveformButton = PPathButton(self, resultSection['display'][self.language])
                    waveformButton.click.connect(self.wave_btn_start)
                    buttonLayout.addWidget(waveformButton)
            plt.ylim(-40000, 40000)
            plt.xlim(0,30)
            self.fig = plt.Figure()
            self.canvas = FC(self.fig)
            self.canvas.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
            self.canvas.updateGeometry()
            for resultSection in const['itemList'][currentItemName]['resultSection']:
                if resultSection['type'] == 'curve':
                    self.waveformInit(self.fig, self.canvas, resultSection)
                    break
            self.right_layout.addWidget(self.canvas)
            self.right_layout.addWidget(buttonWidget)
        self.main_layout.addWidget(self.right_widget)
        #time.sleep(1)
        resultUpdateSemaphore.release()
        print('锁释放\n')


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-23 10:56:35 | 显示全部楼层
手动高亮……不累吗?
而且请用代码格式发布……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-23 11:14:58 | 显示全部楼层
我快瞎了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 13:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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