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 の使用

という名前のウィジェットmy_window.uiを作成するui ファイルがあるとします。Designer を使用して、プッシュ ボタンのアクションとカスタム スロットの間のリンクも追加しました(デザイナーでカスタム スロットを作成する方法を知っていますか?)。ui ファイルの使用は、次の 2 つの手順で実行できます。QMainWindowMainWindowclickedabout()

  1. 次のようにして、python と同等のファイルを生成しui_my_window.pyますpyuic4

    $ pyuic4 my_window.ui -o ui_my_window.py
    
  2. 次に、ファイルをインポートする別の python ファイル (main.py) を作成しますui_my_window.pypyuic4 によって生成されたファイルを変更しないでください。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 に答える