2015-02-08 9 views
1

Im ищет способ свести к минимуму перерисовывание «мерцания» на моем приложении pyQt.pyQt QWidget 'flicker' on resize and redraw

Мое приложение - это QMainWindow, содержащий два объекта, созданных QDockWidget (и обычный ассортимент меню инструментов и статусных баров). Один из QDockWidgets * использует QGridLayout для организации ряда окон, построенных на основе QGLWidget, в каждом элементе grid.

Когда я изменяю размер MainWindow, вся компоновка правильно изменяется. Тем не менее, в пространстве между QGLWidgets я вижу, что выглядит частично частично визуализированным странным видом некоторой части MainWindow 'flick' в поле зрения в течение секунды секунды, а затем визуализируется правильно. Мое приложение обычно окрашено в темные стили, но мерцание между QGLWidgets обычно просто белое и черное. Чем быстрее я перетаскиваю границы Mainwindow, тем сильнее это мерцание. И позвольте мне подчеркнуть, «мерцание» находится только на заднем плане и между объектами QGLWidget, все остальное кажется прекрасным.

Мерцание есть ли у меня что-либо, окрашенное в QGLWidgets, или нет, поэтому на рендеринг нет большой нагрузки.

Есть ли что-то, что я могу сделать, чтобы устранить это мерцание при перерисовке (и изменении размера) событий?

Я пробовал раскрашивать все виджеты темного темного цвета, играя с .hide() и .show() на некоторых виджетах, но они просто замедляют процесс и делают его хуже.

  • ПРИМЕЧАНИЕ Я обнаружил, что положить фиктивный QWidget в QDockWidget как QDockWidget не будет принимать (я предполагаю, что он не поддерживает) раскладки. Может быть, это как-то связано с этим.

Это с PyQt 4.10.1 для питона 2.7 работает на Windows 7. У меня есть около опыта месяцев с PyQt

+0

Звуки очень похожи на [QTBUG-17869] (https://bugreports.qt.io/browse/QTBUG-17869) и [QTBUG-38327] (https://bugreports.qt.io/browse/QTBUG-38327). – ekhumoro

+0

Я просмотрел эти сообщения об ошибках, спасибо, выглядит как та же ошибка, что и моя, и связана с QGLWidget. Очень неприятно! Создается впечатление, что ошибка исправлена ​​в pyQt5 и рекомендуется использовать QOpenGLWidget. Я не слишком хочу переходить на Qt5, но в моем коде используются сигналы старого стиля и слоты для одного, пока я не знаю, что это действительно исправлено - кто-нибудь знает наверняка? – thefog

+1

Вам не нужно переносить все ваше приложение на PyQt5, чтобы проверить его. Просто создайте минимальный, самодостаточный примерный сценарий, который воспроизводит проблему в PyQt4, а затем преобразует ее в PyQt5. Если вы не знаете, как его портировать, или не можете установить PyQt5 по какой-либо причине, разместите здесь сценарий примера, и я или кто-то другой проведут необходимое тестирование. – ekhumoro

ответ

1

SO, следуя вышеуказанные советы, фликкер НЕ уходить, когда вы переезжаете в PyQt5 и Python34 и использовать новый QtWidgets.QOpenGLWidget. Вы можете запустить приведенный ниже код, используя новый виджет, и мерцание исчезло, но со старыми QGLWidget (#### lines) фоновые обновления очень раздражают во время изменения размера.

from PyQt5 import QtCore, QtGui, QtWidgets, QtOpenGL 

class ImageGLView (QtWidgets.QOpenGLWidget): 
####class ImageGLView (QtOpenGL.QGLWidget): 

    def __init__(self, parent = None): 
     print ("ImageGLView.__init__") 

     QtWidgets.QOpenGLWidget.__init__(self, parent) 
     ####QtOpenGL.QGLWidget.__init__(self, QtOpenGL.QGLFormat(QtOpenGL.QGL.SampleBuffers), parent) 

     self.setStyleSheet("QtOpenGL.QGLWidget {border-style: None; background-color: #404040; color:#FFFFFF }") 
     self.setToolTip ("Image View") 


class TopWindow(QtWidgets.QMainWindow): 
    def __init__ (self, parent = None): 
     super(TopWindow, self).__init__(parent) 

     self.initUI() 
     self.initStyle() 

    def initUI (self): 
     self.setGeometry (0, 0, 800, 600) 
     self.setWindowTitle ('Test pyQt5') 
     self.setWindowIcon (QtGui.QIcon('images\Curlyhoward.jpg')) 
     self.setStyleSheet("QWidget {background-color: #404040; color:#FFFFFF }") 
     self.populateFrames() 


    def initStyle(self): 
     palette = self.palette() 
     palette.setColor(self.backgroundRole(), QtGui.QColor(64,64,64)) 
     self.setToolTip("Liver Fat Fraction") 
     self.setPalette(palette) 

     self.setDockOptions(QtWidgets.QMainWindow.AnimatedDocks | QtWidgets.QMainWindow.AllowNestedDocks) 


    def populateFrames(self):  
     self.controlsPane = QtWidgets.QDockWidget() 
     self.controlsPane.setFeatures(QtWidgets.QDockWidget.DockWidgetFloatable | QtWidgets.QDockWidget.DockWidgetMovable) 
     self.controlsPane.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 
     self.controlsPane.setStyleSheet("QWidget {background-color: #404040; color:#FFFFFF }")   
     self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.controlsPane)  

     self.imageDisplayPane = QtWidgets.QDockWidget() 
     self.imageDisplayPane.setFeatures(QtWidgets.QDockWidget.DockWidgetFloatable | QtWidgets.QDockWidget.DockWidgetMovable) 
     self.imageDisplayPane.setAllowedAreas(QtCore.Qt.RightDockWidgetArea | QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.TopDockWidgetArea | QtCore.Qt.BottomDockWidgetArea) 
     self.imageDisplayPane.setStyleSheet("QWidget {background-color: #FAFAFA; color:#0f0f0f }")   

     numCols = 2 
     numRows = 2 

     self.imageDisplayPane.gridLayout = QtWidgets.QGridLayout()  

      #### ...seems like a QDockWidget needs to have a single widget in which it can then accept the layout... 
      self.imageDisplayPane.paneContent = QtWidgets.QWidget() 
      self.imageDisplayPane.paneContent.setStyleSheet("QWidget {background-color: #404040; color:#FFFFFF }") 
      self.imageDisplayPane.setWidget(self.imageDisplayPane.paneContent)    
      self.imageDisplayPane.paneContent.setLayout(self.imageDisplayPane.gridLayout)                     

      for row in range (numRows): 
       for col in range (numCols):     
        view = ImageGLView(self) 
        self.imageDisplayPane.gridLayout.addWidget (view, row, col)       
      self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.imageDisplayPane)  


def main(): 
    app = QtWidgets.QApplication(sys.argv) 
    app.setStyle ("windows ") 

    mainWindow = TopWindow() 
    mainWindow.show() 

    mainWindow.raise_() 
    app.exec_() 


if __name__ == '__main__': 
    main() 
+0

BTW, установка и настройка PyQt5 на eclipse была не такой простой, как более старый python 2.7/pyQt4. – thefog

+0

Рад, что вы следили за этим и добились определенного прогресса.Я просто подумал, что добавлю, что AFAIK, все равно можно построить PyQt5 для Python2. Несмотря на это, как я указал в [этом ответе] (http://stackoverflow.com/a/22802900/984421), это, вероятно, не является жизнеспособным долгосрочным вариантом. – ekhumoro