我有一个使用PYQT5开发的应用程序,在此应用程序中,我在QtableWidget中有一行,其中有一个指向报告的QLabel超链接。该报告保存在本地,尽管将来它可能位于网络共享中。
出于这个问题,说我在此位置的本地驱动器上有一个报告:
C:\my\report\location\report.html
但是,当我单击链接以在Web浏览器中打开报告时,在控制台窗口中出现错误:
ShellExecute 'c:%5Cmy%5Creport%5Clocation%5Creport.html' failed (error 2).
很明显,该脚本的'\'反斜杠属性存在问题,但我无法找到防止这种情况的方法。
这是我基于pyqt的代码,用于在QTableWidget中生成超链接:
reportLink = " <a href=\"{url}\"> <font face=Tw Cen MT Condensed size=2 color=black>Report</font> </a>"\
.format(url=outcome_dict['report_location'])
report_lbl = QtWidgets.QLabel()
report_lbl.setText(reportLink)
report_lbl.setOpenExternalLinks(True)
self.ui.my_table.setCellWidget(self.row, 6, report_lbl)
这是用户单击QTableWidget中的报告超链接时的代码片段:
def html_clicked(self, mi):
self.column = mi.column()
if self.column == 6:
try:
for ref in self.ui.my_table.selectedIndexes():
self.link = self.ui.my_table.item(int(ref.row()), 6).text()
webbrowser.open(self.link)
except Exception as e:
print(e)
else:
pass
答案 0 :(得分:1)
没有必要使用webbrowser.open(...),QLabel将指示将存在该链接,但是为此,URL必须正确,对于本地文件,URL为file:///path/of/file
,然后才能使用路径获取该网址,必须使用QUrl::fromLocalFile()
,例如:
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.ui = ...
self.ui.setupUi(self)
d = [{"report_location": r"C:\my\report\location\report.html" },
{"report_location": r"C:\Users\IEUser\Desktop\index.html" }]
self.ui.my_table.setColumnCount(7)
self.ui.my_table.setRowCount(2)
for row, outcome_dict in enumerate(d):
url = QtCore.QUrl.fromLocalFile(outcome_dict['report_location']).toString()
reportLink = "<a href=\"{url}\"> <font face=Tw Cen MT Condensed size=2 color=black>Report</font> </a>"\
.format(url=url)
report_lbl = QtWidgets.QLabel()
report_lbl.setText(reportLink)
report_lbl.setOpenExternalLinks(True)
self.ui.my_table.setCellWidget(row, 6, report_lbl)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())