Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用标记修改创建QMessageBox的子类?_Python_Python 2.7_Pyqt_Pyqt4 - Fatal编程技术网

Python 如何使用标记修改创建QMessageBox的子类?

Python 如何使用标记修改创建QMessageBox的子类?,python,python-2.7,pyqt,pyqt4,Python,Python 2.7,Pyqt,Pyqt4,我试图使QMessageBox中的文本可选择,我发现如果我修改QMessageBox上的“setTextInteractionFlags”,这就解决了问题。然而,当我尝试这样做时,我的PyQt(或者更具体地说,PySide)抱怨这个属性不存在。因此,我尝试将此功能添加到样式表中,但是在尝试创建自己的QMessageBox自定义类时,这似乎根本不起作用 然后我尝试手动创建一个QMessageBox,这似乎奏效了 代码如下: from PyQt4 import QtCore from PyQt4 i

我试图使QMessageBox中的文本可选择,我发现如果我修改QMessageBox上的“setTextInteractionFlags”,这就解决了问题。然而,当我尝试这样做时,我的PyQt(或者更具体地说,PySide)抱怨这个属性不存在。因此,我尝试将此功能添加到样式表中,但是在尝试创建自己的QMessageBox自定义类时,这似乎根本不起作用

然后我尝试手动创建一个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_())

我只是想知道为什么第二个示例有效,而第一个尝试使用自定义类的示例不…

问题是,静态方法、和不使用派生类,而是使用QMessageBox,类似于:

class MessageBox(QMessageBox):
    @staticmethod
    def foo(self, arg1, ...):
        w = QMessageBox()
        ...
因此,即使在MessageBox中设置该属性,它也不会工作,因为它不会应用于非MessageBox的类

因此,根据您的需要,有以下选项:

  • 将相同属性应用于所有现有QMessageBox(包括其派生类):
  • app.setStyleSheet(“QMessageBox{messagebox文本交互标志:5;}”)
    
  • 将样式表应用于调用
    question()
    方法时作为父级建立的
    ui.Widget
    ,将应用于您的所有子级:

  • 嗯,我想我理解你的意思,仍然需要研究整个静态方法概念(和类方法)。但我真正理解的是,除非我想影响所有QMessageBox实例,否则实际上没有办法通过子类化来实现这一点。因此,我认为类似于我的第二种方法和你的最后一个例子的方法是可行的。非常感谢。
    self.uiWidget.setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }")
    cacheFixConfirm = CustomQMessageBox.question(
        self.uiWidget,
        "Message Box",
        "something",
        QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No,
    )