You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySide6中QPushButton图标在跨路径调用QDialog时不显示问题

QDialog内QPushButton图标在跨目录调用时无法显示

问题场景

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:17:11