Qcombobox с Qlabel и сигналом и слотом - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть Qgroupbox, который содержит Qcombobox с Qlabels, я хочу выбрать значение из Qcombobox и отобразить его как Qlabel.У меня есть полный код, даже если я печатаю значение до и после внутри функции, все работает как надо. Только отображение setText не устанавливает текст в Qlabel и не обновляет его.

Текущий экран

enter image description here

Что я хочу

enter image description here

Я исправил код сигнала, когда Qgroupbox в нем Qcombobox появляется или значение будет изменено, self.activation.connect(......) будет испускать int индекса.чтобы убедиться, что это сработает, я печатаю it-value внутри def setdatastrength(self, index), см. рисунок ниже, он действительно работает, затем будет передан аргумент в функцию self.concreteproperty.display_condata(it), и я сделаю вывод значения внутри def display_condata(self, value), чтобы убедиться, чтоПередача значения, как показано на рисунке ниже, работает.Код этой строки self.con_strength_value.setText(fmt.format(L_Display)) не будет присваивать значение Qlabel.

enter image description here

Сценарий

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class secondtabmaterial(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(secondtabmaterial, self).__init__(parent)

        self.concretewidgetinfo = ConcreteStrengthInFo()

        Concrete_Group = QtWidgets.QGroupBox(self)
        Concrete_Group.setTitle("&Concrete")
        Concrete_Group.setLayout(self.concretewidgetinfo.grid)


class ConcreteStrengthComboBox(QtWidgets.QComboBox):
    def __init__(self, parent = None):
        super(ConcreteStrengthComboBox, self).__init__(parent)


        self.addItems(["C12/15","C16/20","C20/25","C25/30","C30/37","C35/45"
                     ,"C40/50","C45/55","C50/60","C55/67","C60/75","C70/85",
                                                        "C80/95","C90/105"])

        self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))

        self.compressive_strength = ["12","16","20","25","30","35","40",
                                      "45","50","55","60","70","80","90"]


class ConcreteProperty(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ConcreteProperty, self).__init__(parent)
        self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))


        concretestrength_lay = QtWidgets.QHBoxLayout(self)
        fctd = "\nfcd\n\nfctd\n\nEc"
        con_strength = QtWidgets.QLabel(fctd)
        self.con_strength_value = QtWidgets.QLabel(" ")
        concretestrength_lay.addWidget(con_strength)
        concretestrength_lay.addWidget(self.con_strength_value, alignment=QtCore.Qt.AlignRight)
        self.setLayout(concretestrength_lay)

    @QtCore.pyqtSlot(int)
    def display_condata(self, value):
        try:
            L_Display = str(value)
            print("-------- After ------")
            print(L_Display, type(L_Display))

            fmt = "{}mm"
            self.con_strength_value.setText(fmt.format(L_Display))

       except ValueError:
           print("Error")

class ConcreteStrengthInFo(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ConcreteStrengthInFo, self).__init__(parent)

        self.concreteproperty = ConcreteProperty()
        self.concretestrengthbox = ConcreteStrengthComboBox()

        self.concretestrengthbox.activated.connect(self.setdatastrength)

        hbox = QtWidgets.QHBoxLayout()
        concrete_strength = QtWidgets.QLabel("Concrete strength: ")
        hbox.addWidget(concrete_strength)
        hbox.addWidget(self.concretestrengthbox)

        self.grid = QtWidgets.QGridLayout()
        self.grid.addLayout(hbox, 0, 0)
        self.grid.addWidget(self.concreteproperty, 1, 0)

    @QtCore.pyqtSlot(int)
    def setdatastrength(self, index):
        it = self.concretestrengthbox.compressive_strength[index]
        self.concreteproperty.display_condata(it)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = secondtabmaterial()
    w.show()
    sys.exit(app.exec_())

Над кодом исправлен и окончательный.Теперь работает как надо.

enter image description here

