【前回までのお話】
退屈なことはPythonやらせようとしていた私は、ある日、偶然PyQtに出会い、「自分で作ったアプリケーションを自分で操作するのも悪くないのではないか?」と考え始める。
そして『っぽい』アプリケーションを作るべく、茨の道を歩むことになった。
ウィンドウを作り、そこにテーブルとボタンを載せ、ボタンに機能をあたえることに成功したことで気を良くした私は、まだ全体像すら定まっていないプログラムに、ショートカットキーを割り当てることにしたのであった。。
【今回の課題】
前回、見事ボタンに機能を与えることに成功して、もう既に『っぽい』アプリケーションにかなり近づいた感覚になっています。
アプリケーションであるならば、やはりユーザビリティには気を遣うべきでしょう。
ユーザビリティ向上のために重要なことは、、、そう!ショートカットキーです!
ということで、今後の開発と検証作業を行うなかで、どうしたって繰り返さざるを得ない「アプリケーションの終了」のショートカットキーを作っていきます。
【コード】
では、早速コードを書いていきます。
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MyMainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        quitShortcut = QShortcut(QKeySequence("Esc"), self)
        quitShortcut.activated.connect(self.close)
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 add_row(self):
        self.row_position = self.spreadsheet.rowCount()
        self.spreadsheet.insertRow(self.row_position)
    def add_col(self):
        self.col_position = self.spreadsheet.columnCount()
        self.spreadsheet.insertColumn(self.col_position)
class AddButtonWidget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent=parent)
        self.setup_ui()
    def setup_ui(self):
        self.add_button_row = QPushButton('Add row', parent=self)
        self.add_button_col = QPushButton('Add col', parent=self)
        layout = QHBoxLayout()
        layout.addWidget(self.add_button_row)
        layout.addWidget(self.add_button_col)
        self.setLayout(layout)
def main():
    app = QApplication(sys.argv)
    main_window = MyMainWindow()
    panel = QWidget()
    layout = QVBoxLayout()
    spreadsheet_widget = SpreadSheetWidget(3,4,parent=panel)
    add_button_widget = AddButtonWidget(parent=panel)
    layout.addWidget(spreadsheet_widget)
    layout.addWidget(add_button_widget)
    panel.setLayout(layout)
    main_window.setCentralWidget(panel)
    add_button_widget.add_button_row.clicked.connect(spreadsheet_widget.add_row)
    add_button_widget.add_button_col.clicked.connect(spreadsheet_widget.add_col)
    main_window.show()
    app.exec_()
if __name__ == '__main__':
    main()
----私なりの説明----
さて、今回は何が変わったかというと、、
class MyMainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        quitShortcut = QShortcut(QKeySequence("Esc"), self)
        quitShortcut.activated.connect(self.close)
あぁ、いきなり変わってますね。
'MyMainWindow' なるクラスが定義されています。
クラスが定義されてるってことは、'main()' 関数でも使われているはずなんだけど、、
main_window = MyMainWindow()
はい、ありますね。
前回の 'main_window' は 'QMainWindow()' のインスタンスだったはずです。
ということを頭に入れてクラスの定義に戻ると、、
class MyMainWindow(QMainWindow):
なるほど。'MyMainWindow' は 'QMainWindow' を継承したクラスなんですね。
で、その次の行は、、
def __init__(self, *args, **kwargs):
んーと、引数に'self' 以外の '*args' と '**kwargs' ってのがいるけど、どなた様?
・・・いや、わからん。
まぁ、いいか。次進もう。
QWidget.__init__(self, *args, **kwargs)
うわっ、ここにもいるよ。。
知らん。次!(あれ?ってか、これ 'QMainWindow' のコンストラクタじゃないじゃん。これは通っちゃうんだ。。ようわからんなぁ…)
        quitShortcut = QShortcut(QKeySequence("Esc"), self)
        quitShortcut.activated.connect(self.close)
さてさて、ようやく本題のショートカットキーの部分に到着。
最初の行で、'QKeySequence("Esc")' と 'self' を引数に持つ 'QShortcut' メソッドのインスタンスに 'quitShortcut' なる名前をつけていますね。
引数から察するに、「 この(self)クラス(つまり、'MyMainWindow' クラス)では、エスケープ(Esc)キーをショートカットキーとして認識しますよ。で、以後、このことを 'quitShortcut' と呼ぶからね!」と言っているのではなかろうか。
次の行では、前回見てたやつがいますね。たぶん、
'quitShortcut' がアクティブになる(= Escキーが押される → 「このキーは… あ!ショートカットキーだ!」となる)ことは、この(self)クラスを閉じる(close)メソッドを呼び出すことにしましょう。
っていうことでしょう、どうせ。(適当)
ということなので、これクラスのインスタンスである 'my_main_window' が 'main()' 関数の中で使われていて、その上にテーブルウィジェットとボタンウィジェットが乗っかっているので、Escキーを押せば画面が消えるはず。
【外観】
このコードを実行するとこんなウィンドウが出ます。

はい、前回と変わりません。
そしてEscキーを押すと、、、
ほら、消えた!    (to be continued...)