PyQt5 Qt DesignerでGUIをフラットっぽくしてみる

Share on:

Qt Designerを使うとGUIアプリが簡単に作れて便利ですが、ウィジェットを置くだけだと何となくかっこ悪い感じがします。

VS Codeが好きなので、VS codeっぽいデザインをQt DesignerとPyQt5で作ってみました。今回作ったものはテキストエディタっぽいソフトですが、GUIのテストがしたかっただけですのでソフトとしての機能は何もありません。

Qt DesignerでMainWindowを新規作成

GroupBoxとTabを追加して水平に並べる

GroupBoxにTool Buttonを配置して、2つ目と3つ目のTool buttonの間にVertical Spacerを配置

GroupBoxのレイアウトのマージンをすべて0にする

タブ1にText Editを配置してレイアウトを垂直に並べる

タブ1のレイアウトのマージンをすべて0にする

タブ2にTool buttonとVertical Spacerを配置して垂直に並べる

タブ3を追加してLabel、Font combo cox、Spin Boxを配置してGridに並べる

Tool buttonにアイコンを設定するために適当なアイコンをダウンロードしてくる。今回はRemix Iconを使う。使いたいアイコンを選んでSVG形式でダウンロード

ダウンロードしたアイコンをリソースに登録してTool buttonにセットする

すべてのレイアウトのマージンを0にしたらある程度フラットっぽくなります。あとはタブの切り替え部を非表示にして、左のボタンでタブの切り替えが出来るようになればいい感じになりそうです

UI関連のファイルをPythonのコードに変換

.uiと.qrcのファイルを.pyに変換する必要があります。それぞれpyuic5とpyrcc5のコマンドで変換できます。まずはuiファイルを変換

1pyuic5 -o mainwindow.py mainwindow.ui

次にqrcファイルを変換

1pyrcc5 -o resource_rc.py resource.qrc

PythonでQMainwindowを表示

最低限下記のコードでウィンドウが表示されます

 1import sys
 2from mainwindow import Ui_MainWindow
 3from PyQt5 import QtWidgets
 4class MainWindow(QtWidgets.QMainWindow):
 5    def __init__(self):
 6        super().__init__()
 7        self.ui = Ui_MainWindow()
 8        self.ui.setupUi(self)
 9def main():
10    app = QtWidgets.QApplication(sys.argv)
11    window = MainWindow()
12    window.show()
13    app.exec()
14 
15if __name__ == '__main__':
16    main()

実行結果

QTabBarを隠す

QTabWidgetからQTabBarを取得してhide()を実行するとTabBarが非表示になります。

1self.ui.tabWidget.tabBar().hide()

実行結果

ボタンクリックでタブの切り替え

TabBarが消えたのでボタンをクリックしてタブが切り替えられるようにします。toolButtonのclickedにスロットをconnectします。

1self.ui.toolButton.clicked.connect( lambda : self.ui.tabWidget.setCurrentIndex(0) )
2self.ui.toolButton_2.clicked.connect( lambda : self.ui.tabWidget.setCurrentIndex(1) )
3self.ui.toolButton_3.clicked.connect( lambda : self.ui.tabWidget.setCurrentIndex(2) )

実行結果

結構それっぽいものが出来ました。あとはスタイルシートで色を変えたりすればいい感じになりそうです。

ソースコード

 1# -*- coding: utf-8 -*-
 2import sys
 3from mainwindow import Ui_MainWindow
 4from PyQt5 import QtWidgets
 5class MainWindow(QtWidgets.QMainWindow):
 6    def __init__(self):
 7        super().__init__()
 8        self.ui = Ui_MainWindow()
 9        self.ui.setupUi(self)
10        
11        self.ui.tabWidget.tabBar().hide()
12        
13        self.ui.toolButton.clicked.connect( lambda : self.ui.tabWidget.setCurrentIndex(0) )
14        self.ui.toolButton_2.clicked.connect( lambda : self.ui.tabWidget.setCurrentIndex(1) )
15        self.ui.toolButton_3.clicked.connect( lambda : self.ui.tabWidget.setCurrentIndex(2) )
16def main():
17    app = QtWidgets.QApplication(sys.argv)
18    window = MainWindow()
19    window.show()
20    app.exec()
21
22if __name__ == '__main__':
23    main()

関連記事