更改 QMessageBox 和 SaveFileDialog 的光标
Change cursor for QMessageBox and SaveFileDialog
在 PyQt5 中,我可以使用以下方法更改对象的光标:
Object.setCursor(QCursor(Qt.PointingHandCursor))
对于其他按钮,我使用此 class 但它不会更改 QmessageBox
或 Qfiledialog
中的光标:
class QPushButton(QPushButton):
def __init__(self, parent=None):
super(QPushButton, self).__init__(parent)
self.setCursor(QCursor(Qt.PointingHandCursor))
如何更改 QMessageBox
和 QFileDialog
中所有按钮的光标?
消息框方法示例
def onNotConnected(self):
err = QMessageBox.question(
self, DONGLE_NOT_CONN, DONGLE_NOT_CONN_MSG, QMessageBox.Ok | QMessageBox.Cancel)
if err == QMessageBox.Ok:
self.updating_thread(self.device_code)
else:
self.restart_program()
QMessageBox
和 QFileDialog
具有 setCursor()
方法,因为它们继承自 QWidget
。但是你的问题是静态方法,因为你不能直接访问对象。
所以解决方案是利用这些静态方法的一个特殊特性:它们是topLevels,所以我们可以使用QApplication.topLevelWidgets()
过滤它,但另一个问题是它们是阻塞的,所以什么都不会同步执行,所以诀窍是使用 QTimer
.
from PyQt5 import QtCore, QtGui, QtWidgets
def onTimeout():
for w in QtWidgets.QApplication.topLevelWidgets():
if isinstance(w, QtWidgets.QMessageBox):
for button in w.buttons():
button.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent=None)
self.show()
QtCore.QTimer.singleShot(0, onTimeout)
res = QtWidgets.QMessageBox.question(self,
"title",
"text",
QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
同样在您的示例中,我们可以使用 QMessageBox 的父级过滤过滤器,并且 QFileDialog 可能是 window。
from PyQt5 import QtCore, QtGui, QtWidgets
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent=None)
self.show()
QtCore.QTimer.singleShot(0, self.onTimeout)
msgBox = QtWidgets.QMessageBox.question(self,
"title",
"text",
QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel)
QtCore.QTimer.singleShot(0, self.onTimeout)
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(self,
"Save File",
QtCore.QDir.homePath(),
"Images (*.png *.xpm *.jpg)",
"",
QtWidgets.QFileDialog.DontUseNativeDialog)
def onTimeout(self):
for w in QtWidgets.QApplication.topLevelWidgets():
if isinstance(w, QtWidgets.QMessageBox) and w.parent() == self:
for button in w.buttons():
button.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
elif isinstance(w, QtWidgets.QFileDialog) and w.parent() == self:
for button in w.findChildren(QtWidgets.QPushButton):
button.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
在 PyQt5 中,我可以使用以下方法更改对象的光标:
Object.setCursor(QCursor(Qt.PointingHandCursor))
对于其他按钮,我使用此 class 但它不会更改 QmessageBox
或 Qfiledialog
中的光标:
class QPushButton(QPushButton):
def __init__(self, parent=None):
super(QPushButton, self).__init__(parent)
self.setCursor(QCursor(Qt.PointingHandCursor))
如何更改 QMessageBox
和 QFileDialog
中所有按钮的光标?
消息框方法示例
def onNotConnected(self):
err = QMessageBox.question(
self, DONGLE_NOT_CONN, DONGLE_NOT_CONN_MSG, QMessageBox.Ok | QMessageBox.Cancel)
if err == QMessageBox.Ok:
self.updating_thread(self.device_code)
else:
self.restart_program()
QMessageBox
和 QFileDialog
具有 setCursor()
方法,因为它们继承自 QWidget
。但是你的问题是静态方法,因为你不能直接访问对象。
所以解决方案是利用这些静态方法的一个特殊特性:它们是topLevels,所以我们可以使用QApplication.topLevelWidgets()
过滤它,但另一个问题是它们是阻塞的,所以什么都不会同步执行,所以诀窍是使用 QTimer
.
from PyQt5 import QtCore, QtGui, QtWidgets
def onTimeout():
for w in QtWidgets.QApplication.topLevelWidgets():
if isinstance(w, QtWidgets.QMessageBox):
for button in w.buttons():
button.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent=None)
self.show()
QtCore.QTimer.singleShot(0, onTimeout)
res = QtWidgets.QMessageBox.question(self,
"title",
"text",
QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
同样在您的示例中,我们可以使用 QMessageBox 的父级过滤过滤器,并且 QFileDialog 可能是 window。
from PyQt5 import QtCore, QtGui, QtWidgets
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent=None)
self.show()
QtCore.QTimer.singleShot(0, self.onTimeout)
msgBox = QtWidgets.QMessageBox.question(self,
"title",
"text",
QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel)
QtCore.QTimer.singleShot(0, self.onTimeout)
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(self,
"Save File",
QtCore.QDir.homePath(),
"Images (*.png *.xpm *.jpg)",
"",
QtWidgets.QFileDialog.DontUseNativeDialog)
def onTimeout(self):
for w in QtWidgets.QApplication.topLevelWidgets():
if isinstance(w, QtWidgets.QMessageBox) and w.parent() == self:
for button in w.buttons():
button.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
elif isinstance(w, QtWidgets.QFileDialog) and w.parent() == self:
for button in w.findChildren(QtWidgets.QPushButton):
button.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())