Search code examples
pythonpyqtpyqt4

How to add dropdown menu to QMessageBox?


After looking at some code I found on stackoverflow, I was able to find a way to add a table to a QmessageBox. Now that I have done that, I would like to place a drop down menu in the top right of the QmessageBox and I cannot figure out a way to do that (if it even is possible).

Here is my edited code:

from PyQt4.QtGui import *
from PyQt4.Qt import *
import sys


class MyMessageBox(QMessageBox):
    def __init__(self):
        QMessageBox.__init__(self)
        self.setSizeGripEnabled (True)

        self.setWindowTitle('Get Parent Script')
        self.setIcon(self.Question)
        #self.setText("Hello MessageBox")
        self.addButton("Select", QMessageBox.ActionRole)
        self.setStandardButtons(QMessageBox.Cancel)
        #self.addWidget(QInputDialog())

        self.addTableWidget (self)

        currentClick = self.exec_()


    def addTableWidget (self, parentItem) :
        self.l =  QVBoxLayout()
        self.tableWidget = QTableWidget(parentItem)
        self.tableWidget.setObjectName ('tableWidget')

        self.tableWidget.setColumnCount(3)
        self.tableWidget.setRowCount(2)
        self.tableWidget.setHorizontalHeaderLabels(QString("Nuke Script;File Modification Time;User").split(";"))

        header = self.tableWidget.horizontalHeader()
        header.setResizeMode(0, QHeaderView.ResizeToContents)
        header.setResizeMode(1, QHeaderView.Stretch)
        header.setResizeMode(2, QHeaderView.Stretch)
        stringlist = {u'/SEQ/ZZ/ZZ_012_001/Comp/nuke/scripts/comp':u'user1', u'/SEQ/ZZ/ZZ_012_001/Comp/nuke/scripts/comp/hello': u'user2'}
        row = 0
        for key, value in stringlist.iteritems():
            print key, value

            nameitem = QTableWidgetItem(str(key))
            codeitem = QTableWidgetItem(str(value))
            self.tableWidget.setItem(row,0,nameitem)
            self.tableWidget.setItem(row,1,codeitem)
            row +=1

        self.tableWidget.resize(1000, 170)

        self.l.addWidget(self.tableWidget)
        self.setLayout(self.l)

    def event(self, e):
        result = QMessageBox.event(self, e)
        self.setMinimumWidth(0)
        self.setMaximumWidth(16777215)
        self.setMinimumHeight(0)
        self.setMaximumHeight(16777215)
        self.setSizePolicy(
            QSizePolicy.Expanding,
            QSizePolicy.Expanding
        )
        self.resize(1000, 300)

        return result


def run_cli():
    #app = QtWidgets.QApplication(sys.argv)
    app = QApplication(sys.argv)
    MyMessageBox()


if __name__ == '__main__':
    run_cli()

Solution

  • In your case it is not optimal to use QMessageBox since I involve unnecessary work because this widget already has a predefined layout, instead you can create a widget based on a QDialog:

    from PyQt4 import QtCore, QtGui
    
    
    class Dialog(QtGui.QDialog):
        def __init__(self, parent=None):
            super(Dialog, self).__init__(parent)
    
            label = QtGui.QLabel("Text")
            combo = QtGui.QComboBox()
            combo.addItems(["option1", "option2", "option3"])
    
            self.tableWidget = QtGui.QTableWidget(2, 3)
            self.tableWidget.setHorizontalHeaderLabels(
                QtCore.QString("Nuke Script;File Modification Time;User").split(";")
            )
    
            header = self.tableWidget.horizontalHeader()
            header.setResizeMode(0, QtGui.QHeaderView.ResizeToContents)
            header.setResizeMode(1, QtGui.QHeaderView.Stretch)
            header.setResizeMode(2, QtGui.QHeaderView.Stretch)
    
            stringlist = {
                u"/SEQ/ZZ/ZZ_012_001/Comp/nuke/scripts/comp": u"user1",
                u"/SEQ/ZZ/ZZ_012_001/Comp/nuke/scripts/comp/hello": u"user2",
            }
    
            for row, (key, value) in enumerate(stringlist.iteritems()):
                nameitem = QtGui.QTableWidgetItem(str(key))
                codeitem = QtGui.QTableWidgetItem(str(value))
                self.tableWidget.setItem(row, 0, nameitem)
                self.tableWidget.setItem(row, 1, codeitem)
    
            box = QtGui.QDialogButtonBox(
                QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel,
                centerButtons=True,
            )
            box.accepted.connect(self.accept)
            box.rejected.connect(self.reject)
    
            lay = QtGui.QGridLayout(self)
            lay.addWidget(label, 0, 0)
            lay.addWidget(combo, 0, 1)
            lay.addWidget(self.tableWidget, 1, 0, 1, 2)
            lay.addWidget(box, 2, 0, 1, 2)
    
            self.resize(640, 240)
    
    
    def run_cli():
        import sys
    
        app = QtGui.QApplication(sys.argv)
        w = Dialog()
        w.exec_()
    
    
    if __name__ == "__main__":
        run_cli()
    

    enter image description here