PyQt - QObject 未定义

0 投票
1 回答
1194 浏览
提问于 2025-04-18 00:09

我正在用 HTML/CSS/JavaScript 和 Python(使用 PyQt4)创建一个简单的媒体和元数据应用。我想用 phonon 做一个视频播放器,但我对 PyQt4 没有任何经验。这是我的代码:

#!/usr/bin/env python
import sys
from PyQt4 import QtCore, QtGui, uic, phonon

class videoPlayer(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        ui = uic.loadUi("video.ui")
        media = phonon.Phonon.MediaObject()
        playQuery = False
        ui..ppButton.clicked.connect(self.playPause)

    def playVideo():            
        media.play()    

    def pauseVideo():    
        media.pause()

    def playPause():
        if playQuery:
            pauseVideo()
        else:
            playVideo()

    def changeVideoSource(target):
        media.setCurrentSource(phonon.Phonon.MediaSource(target))

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    videoPlayer = videoPlayer()
    videoPlayer.show()
    app.exec_()

我现在很迷茫,如果有人能告诉我我哪里做错了,我会非常感激。

编辑:我把 UiType 改成了 Ui。虽然改了,但我还是遇到一个我不理解的错误,因为 video.ui 里有一个叫 ppButton 的按钮。

编辑 2:窗口能显示出来了,但里面是空的。它应该包含一个视频播放器和一些按钮。

1 个回答

1

首先,你需要使用 pyuic4 工具来生成你的 video.ui 的 Python 代码。

pyuic4 -x video.ui -o video.py

上面的命令会生成一个叫做 video.py 的模块,这个模块里面会包含一个类,名字是你在 UI 里起的名字,前面会加上 "UI_"。

然后你可以像这样修改你的代码:

import sys
from PyQt4 import QtCore, QtGui, uic, phonon
from video import UI_MyVideoWindow     # Lets call it MyVideoWindow for the example.

class videoPlayer(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.ui = UI_MyVideoWindow()
        self.ui.setUp(self)       # Now you can access you widgets from self.ui
                                  # Example: self.ui.ppButton

        media = phonon.Phonon.MediaObject(self)   # this object needs a parent.
        playQuery = False


    def playVideo():            
        media.play()    

    def pauseVideo():    
        media.pause()


    def on_ppButton_clicked():
        """
        When you generate code using QtDesigner, connections are made automagically ;)
        Just write your slots following the below format:

        on_<widget_name>_<signal_name>
        """

        if playQuery:
            pauseVideo()
        else:
            playVideo()

    def changeVideoSource(target):
        media.setCurrentSource(phonon.Phonon.MediaSource(target))

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    videoPlayer = videoPlayer()
    videoPlayer.show()
    app.exec_()

这个方法唯一的问题是,每次你修改 video.ui 后,都需要更新一下 video.py 模块。不过这非常简单,只需要再运行一次这个命令:

pyuic4 -x video.ui -o video.py

就像你之前看到的那样。

撰写回答