いいかげん日記

思いついたことをただひたすら書き殴るいいかげんな日記です。

【Python × PyQt5】 google spreadsheet viewerを作る。(その2:PyQt4のサンプルコードをPyQt5のコードに書き換える)

【はじめに】

今回からコードを載せつつ私がはまった箇所とその解決策、そして作品の変遷を追っていきます。(前回の記事はこちら

【これまでの経緯】

PyQtでラーメンタイマーを作るスライドに触発され、「私にも『っぽい』アプリケーションができるのでは?」という希望が生まれ開発を始めました。 初期の方針は、「外部からデータを取り込み、テーブルに表示する何かを作ろう」というもの。 先のスライドに倣って、紙とペンでレイアウトを予め設計しておこうとしたが面倒くさくなって途中で止めました。

「なにはともあれ、コードを書き始めよう」ということで、後先考えずにやってみることにしました。

【問題】

PyQt5は、最近公開されたバージョンのようで、検索でヒットするサンプルコードの件数が比較的少ないです。

検索でヒットすることが多いのはPyQt4のコードなんですが、最初、このPyQt4とPyQt5ではインポートするモジュールのレベルで違いがある、ということに気づきませんでした。

PyQt5やQt5のドキュメントはよくわからんし、Pythonのhelp()で見てもよくわからん。

本もあまり出てないみたい...

【対策】

たいていは以下のモジュールをインポートしておけばPyQt4のサンプルコードも動くことが多いようです。

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

私が検索するメソッドは、だいたいこの3つのモジュールに入ってました。

この形式でインポートすると、メソッドを呼び出すときにメソッド名からで良いので楽ですし、PyQt4とPyQt5でメソッドが入っているクラス名が違っていてもそれを意識することなく使えます。

この方法を知ってから、PyQt5の調べ物が格段に捗るようになりました。

【コード】

初期のコードはこんな感じ。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class SpreadSheetWidget(QWidget):
    def __init__(self, row, col, parent=None):
        QWidget.__init__(self, parent=parent)
        self.setup_ui(row, col)

    def setup_ui(self, row, col):
        self.spreadsheet = QTableWidget(row, col)
        
        layout = QVBoxLayout()
        layout.addWidget(self.spreadsheet)

        self.setLayout(layout)

def main():
    app = QApplication(sys.argv)

    main_window = QMainWindow()
    panel = QWidget()
    layout = QVBoxLayout()
    spreadsheet_widget = SpreadSheetWidget(3,4,parent=panel)

    layout.addWidget(spreadsheet_widget)

    panel.setLayout(layout)
    main_window.setCentralWidget(panel)

    main_window.show()
    app.exec_()

if __name__ == '__main__':
    main()

【外観】

実行するとこんなウィンドウが出ます。 f:id:theta_proto:20180827054737j:plain 何を作るか、はっきりしていませんでしたが、とりあえずテーブルを作ってみた、って感じ。