问题描述
我正在尝试查找打开的端口并将它们添加到我的菜单中.现在,我成功地对我的菜单进行了操作(例如,查找端口"),并且只有当它被单击时——它才会连接到我的功能,以获得所有可用端口.不幸的是,这不是我想要的.
I am trying to find open ports and add them to my menu. Right now, what I succeed having an action to my menu (like, "find ports"), and only if it's clicked - it will connect to my function that gets all free ports. Unfortunately, that's not what I am looking for.
我想点击菜单title,并在我的菜单中获取所有端口.以下是我的代码:
I want to click on the menu title, and get all port in my menu. Below is the code I have:
这是图形用户界面部分:
This is the GUI part:
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(150, 150) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.portList = QtWidgets.QPushButton(self.centralwidget) self.portList.setGeometry(QtCore.QRect(10, 50, 65, 23)) self.portList.setObjectName("portList") self.productMenu=QtWidgets.QMenu(self.centralwidget) # self.productMenu.addAction("Find Port") <-------- If I add this, then it works when I click on "Find Port" self.portList.setMenu(self.productMenu) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "GUI")) self.portList.setText(_translate("MainWindow", "Ports"))
这是我运行我的功能的地方:
And this is where I run my functions:
from PyQt5 import QtWidgets, QtCore, QtGui from test1 import Ui_MainWindow import serial.tools.list_ports 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(self.findPort) self.ui.portList.clicked.connect(self.findPort) ###I tried both lines above, but it doesn't connect to the function### def findPort(self): comPorts = list(serial.tools.list_ports.comports()) print("clicked!") for counter in comPorts: strPort=str(counter) print(strPort) self.ui.productMenu.addAction(strPort) def portClick(self,action): print(action.text()) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) application = ApplicationWindow() application.show() sys.exit(app.exec_())
我怎样才能让 findport 功能通过按菜单标题进行连接,并使用空闲端口立即更新它?
How can I get the findport function to connect by pressing the title of the menu, and get it updated immediately with the free ports?
推荐答案
你必须使用 aboutToShow 信号:
You have to use the aboutToShow signal:
self.ui.productMenu.aboutToShow.connect(self.findPort)