いわて駐在研究日誌

OpenCAE、電子工作、R/C等、徒然なるままに

PyQtでGUIアプリ (4)

昨日の続きです。
pythonでバイトオーダーマーク(BOM)付きのUTF-8ファイルを読むときは、utf-8ではなくutf-8-sigをcodec.open()で指定してやればOK。挙動が不審で悩んだ〜。


QTabWidgetのなかに、レイアウトを作成する。
Widgetをつくっておいて、そこにレイアウトを入れるところがポイント。
直接レイアウトできれば楽なんだが...。
今のところQTabLayoutというものは無さそう。

#  Tab4.py (coding UTF8)
#  refs.:  http://d.hatena.ne.jp/t2y-1979/20100917/1284652234
#       http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qtabbar.html
#
# -*- coding: utf-8 -*-
import sys, os, codecs
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MainWindow(QMainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.setWindowTitle("Main Window")
        #self.resize(800, 600)
        #self.setMinimumSize(800, 600)


        # Setup Actions
        ## openFile Action
        openFile = QAction(QIcon('open.png'), 'Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Open File')
        self.connect(openFile, SIGNAL('triggered()'), self.showOpenDialog)
        ## saveFile Action
        saveFile = QAction(QIcon('save.png'), 'Save', self)
        saveFile.setShortcut('Ctrl+S')
        saveFile.setStatusTip('Save File')
        self.connect(saveFile, SIGNAL('triggered()'), self.showSaveDialog)
        ## Quit Action
        Quit = QAction(QIcon('quit.png'), 'Quit', self)
        Quit.setShortcut('Ctrl+Q')
        Quit.setStatusTip('Quit this program')
        self.connect(Quit, SIGNAL('triggered()'), self.QuitDialog)

        # 1.set Menu Bar
        self.file_menu = self.menuBar().addMenu("&File")
        ## Add  Actions to Menu Bar
        self.file_menu.addAction(openFile)
        self.file_menu.addAction(saveFile)
        self.file_menu.addAction(Quit)

        # 2.set Tool Bar
        self.file_tool = self.addToolBar("ToolBar")
        self.file_tool.addAction(openFile)
        self.file_tool.addAction(saveFile)
        self.file_tool.addAction(Quit)

        # 3.set Status Bar
        self.status_bar = QStatusBar(self)
        self.status_bar.showMessage("Ready", 5000)
        self.setStatusBar(self.status_bar)

        # Tab Widget Setup
        self.tab_widget = QTabWidget(self)
        self.setCentralWidget(self.tab_widget) #QMainWindowのセントラルウィジェットをQTabWidgetとする
        self.tab_widget.setTabPosition(QTabWidget.South)
        tab1widget = QWidget()
        tab2widget = QWidget()
        tab3widget = QWidget()
        self.tab_widget.addTab(tab1widget, "Tab 1")
        self.tab_widget.addTab(tab2widget, "Tab 2")
        self.tab_widget.addTab(tab3widget, "Tab 3")

        # 各TabのWidgetにlayout(とりあえず1個目だけ....)
        hbox1 = QHBoxLayout()
        hbox1.addWidget(QLabel("test1"))
        hbox1.addWidget(QLineEdit())
        hbox2 = QHBoxLayout()
        hbox2.addWidget(QLabel("test2"))
        hbox2.addWidget(QLineEdit())

        vbox = QVBoxLayout()
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)
        vbox.addStretch(1)
        tab1widget.setLayout(vbox)

    def showOpenDialog(self):

        filename = QFileDialog.getOpenFileName(self, 'Open file', '')
        from os.path import isfile
        if isfile(filename):
            fname = codecs.open(filename,'r','utf-8') #UTF-8のファイルを読み込み
            data = fname.read()

            self.tab1.setText(data) ###

            self.setWindowTitle("Main Window: %s" % os.path.abspath(filename))

    def showSaveDialog(self):

        savename = QFileDialog.getSaveFileName(self, 'Save file', '')
        fname = codecs.open(savename, 'w', 'utf-8') #UTF-8のファイルに書き込み

        fname.write(self.tab1.toPlainText()) ###

    def QuitDialog(self):

        reply = QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QMessageBox.Yes |
                  QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            quit()
        else:
            return

# QMainWindowを使った表示

def main():

    app = QApplication(sys.argv)
    mainwindow = MainWindow()
    mainwindow.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()