首页 > 解决方案 > 不能与 QComboBox 关联

问题描述

Main 类的按钮不与 Signals 的 Qcombobox 类连接

from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtWidgets import *
import sys
from PyQt5 import QtGui


class Signals(QWidget):
    asignal = pyqtSignal(str)
    def __init__(self):
        super(Signals, self).__init__()
        self.setGeometry(300, 250, 400, 300)
        self.ii()
        self.show()

    def ii(self):
        vbox = QVBoxLayout()

        self.combo = QComboBox()
        self.combo.addItem("Python")
        self.combo.addItem("Java")
        self.combo.addItem("C++")
        self.combo.addItem("C#")
        self.combo.addItem("Ruby")

        self.buttom = QPushButton("Click")
        self.buttom.clicked.connect(self.windown2)
        vbox.addWidget(self.combo)
        vbox.addWidget(self.buttom)
        self.setLayout(vbox)
    def do_something(self):
        self.asignal.emit(self.combo.currentText())

    def windown2(self):
        self.ggpp = Main()  
        self.ggpp.show()


class Main(QWidget):

    def __init__(self):
        super(Main, self).__init__()
        self.setGeometry(500,150, 600, 300)
        vbox1 = QVBoxLayout()

        self.buttom1 = QPushButton("Click")
        self.buttom1.clicked.connect(self.coso1)
    
        vbox1.addWidget(self.buttom1)
        self.setLayout(vbox1)

    def coso1(self):
        s = Signals()
        s.asignal.connect(lambda sig: print("self.combo.currentText()>>>>>" + sig))
        s.do_something()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    nals = Signals()
    nals.show()
    sys.exit(app.exec())

在此处输入图像描述

在此处输入图像描述

标签: pyqt5

解决方案


您看到的情况是因为您没有使用 的现有实例Signals,但每次单击按钮时都会创建一个新实例。

在您的情况下,您可以在创建新窗口时添加对实例的引用作为参数,以便您可以正确连接到它的信号。

class Signals(QWidget):
    # ...
    def windown2(self):
        self.ggpp = Main(self)
        self.ggpp.show()

class Main(QWidget):
    def __init__(self, signals):
        super(Main, self).__init__()

        self.signals = signals
        self.signals.asignal.connect(self.coso1)

        self.setGeometry(500,150, 600, 300)
        vbox1 = QVBoxLayout()

        self.buttom1 = QPushButton("Click")
        self.buttom1.clicked.connect(self.signals.do_something)
    
        vbox1.addWidget(self.buttom1)
        self.setLayout(vbox1)

    def coso1(self, sig):
        print("self.combo.currentText()>>>>>" + sig)

推荐阅读