PySide6中QPushButton图标在跨路径调用QDialog时不显示问题
问题场景
在PySide6开发中遇到图标显示异常:
- 直接在QDialog所在的
WindowAdd目录内运行代码时,按钮图标显示正常; - 从与
WindowAdd路径不同的main.py调用该QDialog时,图标完全无法显示。
WindowAdd目录下__init__.py代码
from PySide6.QtUiTools import QUiLoader from PySide6.QtCore import QFile, QDate, Qt, QRect, QPropertyAnimation, QEasingCurve ,QTimer from PySide6.QtWidgets import QApplication, QWidget, QTableWidgetItem, QPushButton, QDialog, QListWidgetItem, QCompleter from PySide6 import QtGui, QtWidgets, QtCore from .ui_Add_Item import Ui_Form from Lib import database3 from datetime import datetime from functools import partial import random import time import os import sys class CustomListWidgetItem(QListWidgetItem): def __init__(self, text, hidden_data): super().__init__(text) self.hidden_data = hidden_data class Widgets(QDialog, Ui_Form): def __init__(self, parent=None, page=""): super(Widgets, self).__init__(parent) self.setupUi(self) if __name__ == "__main__": app = QApplication([]) window = Widgets() window.show() app.exec()
main.py代码
from PySide6.QtUiTools import QUiLoader from PySide6.QtCore import QFile, Qt from PySide6.QtWidgets import QApplication, QWidget, QTableWidgetItem, QMenu, QGraphicsBlurEffect from PySide6 import QtGui, QtWidgets, QtCore from PySide6.QtGui import QBrush, QColor, QAction, QTextOption, QIcon from ui_Style3 import Ui_Form from WindowAdd import Widgets as WindowAdd2 from Lib import database3 from datetime import datetime import random import sys class Widgets(QWidget,Ui_Form): def __init__(self): super(Widgets, self).__init__() self.setupUi(self) #Title window name and icon self.setWindowTitle("Business record") #Name title self.setWindowIcon(QtGui.QIcon("path30.png")) #Icon title if __name__ == "__main__": app = QApplication(sys.argv) window = Widgets() window.show() sys.exit(app.exec())
注:使用Qt Designer生成界面设计文件,
main.py与__init__.py负责控制设计文件并执行业务逻辑。
问题原因
核心是相对路径解析逻辑问题:
- 直接运行
WindowAdd内代码时,程序工作目录就是WindowAdd,图标相对路径基于此目录解析,能正常找到文件; - 运行
main.py时,工作目录切换为main.py所在目录,此时QDialog内按钮的图标相对路径会基于这个新目录查找,自然找不到对应文件(Qt Designer生成的ui_Add_Item.py里的图标路径默认是相对WindowAdd的)。
解决方案
通过动态构建图标文件的绝对路径,确保无论从哪个目录运行程序,都能正确定位图标文件。
修改WindowAdd/init.py
在Widgets类的初始化方法中,基于当前文件的绝对路径构建图标路径,再重新设置按钮图标:
from PySide6.QtUiTools import QUiLoader from PySide6.QtCore import QFile, QDate, Qt, QRect, QPropertyAnimation, QEasingCurve ,QTimer from PySide6.QtWidgets import QApplication, QWidget, QTableWidgetItem, QPushButton, QDialog, QListWidgetItem, QCompleter from PySide6 import QtGui, QtWidgets, QtCore from .ui_Add_Item import Ui_Form from Lib import database3 from datetime import datetime from functools import partial import random import time import os import sys class CustomListWidgetItem(QListWidgetItem): def __init__(self, text, hidden_data): super().__init__(text) self.hidden_data = hidden_data class Widgets(QDialog, Ui_Form): def __init__(self, parent=None, page=""): super(Widgets, self).__init__(parent) self.setupUi(self) # 获取当前文件所在目录的绝对路径 current_dir = os.path.dirname(os.path.abspath(__file__)) # 替换为你实际的图标相对路径(相对于WindowAdd目录) icon_path = os.path.join(current_dir, "icons", "your_button_icon.png") # 给目标按钮设置图标,这里的pushButton替换成你UI文件中的按钮对象名 self.pushButton.setIcon(QtGui.QIcon(icon_path)) if __name__ == "__main__": app = QApplication([]) window = Widgets() window.show() app.exec()
补充说明
如果有多个按钮需要设置图标,重复上述setIcon逻辑即可。也可以直接修改ui_Add_Item.py中的图标路径为绝对路径,但动态构建路径的方式更灵活,适配不同运行场景。
内容的提问来源于stack exchange,提问作者Ahmed Zayed
相关产品推荐
相关产品推荐

