如何创建带有标志修改的 QMessageBox 的子类?
How do I make a subclass of QMessageBox with flag modifications?
我试图让 QMessageBox 中的文本可选择,我发现如果我修改 QMessageBox 上的 "setTextInteractionFlags",这就解决了问题。然而,当我尝试这样做时,我的 PyQt(或更具体地说,PySide)抱怨说这个属性不存在。因此,我改为尝试将此功能添加为样式 sheet,但是在尝试创建我自己的 QMessageBox 自定义 class 时,这似乎根本不起作用。
然后我尝试手动创建一个 QMessageBox,这似乎可行。
代码如下:
from PyQt4 import QtCore
from PyQt4 import QtGui
import sys
class CustomQMessageBox(QtGui.QMessageBox):
def __init__(self, *args, **kwargs):
QtGui.QMessageBox.__init__(self, *args, **kwargs)
self.setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }")
class Window(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('Test UI')
self.setMinimumSize(225, 150)
self.uiWidget = QtGui.QWidget()
self.verticalLayout = QtGui.QVBoxLayout(self.uiWidget)
self.enterListLabel = QtGui.QLabel(self.uiWidget)
self.enterListLabel.setText('Enter list of names')
self.verticalLayout.addWidget(self.enterListLabel)
self.lyt = QtGui.QVBoxLayout()
self.lyt.addWidget(self.uiWidget)
self.setLayout(self.lyt)
#This does NOT work
cacheFixConfirm = CustomQMessageBox.question(self.uiWidget, 'Message Box', 'something', QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No)
#This does
confirmDialogBox = QtGui.QMessageBox()
confirmDialogBox.setWindowTitle('Message Box')
confirmDialogBox.setIcon(QtGui.QMessageBox.Question)
confirmDialogBox.setText('sdlkfjl;asdjfosdijflsdkfjsdklfjsdkljfio')
confirmDialogBox.setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }")
confirmDialogBox.addButton(QtGui.QPushButton('Yes', parent=confirmDialogBox), QtGui.QMessageBox.YesRole)
confirmDialogBox.addButton(QtGui.QPushButton('No', parent=confirmDialogBox), QtGui.QMessageBox.NoRole)
confirmDialogBox.exec_()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
我只是想知道为什么第二个示例有效,而尝试使用自定义 class 的第一个示例却不...
问题是静态方法about
, aboutQt
, critical
, information
, question
and warning
不使用派生的class而是QMessageBox,类似于:
class MessageBox(QMessageBox):
@staticmethod
def foo(self, arg1, ...):
w = QMessageBox()
...
因此,即使您在 MessageBox 中设置 属性 它也不会起作用,因为它不适用于 class 不是 MessageBox 的那些。
因此,根据您的需要,有以下选项:
- 将相同的 属性 应用于所有现有 QMessageBox(包括其派生的 classes):
app.setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }")
- 将样式表应用于调用
question()
方法时作为父项建立的 ui.Widget
将应用于您的所有子项:
<b>self.uiWidget.setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }")</b>
cacheFixConfirm = CustomQMessageBox.question(
<b>self.uiWidget</b>,
"Message Box",
"something",
QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No,
)
- 不要使用静态方法。
messagebox = CustomQMessageBox(
QtGui.QMessageBox.Question,
"Message Box",
"something",
QtGui.QMessageBox.NoButton,
self.uiWidget,
)
messagebox.addButton(QtGui.QMessageBox.Yes)
messagebox.addButton(QtGui.QMessageBox.No)
messagebox.exec_()
我试图让 QMessageBox 中的文本可选择,我发现如果我修改 QMessageBox 上的 "setTextInteractionFlags",这就解决了问题。然而,当我尝试这样做时,我的 PyQt(或更具体地说,PySide)抱怨说这个属性不存在。因此,我改为尝试将此功能添加为样式 sheet,但是在尝试创建我自己的 QMessageBox 自定义 class 时,这似乎根本不起作用。
然后我尝试手动创建一个 QMessageBox,这似乎可行。
代码如下:
from PyQt4 import QtCore
from PyQt4 import QtGui
import sys
class CustomQMessageBox(QtGui.QMessageBox):
def __init__(self, *args, **kwargs):
QtGui.QMessageBox.__init__(self, *args, **kwargs)
self.setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }")
class Window(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('Test UI')
self.setMinimumSize(225, 150)
self.uiWidget = QtGui.QWidget()
self.verticalLayout = QtGui.QVBoxLayout(self.uiWidget)
self.enterListLabel = QtGui.QLabel(self.uiWidget)
self.enterListLabel.setText('Enter list of names')
self.verticalLayout.addWidget(self.enterListLabel)
self.lyt = QtGui.QVBoxLayout()
self.lyt.addWidget(self.uiWidget)
self.setLayout(self.lyt)
#This does NOT work
cacheFixConfirm = CustomQMessageBox.question(self.uiWidget, 'Message Box', 'something', QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No)
#This does
confirmDialogBox = QtGui.QMessageBox()
confirmDialogBox.setWindowTitle('Message Box')
confirmDialogBox.setIcon(QtGui.QMessageBox.Question)
confirmDialogBox.setText('sdlkfjl;asdjfosdijflsdkfjsdklfjsdkljfio')
confirmDialogBox.setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }")
confirmDialogBox.addButton(QtGui.QPushButton('Yes', parent=confirmDialogBox), QtGui.QMessageBox.YesRole)
confirmDialogBox.addButton(QtGui.QPushButton('No', parent=confirmDialogBox), QtGui.QMessageBox.NoRole)
confirmDialogBox.exec_()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
我只是想知道为什么第二个示例有效,而尝试使用自定义 class 的第一个示例却不...
问题是静态方法about
, aboutQt
, critical
, information
, question
and warning
不使用派生的class而是QMessageBox,类似于:
class MessageBox(QMessageBox):
@staticmethod
def foo(self, arg1, ...):
w = QMessageBox()
...
因此,即使您在 MessageBox 中设置 属性 它也不会起作用,因为它不适用于 class 不是 MessageBox 的那些。
因此,根据您的需要,有以下选项:
- 将相同的 属性 应用于所有现有 QMessageBox(包括其派生的 classes):
app.setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }")
- 将样式表应用于调用
question()
方法时作为父项建立的ui.Widget
将应用于您的所有子项:
<b>self.uiWidget.setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }")</b>
cacheFixConfirm = CustomQMessageBox.question(
<b>self.uiWidget</b>,
"Message Box",
"something",
QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No,
)
- 不要使用静态方法。
messagebox = CustomQMessageBox(
QtGui.QMessageBox.Question,
"Message Box",
"something",
QtGui.QMessageBox.NoButton,
self.uiWidget,
)
messagebox.addButton(QtGui.QMessageBox.Yes)
messagebox.addButton(QtGui.QMessageBox.No)
messagebox.exec_()