lennyfoulds
lennyfoulds

Reputation: 38

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()

Upvotes: 2

Views: 2832

Answers (1)

eyllanesc
eyllanesc

Reputation: 244301

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

Upvotes: 1

Related Questions