
请问,导入FramelessWindow之后,布局和标题栏之间有重叠,应该怎样调
装完PyQt-Fluent-Widgets发现Qt Designer侧边栏还是光秃秃的,只有标准Qt组件,Fluent的PushButton、CardWidget一个都找不到。库装进去了但Designer插件没挂上,直接pip install完就打开Designer是看不到的。
启动Designer要走库自带的脚本。PyQt-Fluent-Widgets的源码目录下有个tools文件夹,里面有designer.py,在终端里跑`python ./tools/designer.py`,启动出来的Designer侧边栏才会多出Fluent Widgets那一栏。如果源码目录里找不到tools文件夹,去GitHub的release页面下载FluentDesigner压缩包,解压后直接跑designer/designer.exe,那个是已经装好插件的Designer。新版qfluentwidgets已经不在pip包里带designer.py了,得从源码仓库拿或者去release页面下预编译的。
最简单的办法是“提升为”。Designer里先拖一个原生QPushButton,右键选“提升为…”,弹出来的对话框里填两项:头文件写`qfluentwidgets`,类名写`PushButton`,点添加再提升。提升完之后Designer里看着还是原来的灰色按钮,不会变成Fluent样式,这是正常的。保存成mainwindow.ui,用pyuic5转成py文件,打开生成的代码能看到`from qfluentwidgets import PushButton`,按钮实例化的时候就是Fluent的了。
提升之后跑起来直接崩,报TypeError说PushButton的__init__缺少text参数。原生QPushButton的构造函数是`def __init__(self, *__args)`,text和parent都是可选的,pyuic5生成代码的时候调的是`PushButton()`,不带任何参数。但qfluentwidgets的PushButton定义是`def __init__(self, text: str, parent=None)`,text是必填的位置参数,`PushButton()`一调就报缺参数。解决方法是写一个中间类,构造函数签名跟原生父类完全一样,内部再转交给Fluent的PushButton。写一个CustomButton,继承自qfluentwidgets.PushButton,`__init__(self, *args)`里先把参数收下来,根据参数个数判断调用父类的哪种构造,或者直接给text一个默认值空字符串。提升的时候头文件写自己的模块名,类名写CustomButton,这样pyuic5生成`CustomButton()`就不会崩了。
同一个窗口里用了MSFluentWindow加addSubInterface挂多个子界面,导航栏只显示第一个,后面几个怎么点都不切换。打开每个.ui文件看根widget的name属性,全是默认的`Form`。addSubInterface内部用`interface.objectName()`当路由键,所有子界面的objectName都是`Form`,后面的覆盖前面的,导航栏里只认最后一个。改法是把每个.ui文件根widget的name改成唯一的,`Form1`、`Form2`、`Form3`这样,在Designer里选中根widget,Property Editor里把objectName改掉,重新保存.ui文件。改完不用改Python代码,loadUi的时候objectName跟着.ui走。只在Python构造函数里`self.setObjectName("Form1")`没用,那个调用发生在loadUi之后,导航栏注册的时候读的还是"Form"。
PyQt-Fluent-Widgets依赖PyQt5-Frameless-Window版本大于等于0.2.7,低于这个版本Designer插件和Fluent窗口的圆角阴影都会出问题。用pip装的时候`pip install "PyQt-Fluent-Widgets[full]"`会把Frameless-Window一起带上,装lite版本的话得手动确认一下版本。PyQt5、PyQt6、PySide2、PySide6四个版本的Fluent-Widgets包名都是qfluentwidgets,同时装两个会互相覆盖,报ImportError找不到模块。用PyQt5就只装PyQt5版的,装完之后`python -c "from qfluentwidgets import PushButton; print('ok')"`确认一下。
D:\PyQt_Projects\FluentApp\下面那个demo.ui的根widget名字还是Form,导航栏问题还没改,下次把Form改成MainWindow,另外那个CustomButton中间类还没建,PushButton提升之后还是直接崩,中间类的构造参数是...
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删