1 Ответ

0 голосов
/ 21 сентября 2018

Думаю, проблема в том, что ваш принимающий слот не соответствует ни одному из доступных .activated сигналов.

self.activated.connect(self.setdatastrength)

@QtCore.pyqtSlot()
def setdatastrength(self):
    index = self.currentIndex()
    it = self.compressive_strength[index]
    print(it)
    self.concreteproperty.display_condata(it)    

Сигнал QComboBox.activated испускает либо int индекса, либоstr выбранного значения. См. Документацию .

Вы прикрепили его к setdatastrength, который принимает, не принимает никаких параметров (кроме self, от объекта) - это означает, что это не таксоответствует сигнатуре любого доступного сигнала и не будет вызван.Если вы обновите определение, добавив значение индекса, и примете одно значение int, оно должно работать.

self.activated.connect(self.setdatastrength)

@QtCore.pyqtSlot(int)  # add the target type for this slot.
def setdatastrength(self, index):
    it = self.compressive_strength[index]
    print(it)
    self.concreteproperty.display_condata(it)    

После обновления - вышеприведенное выглядит как исправленное, хотя вам не нужнодополнительные index = self.currentIndex() в setdatastrength не приносят никакого вреда.

Глядя на ваш код, я думаю, что ярлык обновляется .Проблема на самом деле в том, что вы вообще не видите лейбл.Глядя на инициализацию для ConcreteProperty

class ConcreteProperty(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ConcreteProperty, self).__init__(parent)
        self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))


        self.concretestrength_lay = QtWidgets.QHBoxLayout()
        fctd = "\nfcd\n\nfctd\n\nEc"
        con_strength = QtWidgets.QLabel(fctd)
        self.con_strength_value = QtWidgets.QLabel(" ")
        self.concretestrength_lay.addWidget(con_strength)
        self.concretestrength_lay.addWidget(self.con_strength_value, alignment=QtCore.Qt.AlignLeft)

Причина, по которой изменения не появляются, заключается в том, что вы создаете два ConcreteProperty объектов, один в ConcreteStrengthInfo и один в ConcreteStrengthComboBox.Обновления в поле со списком вызывают обновление ConcreteProperty, прикрепленного к комбинированному списку, а не другого (они являются отдельными объектами).На видимое ConcreteProperty это не влияет.

Чтобы это работало, вам нужно переместить вложение сигнала + слот из объекта комбинированного окна.Следующее является заменой для двух частей -

class ConcreteStrengthComboBox(QtWidgets.QComboBox):
    def __init__(self, parent = None):
        super(ConcreteStrengthComboBox, self).__init__(parent)

        self.addItems(["C12/15","C16/20","C20/25","C25/30","C30/37","C35/45","C40/50","C45/55",
                       "C50/60","C55/67","C60/75","C70/85","C80/95","C90/105"])

        self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))

        self.compressive_strength = ["12","16","20","25","30","35","40","45","50","55",
                                     "60","70","80","90"]




class ConcreteStrengthInFo(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ConcreteStrengthInFo, self).__init__(parent)

        hbox = QtWidgets.QHBoxLayout()
        concrete_strength = QtWidgets.QLabel("Concrete strength: ")
        hbox.addWidget(concrete_strength)

        self.concreteproperty = ConcreteProperty()
        self.concretestrengthbox = ConcreteStrengthComboBox()
        hbox.addWidget(self.concretestrengthbox)


        self.concretestrengthbox.activated.connect(self.setdatastrength)

        self.vlay = QtWidgets.QVBoxLayout()
        self.vlay.addLayout(hbox)
        self.vlay.addLayout(self.concreteproperty.concretestrength_lay)


    @QtCore.pyqtSlot(int)
    def setdatastrength(self, index):
        it = self.concretestrengthbox.compressive_strength[index]
        print(it)
        self.concreteproperty.display_condata(it)

Это работает для меня локально.

...