выпадающий список pyqt5 с подсписками - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь выяснить, как я могу создать выпадающий список (в настоящее время использующий QComoboBox), с несколькими элементами, и когда я наводю указатель мыши / щелчок мышью на один из вариантов, он показывает подсписок, содержащий еще несколько вариантов. Я пытался искать в Интернете, но не смог найти ничего, что я мог бы использовать.

Вот пример того, чего я хочу достичь (извините за ужасное качество, но я думаю, что это ясно дает понять, в чем заключается моя цель ..) ) enter image description here

Есть ли у кого-нибудь идеи, как создать подсписок внутри списка?

Редактировать

После попытки предложения @ eyllanes c У меня все еще есть проблема: я использую два файла: один файл, который содержит все объекты, такие как кнопки и тому подобное, и другой, который содержит некоторые функции и в основном делает GUI функциональным .

Я определил это в своем первом файле

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
  def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(751, 650)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.menuBtn=QtWidgets.QPushButton(self.centralwidget)
        self.menuBtn.setGeometry(QtCore.QRect(100, 220, 100, 100))

        self.productMenu=QtWidgets.QMenu(self.centralwidget)
        self.menu1=self.productMenu.addMenu("options")
        self.menu1.addAction("option 1")
        self.menu2=self.productMenu.addMenu("option 2")
        self.menu2.addAction("option 2a")
        self.menu2.addAction("option 2b")

        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

  def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Test"))
        self.menuBtn.setText(_translate("MainWindow", "Menu"))

И во втором файле (функционал) я написал это:

from PyQt5 import QtWidgets, QtCore, QtGui
from stackTest import Ui_MainWindow
import sys

class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(ApplicationWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.productMenu.triggered.connect(lambda action: self.ui.menuBtn.setText(action.text("Hello!")))

if __name__ == "__main__":
   app = QtWidgets.QApplication(sys.argv)
   application = ApplicationWindow()
   application.show()
   sys.exit(app.exec_())

Когда я запускаю код Я вижу кнопку, но когда я нажимаю ее, ничего не происходит.

Как мне заставить ее работать, чтобы, когда я нажимаю sh кнопку, я получал меню.

1 Ответ

2 голосов
/ 24 января 2020

Одним из возможных решений является использование кнопки (QPushButton, QToolButton и др. c.) И установление sh QMenu, как показано ниже:

import sys

from PyQt5 import QtCore, QtWidgets


def create_menu(d, menu):
    if isinstance(d, list):
        for e in d:
            create_menu(e, menu)
    elif isinstance(d, dict):
        for k, v in d.items():
            sub_menu = QtWidgets.QMenu(k, menu)
            menu.addMenu(sub_menu)
            create_menu(v, sub_menu)
    else:
        action = menu.addAction(d)
        action.setIconVisibleInMenu(False)


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        d = ["1", "2", "3", {"4": ["5", "6", {"7": ["8", "9"]}]}, {"10": "11"}]

        menu = QtWidgets.QMenu(self)
        create_menu(d, menu)

        button = QtWidgets.QPushButton()
        button.setMenu(menu)

        menu.triggered.connect(lambda action: button.setText(action.text()))

        lay = QtWidgets.QHBoxLayout(self)
        lay.addWidget(button)
        lay.addStretch()

        self.resize(640, 480)


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

Код, предоставленный OP, должен добавьте QMenu в QPushButton:

import sys

from PyQt5 import QtWidgets, QtCore, QtGui

from stackTest import Ui_MainWindow


class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(ApplicationWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        <b>self.ui.menuBtn.setMenu(self.ui.productMenu)</b>
        self.ui.productMenu.triggered.connect(
            lambda action: self.ui.menuBtn.setText(action.text())
        )


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    application = ApplicationWindow()
    application.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...