【问题标题】:reading text from QLineEdit as a submenu of a Qmenu option从 QLineEdit 读取文本作为 Qmenu 选项的子菜单
【发布时间】:2019-08-26 09:09:22
【问题描述】:

通过 QlineEdit 读取文本,它是 Qmenu 的一部分

如代码所示,虽然我可以使用触发函数来确定更改了哪个选项,然后阅读文本。如果我能弄清楚如何从子菜单中使用 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中书写时,菜单打开时,菜单关闭时?

标签: python pyqt pyqt5 qlineedit qmenu


【解决方案1】:

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

【讨论】:

  • 非常感谢您的帮助,我会记住这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2016-03-29
  • 1970-01-01
相关资源
最近更新 更多