当QT的ui文件修改时自动转换为python文件

在使用PySide/PyQt进行Qt的界面开发时,如果界面比较复杂通常会使用ui文件来进行设计。通常有两种方法来使用ui文件:

  • 直接使用QUiLoader加载ui文件。这种方法的确定就是在python中调用ui中的widget比较麻烦,而且无法有效地使用如pycharm和vscode提供的智能化的索引和提示功能。
  • 将ui文件转化为python源代码。这就如同在QtCreator中用C++写Qt代码时会将ui转换成c++文件一样。不过这需要借助pyside6-uic工具在命令行中手动地执行这样操作,每次修改了ui都需要执行一次,也是相当地麻烦。

那么应该可以想办法自动地进行代码转换,这里通过一个python脚本来完成。代码如下:

from __future__ import unicode_literals, print_function, absolute_import
import os
import signal
import time
import subprocess
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler

# 当前文件所在的绝对路径
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
UIC_CMD = "pyside6-uic"
RC_CMD  = "pyside6-rcc"


# 这个类会检测给定文件的更新
class UicHandler(PatternMatchingEventHandler):
    def on_modified(self, event):
        ui_file = event.src_path
        path_split = os.path.split(ui_file)
        filename = os.path.splitext(path_split[1])[0]
        ext = os.path.splitext(path_split[1])[1]
        if ext == ".ui":
            output_file = os.path.join(path_split[0],  "ui_"+filename+".py")
            # output_file = path_split[0] + "_ui.py"
            cmd = " ".join([
                UIC_CMD,
                "-o " + output_file,
                ui_file
            ])
        elif ext == ".qrc":
            output_file = os.path.join(path_split[0],  filename+"_rc.py")
            # output_file = path_split[0]+"_rc.py"
            cmd = " ".join([
                RC_CMD,
                "-o " + output_file,
                ui_file
            ])
        else:
            print('err')
            return
        print(cmd)
        subprocess.call(cmd, shell=True)
        print('done')


stop = False


def my_handler(signum, frame):
    global stop
    stop = True
    print("终止")


signal.signal(signal.SIGINT, my_handler)    #读取Ctrl+c信号


def main():
    while not stop:
        event_handler = UicHandler(["*.ui", "*.qrc"])
        observer = Observer()
        observer.schedule(event_handler, BASE_DIR, recursive=True)
        observer.start()
        while not stop:
            time.sleep(1)
            print('timeout')
        observer.stop()
        observer.join()
        print('exit')


if __name__ == "__main__":
    main()

将该代码命名为watch_ui_files.py放在与.ui和.qrc文件同级的目录中,打开一个终端并执行:

python watch_ui_files.py

使用Pycharm或vscode自带的终端来打开并保持在开发期间一直运行是比较方便的。当使用QtCreator或QtDesigner设计UI时,每当修改都会自动转换成对应的py文件,这样就可以即时的调试查看效果。

你可能感兴趣的:(Python,python,qt,ui)