11

我正在编写一个需要 QMessageBox 中的自定义按钮的应用程序。我设法在 QT 设计器中创建了一个示例,如下所示。

在此处输入图像描述

我想在 QMessageBox 中执行此操作。

我正在使用 python 2.6.4 和 PyQt4。拜托,任何人都可以帮忙。

4

3 回答 3

27

这是一个从头开始构建自定义消息框的示例。

import sys
from PyQt4 import QtCore, QtGui


class Example(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)

        msgBox = QtGui.QMessageBox()
        msgBox.setText('What to do?')
        msgBox.addButton(QtGui.QPushButton('Accept'), QtGui.QMessageBox.YesRole)
        msgBox.addButton(QtGui.QPushButton('Reject'), QtGui.QMessageBox.NoRole)
        msgBox.addButton(QtGui.QPushButton('Cancel'), QtGui.QMessageBox.RejectRole)
        ret = msgBox.exec_()


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
于 2013-03-28T14:06:24.693 回答
2

manuel-gutierrez,你为什么要从 QDilaog 继承?您可以从 QMessageBox 继承。它更简单,代码更少

import sys
from PyQt4.QtGui import QMessageBox, QPushButton, QApplication
from PyQt4.QtCore import Qt

class ErrorWindow(QMessageBox):
    def __init__(self, parent=None):
        QMessageBox.__init__(self, parent)
        self.setWindowTitle("Example")

        self.addButton(QPushButton("Yes"), QMessageBox.YesRole )
        self.addButton(QPushButton("No"), QMessageBox.NoRole)
        self.addButton(QPushButton("Cancel"), QMessageBox.RejectRole)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = ErrorWindow()
    ex.setText("some error")
    ex.show()

    sys.exit(app.exec_())
于 2018-08-17T15:12:33.060 回答
0

标准 QMessageBox “对响应进行解释”,被接受、拒绝或取消。这是一个允许任意按钮的版本,尽可能多的,并将解释留给用户。而且它稍微简化了源代码。参数“buttons”给出了一个文本列表,这使得按钮。返回值是点击按钮的文本。所以用户可以用它做他想做的事。注意:这可能违反 UI 标准,因此不太健壮,但是,嘿。注意 2:由于是 2021 年,我使用 PyQt5 和 python 3.7 我刚刚发布了这个,以防有人更喜欢这种更通用的方法。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

""" A more generic, a bit simplified message box also known as 'popup' """

from PyQt5 import QtWidgets as QW  
    
class Popup(QW.QMessageBox):
    def __init__(
            self, 
            title, 
            text, 
            buttons = ["Ok"]
        ):
        
        super(Popup, self).__init__()
        self.setWindowTitle(title)
        self.setText(text)
        self.buttons = buttons
        for txt in self.buttons:
            b = QW.QPushButton(txt)
            self.addButton(b, QW.QMessageBox.NoRole)
            
    def do(self):
        answer = self.exec_()
        text = self.buttons[answer]
        return text
    
if __name__ == "__main__": # test
    
    class Tester(QW.QWidget):
        def __init__(self):
            super(Tester, self).__init__()
    
            btn = QW.QPushButton("do it")
            btn.clicked.connect(self.klick)
            
            layout = QW.QHBoxLayout(self)
            layout.addWidget(btn)
            
        def klick(self, text):
            r = Popup(
                "choose a letter", 
                "What is your favorite\nLetter\namong a to e ?", 
                buttons = "a,b,c,d,e".split(","))

            print("result = ",r.do())
    
    import sys
    app = QW.QApplication(sys.argv)
    widget = Tester()
    widget.setGeometry(400,400,100,100)
    widget.show()
    sys.exit(app.exec_())
    
于 2021-10-14T09:20:25.023 回答