在使用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文件,这样就可以即时的调试查看效果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)