【问题标题】:why can't i put events on pyqt widget from a different class?为什么我不能将事件放在不同类的 pyqt 小部件上?
【发布时间】:2016-12-23 21:54:55
【问题描述】:

此代码只是打印出组合框中的当前项目。
我可以通过 MyWindow 类在组合框上放置一个事件,效果很好
我无法通过 UiMainWindowsEvents 类在组合框上放置事件,为什么??????
我只是希望我的代码更加面向对象,如果我的 gui 很大,不希望所有东西都在一个类中混乱。

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class UiMainWindow():
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.verticalLayoutWidget = QtGui.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(110, 80, 101, 151))
        self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setMargin(0)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.comboBox = QtGui.QComboBox(self.verticalLayoutWidget)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.comboBox.sizePolicy().hasHeightForWidth())
        self.comboBox.setSizePolicy(sizePolicy)
        self.comboBox.setObjectName(_fromUtf8("comboBox"))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.verticalLayout.addWidget(self.comboBox)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.comboBox.setItemText(0, QtGui.QApplication.translate("MainWindow", "item1", None, QtGui.QApplication.UnicodeUTF8))
        self.comboBox.setItemText(1, QtGui.QApplication.translate("MainWindow", "item2", None, QtGui.QApplication.UnicodeUTF8))
        self.comboBox.setItemText(2, QtGui.QApplication.translate("MainWindow", "item3", None, QtGui.QApplication.UnicodeUTF8))
        self.comboBox.setItemText(3, QtGui.QApplication.translate("MainWindow", "item4", None, QtGui.QApplication.UnicodeUTF8))



class MyWindow():
    def __init__(self):
        self.ui_mainwindow = UiMainWindow()
        qwindowobj = QtGui.QMainWindow()
        self.ui_mainwindow.setupUi(qwindowobj)
        qwindowobj.show()

        UiMainWindowEvents(self.ui_mainwindow)      #this doens't work
        # self.ui_mainwindow.comboBox.activated['QString'].connect(self.comboboxSelect)       #this works

    def comboboxSelect(self, name):
        print(name)


class UiMainWindowEvents():
    def __init__(self, uimainwindow_obj):
        self.uimainwindow_obj = uimainwindow_obj
        self.uimainwindow_obj.comboBox.activated['QString'].connect(self.comboboxSelect)


    def comboboxSelect(self, name):
        print(name)


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = MyWindow()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python-2.7 qt combobox pyqt4


    【解决方案1】:

    我认为您需要存储 UiMainWindowEvents 对象,这样它就不会被垃圾回收。

    self.uiMainWindowEvents = UiMainWindowEvents(self.ui_mainwindow)
    

    【讨论】:

    • 那行得通。我需要阅读 python 中的垃圾收集
    猜你喜欢
    • 1970-01-01
    • 2019-05-07
    • 2020-04-20
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多