pyqt5 - подключить функцию при нажатии QComboBox

Я пытаюсь получить список портов с помощью 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_())

Если у кого-то есть идея, это было бы очень признательно.


person Alon123    schedule 05.02.2020    source источник
comment
Ваш вопрос немного не ясен. Вы хотите, чтобы поле со списком изменяло свой размер до текущего текста элемента всякий раз, когда на него нажимают?   -  person musicamante    schedule 05.02.2020
comment
Да, но это не моя проблема... моя проблема в том, что функция, проверяющая порты и изменяющая размер поля со списком, вызывается без моего нажатия на поле со списком.   -  person Alon123    schedule 05.02.2020
comment
Это из-за строки self.ui.portList.mousePressEvent=self.findPort(). Я думаю, вы имели в виду self.ui.portList.mousePressEvent=self.findPort (без скобок), но это не путь вперед. Вы можете попробовать создать подкласс QComboBox и переопределить QComboBox.showPopup и QComboBox.hidePopup.   -  person Heike    schedule 05.02.2020
comment
без круглых скобок он не запускается сразу, но когда я нажимаю на него, я получаю сообщение о том, что findport() принимает 1 аргумент, но дается 2.... не знаю, почему   -  person Alon123    schedule 05.02.2020
comment
@ Alon123 Alon123 Не используйте self.ui.portList.mousePressEvent=self.findPort, лучше использовать eventFilter или создать собственный QComboBox, где вы переопределяете метод showPopup или mousePressEvent. Я бы также рекомендовал использовать QSerialPort вместо pyserial, поскольку именно так вы используете магию сигналов.   -  person eyllanesc    schedule 05.02.2020
comment
Я действительно считаю, что у вас возникла проблема XY. Помимо проблемы с использованием вызова функции вместо вызываемого, вы должны: 1. помнить, что mousePressEvent имеет параметр event, 2. вы должны вызывать базовую mousePressEvent реализацию QComboBox, 3. изменять размер поля со списком при любом событии нажатия мыши - плохая идея.   -  person musicamante    schedule 05.02.2020
comment
eyllanesc, не могли бы вы указать мне руководство или расширенное объяснение того, как это сделать, пожалуйста? так как я не уверен, что такое eventFilter или как создать собственный QComboBox   -  person Alon123    schedule 05.02.2020