1

我正在使用 Ubuntu linux。我使用了 pyuic4 命令并创建了一个 .py 文件,然后向其中添加了一个消息框。这里是:

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(640, 480)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(190, 200, 98, 27))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 25))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.about)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

def about(self):
    QtGui.QMessageBox.about(self, "Test", "This is a test.")

def retranslateUi(self, MainWindow):
    MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
    self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

经过大量试验后,我发现如果我将其更改 class Ui_MainWindow(object): 为: class Ui_MainWindow(QtGui.QMainWindow):

我做了一个大脚本,我不知道它是否会导致任何问题,或者我是否做对了。我只是感到困惑。如果我的写作有任何问题,请帮助并原谅我。这是我的第一篇文章。

4

1 回答 1

1

我不会以同样的方式使用 pyuic4 的结果。事实上,我根本不会使用 pyuic4,但让我们看看可能性:

使用 pyuic4

假设您有一个 ui 文件my_window.ui,在其中创建了一个QMainWindow名为MainWindow. 使用 Designer,您还添加了clicked按钮操作和自定义插槽之间的链接about()(您知道如何在设计器中创建自定义插槽吗?)。现在使用 ui 文件可以分两步完成:

  1. ui_my_window.py您使用以下命令生成 python 等效文件pyuic4

    $ pyuic4 my_window.ui -o ui_my_window.py
    
  2. 然后创建另一个 python 文件 (main.py) 来导入文件ui_my_window.py不要修改 pyuic4 生成的文件!如果您重新运行命令,它将被覆盖pyuic4

    $ cat main.py
    
    from PyQt4 import QtGui
    # import the class created py pyuic4
    from ui_my_window import Ui_MainWindow
    
    class MyMainWindow(QtGui.QMainWindow):
      def __init__(self, parent=None)
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
    
        # Beware that all widgets are now available through the self.ui attribute
        # Getting the push button is written:
        # self.ui.pushButton
    
      def about(self):
        # this is the custom slot created in Designer
        QtGui.QMessageBox.about(self, "Test", "This is a test.")
    
    if __name__ == "__main__":
      import sys
      app = QtGui.QApplication(sys.argv)
      myMainWindow = MyMainWindow()
      myMainWindow.show()
      sys.exit(app.exec_())
    

所以现在你有3个文件:

      $ ls
      main.py ui_my_window.py my_window.ui

只需运行python main.py即可启动 GUI。

不使用 pyuic4

PyQt4 在处理 ui 文件时提供了一个非常有用的模块:uic 模块。其实pyuic4就是利用这个模块来生成ui文件的python文件。使用该模块可以避免 pyuic4 步骤(注意:如果您在资源文件 (.qrc) 中使用图标,您仍然需要使用该pyrcc4工具并在代码中导入生成的文件)。

在您的示例中,代码变得非常简单:

$ cat main.py

import os
from PyQt4 import QtGui
# import the uic module
from PyQt4 import uic

class MyMainWindow(QtGui.QMainWindow):
  def __init__(self, parent=None)
    QtGui.QMainWindow.__init__(self, parent)
    # Load the ui file
    uic.loadUi(os.path.join(os.path.dirname(os.path.abspath(__file__)),"my_window.ui"), self)

    # Now in this case, all widgets can directly be accessed because the last argument
    # of loadUi is self.
    # Getting the push button is written:
    # self.pushButton

  def about(self):
    # this is the custom slot created in Designer
    QtGui.QMessageBox.about(self, "Test", "This is a test.")

if __name__ == "__main__":
  import sys
  app = QtGui.QApplication(sys.argv)
  myMainWindow = MyMainWindow()
  myMainWindow.show()
  sys.exit(app.exec_())

在这种情况下,您只有 2 个文件:

      $ ls
      main.py my_window.ui

再次运行python main.py以启动 GUI。

于 2013-07-22T10:05:12.000 回答