从 QLineEdit 中读取文本作为 Qmenu 选项的子菜单

reading text from QLineEdit as a submenu of a Qmenu option

正在读取作为 Qmenu 一部分的 QlineEdit 文本

正如最初代码中所示,虽然我可以使用触发函数来确定更改了哪个选项,然后阅读文本。如果我能弄清楚如何从子菜单中使用 currenttext() 读取 QlineEdit,我就可以检查用户是否在需要时更改了输入。

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QActionGroup, QMenu, QApplication, QLineEdit, QWidgetAction

class Example(QMainWindow):

    def __init__(self):
        super().__init__()
        self.menubar = self.menuBar()
        self.menubar.installEventFilter(self)
        self.fileMenu = self.menubar.addMenu('&Circuit Set-Up')
        self.populate()

        self.setGeometry(300, 300, 300, 200)
        self.show()


    def triggered(self, action):
        print(action.text())


    def populate(self):

        for m in range(3):

            setattr(self,'impMenu'+str(m),QMenu('Channel'+str(m), self))

            factors=['Enter Transducer Calibration Constant [default 1] = 1',
            'Enter Gauge Factor [default 2] = 2',
            'Passion Ratio [default 0.3] = 0.3']

            for n in range(3):

                ql = QLineEdit(factors[n])
                ql.setMinimumWidth(350)
                wAction = QWidgetAction(self)
                wAction.setDefaultWidget(ql)
                getattr(self,'impMenu'+str(m)).addAction(wAction)

            self.fileMenu.addMenu(getattr(self,'impMenu'+str(m)))
            setattr(self,'triggered'+str(m),self.triggered)
            getattr(self,'impMenu'+str(m)).triggered.connect(getattr(self,'triggered'+str(m)))


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

QLineEdit 位于菜单上方,如果用户更改了文本,它不会通知您,因此使用 QMenu/QAction 中的信息是没有效率的。如果您想在用户更改文本时获取文本,请使用 QLineEdit 信号。

import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QAction, QApplication, QLineEdit, QMainWindow, QMenu, QWidgetAction


class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.menubar = self.menuBar()
        self.menubar.installEventFilter(self)
        self.fileMenu = self.menubar.addMenu("&Circuit Set-Up")
        self.populate()

        self.setGeometry(300, 300, 300, 200)
        self.show()

    @pyqtSlot(str)
    def onTextChanged(self, text):
        print(text)

    def populate(self):

        factors = [
            "Enter Transducer Calibration Constant [default 1] = 1",
            "Enter Gauge Factor [default 2] = 2",
            "Passion Ratio [default 0.3] = 0.3",
        ]

        for m in range(3):
            menu = QMenu("Channel{}".format(m), self)
            self.fileMenu.addMenu(menu)
            for n in range(3):
                ql = QLineEdit(factors[n])
                ql.setMinimumWidth(350)
                ql.textChanged.connect(self.onTextChanged)
                wAction = QWidgetAction(self)
                wAction.setDefaultWidget(ql)
                menu.addAction(wAction)


if __name__ == "__main__":

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())