1

基本的に私が欲しいのは:

  1. QFileDialog を開くボタンを含むメイン ウィンドウにウィジェットを表示します。
  2. ファイルが選択されると、ボタンを含むウィジェットが、ファイルの内容に基づく視覚化を表示する新しいウィジェットに切り替えられる必要があります。

以下のコード例では、これはopen_file()メソッドからメソッドを呼び出すことを意味しshowFileSelectionDialog()ます。

問題は、これを行う方法ですか?ウィジェットを初期化するときに親を引数として取り、ボタンをself.parent.open_fileに接続しようとしました。しかし、これは複雑になり、ウィジェットがメイン ウィンドウの子になるようにハードコードされているのが好きではありません。

私が理解している限り、より良いアプローチはCommunicate()、イベントを発行するために使用することです。しかし、ファイル名情報をメソッドに取得する方法がわかりませんopen_file()

#Code greatly inspired by the ZetCode PySide tutorial (http://zetcode.com/gui/pysidetutorial/)

import sys
from PySide import QtGui

class MainApplicationWindow(QtGui.QMainWindow):

    def __init__(self):
        super(MainApplicationWindow, self).__init__()

        self.initUI()

    def initUI(self):

        self.setWindowTitle('<Application title>')
        self.setCentralWidget(FileSelectWidget())
        self.statusBar()

        self.resize(250, 200)
        self.center()
        self.show()

    def center(self):
        qr = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def open_file(self, file_name):
        f = open(file_name, 'r')
        with f:
            data = f.read()
            #TODO: Do something with the data and visualize it!
            print data

class FileSelectWidget(QtGui.QWidget):

    def __init__(self):
        super(FileSelectWidget, self).__init__()

        self.initUI()

    def initUI(self):

        selectLogFilesButton = QtGui.QPushButton('Select log files', self)
        selectLogFilesButton.clicked.connect(self.showFileSelectionDialog)

        hbox = QtGui.QHBoxLayout()
        hbox.addStretch()
        hbox.addWidget(selectLogFilesButton)
        hbox.addStretch()

        vbox = QtGui.QVBoxLayout()
        vbox.addStretch()
        vbox.addLayout(hbox)
        vbox.addStretch()

        self.setLayout(vbox)

    def showFileSelectionDialog(self):

        file_name, _ = QtGui.QFileDialog.getOpenFileName(self, 'Open file', '/home')


def main():

    app = QtGui.QApplication(sys.argv)
    window = MainApplicationWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
4

1 に答える 1

2

クラスは、スロットFileSelectWidgetに接続できるカスタム シグナルを定義する必要があります。open_file

これを行うには、QtCore モジュールがインポートされていることを確認してから、次のようにカスタム シグナルを定義します。

class FileSelectWidget(QtGui.QWidget):
    fileSelected = QtCore.Signal(object)

次に、ファイルが選択されるたびに信号を送信します。

    def showFileSelectionDialog(self):
        file_name, _ = QtGui.QFileDialog.getOpenFileName(
                           self, 'Open file', '/home')
        if file_name:
            self.fileSelected.emit(file_name)

最後に、信号をスロットに接続します。

    widget = FileSelectWidget()
    widget.fileSelected.connect(self.open_file)
    self.setCentralWidget(widget)
于 2013-11-12T19:08:41.883 に答える