Я пытаюсь получить список портов с помощью QComboBox, когда он щелкнут, и изменить его размер, чтобы я мог видеть полное имя порта, но у меня есть некоторые проблемы: я пытался подключить поле со списком при «нажатии», но это не так. работа, поэтому я пытаюсь использовать mousepressedevent, но когда я запускаю скрипт, он сразу переходит к функции, даже если я не нажимаю на нее. Я также хочу снова сделать поле со списком маленьким, если пользователь щелкнет где-нибудь за пределами поля со списком или его раскрывающегося списка.
Вот мой код: Эта часть является кодом GUI:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(780, 590)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.portList = QtWidgets.QComboBox(self.centralwidget)
self.portList.setGeometry(QtCore.QRect(50, 50, 50, 25))
self.portList.setObjectName("portList")
MainWindow.setCentralWidget(self.centralwidget)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
И это часть с фактическим кодом:
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.portList.mousePressEvent=self.findPort()
# self.ui.portList.clicked.connect(self.findPort) <---- this does not work
def findPort(self):
comPorts = list(serial.tools.list_ports.comports()) # get a list of all devices connected through serial port
self.i=0
for counter in comPorts:
strPort=str(counter)
self.ui.portList.addItem("")
self.ui.portList.setItemText(self.i,strPort)
self.i=self.i+1
if self.i==0:
self.ui.portList.addItem("")
self.ui.portList.setItemText(0,"No Ports!")
else:
self.ui.portList.resize(500,25)
def clickedOutside(self): ####<---- not sure how to connect to this func (when clicked outside of the list)
self.ui.portList.resize(50,25)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
application = ApplicationWindow()
application.show()
sys.exit(app.exec_())
Если у кого-то есть идея, это было бы очень признательно.
self.ui.portList.mousePressEvent=self.findPort()
. Я думаю, вы имели в видуself.ui.portList.mousePressEvent=self.findPort
(без скобок), но это не путь вперед. Вы можете попробовать создать подклассQComboBox
и переопределитьQComboBox.showPopup
иQComboBox.hidePopup
. - person Heike   schedule 05.02.2020self.ui.portList.mousePressEvent=self.findPort
, лучше использовать eventFilter или создать собственный QComboBox, где вы переопределяете метод showPopup или mousePressEvent. Я бы также рекомендовал использовать QSerialPort вместо pyserial, поскольку именно так вы используете магию сигналов. - person eyllanesc   schedule 05.02.2020mousePressEvent
имеет параметрevent
, 2. вы должны вызывать базовуюmousePressEvent
реализацию QComboBox, 3. изменять размер поля со списком при любом событии нажатия мыши - плохая идея. - person musicamante   schedule 05.02.2020