我们有一个PyQt4 / PySide Qt4视频播放器应用程序,它在GUI中有一个QToolButton对象,带有一个相关的QMenu,添加了QToolButton#setMenu()。目前,当用户与菜单交互时,它接管事件循环并停止视频播放。事件循环接管发生在私有QToolButtonPrivate :: popupTimerDone()中。
我们想重写/修改QToolButton不是无模式的,但似乎没有任何简单的选择:
还有其他想法吗?
答案 0 :(得分:1)
我建议在QMenu.popup方法和setMenu中使用QToolButton.clicked信号 - 这可能会破坏模态。
我尝试为你设置一个例子 - 但它并没有阻止QMovie ......所以也许你可以用这个例子来测试视频播放器与Qmovie的不同选项,看看它是否仍会阻止你事件循环:
from PyQt4 import QtGui, QtCore
MOVIE_FILE = '/path/to/ajax_loader.gif'
class MyDialog(QtGui.QDialog):
def __init__( self, parent = None ):
super(MyDialog, self).__init__(parent)
self._menu = QtGui.QMenu(self)
self._menu.addAction('Action A')
self._menu.addAction('Action B')
self._menuButton = QtGui.QToolButton(self)
self._modalButton = QtGui.QToolButton(self)
self._nonModalButton = QtGui.QToolButton(self)
self._feedbackLabel = QtGui.QLabel(self)
self._startTime = QtCore.QDateTime.currentDateTime()
self._menuButton.setPopupMode(self._menuButton.InstantPopup)
movie = QtGui.QMovie(self)
movie.setFileName(MOVIE_FILE)
movie.start()
self._feedbackLabel.setMovie(movie)
hlayout = QtGui.QHBoxLayout()
hlayout.addWidget(self._menuButton)
hlayout.addWidget(self._modalButton)
hlayout.addWidget(self._nonModalButton)
hlayout.addStretch()
vlayout = QtGui.QVBoxLayout()
vlayout.addLayout(hlayout)
vlayout.addWidget(self._feedbackLabel)
self.setLayout(vlayout)
self.adjustSize()
# setup different menu examples
self._menuButton.setMenu(self._menu)
self._modalButton.clicked.connect(self.showModalMenu)
self._nonModalButton.clicked.connect(self.showNonModalMenu)
self._menu.triggered.connect(self.showAction)
def showModalMenu( self ):
point = self._modalButton.rect().bottomLeft()
global_point = self._modalButton.mapToGlobal(point)
self._menu.exec_(global_point)
def showNonModalMenu( self ):
point = self._nonModalButton.rect().bottomLeft()
global_point = self._nonModalButton.mapToGlobal(point)
self._menu.popup(global_point)
def showAction( self, action ):
print action.text()
if ( __name__ == '__main__' ):
app = QtGui.QApplication([])
dlg = MyDialog()
dlg.show()
app.exec_()