class LabelledComboBox(QWidget):
    currentIndexChanged = pyqtSignal(int)

    def __init__(self, align_flag=Qt.AlignLeft, label=None, spacer=None):
        QWidget.__init__(self)
        self.layout = QVBoxLayout()
        if label is not None:
            self.label = QLabel(label)
            self.label.setWordWrap(True)
            self.label.setStyleSheet("font: 8px")
            self.label.setContentsMargins(0, 0, 0, 0)
            self.label.setAlignment(align_flag)
            self.layout.addWidget(self.label)
        self.box = QComboBox()
        self.box.currentIndexChanged.connect(lambda x: self.currentIndexChanged.emit(x))
        self.layout.addWidget(self.box)
        if spacer == "lower":
            self.layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding))
        if spacer == "upper":
            self.layout.insertSpacerItem(0, QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding))
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.layout)

    def currentIndex(self):
        return self.box.currentIndex()

    def currentText(self):
        return self.box.currentText()

    def setCurrentIndex(self, index):
        self.box.setCurrentIndex(index)

    def addItem(self, item):
        self.box.addItem(item)
Esempio n. 2
0
class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.s = self
        self.setWindowTitle("Динамический label")
        self.setGeometry(0, 0, 400, 300)
        self.button = QPushButton("создать label", self)
        self.button.clicked.connect(self.run)
        self.button.setGeometry(200, 100, 100, 20)
        self.panel = QVBoxLayout(self)
        #self.panel.addWidget(self.button)

        self.frame = QFrame(self)
        self.frame.setMinimumSize(200, 300)
        self.frame.setFrameStyle(QFrame.Box)
        self.frame.setLayout(self.panel)

        #self.panel.setGeometry(self.rect())
        #self.setLayout(self.panel)
        #self.run()

    def run(self):
        spacerItem = QSpacerItem(20, 55)
        self.panel.insertSpacerItem(0, spacerItem)
        label = QLabel('This is label')
        #label.setGeometry(100, 100, 100, 20)
        #self.panel.addWidget(spacerItem)
        self.panel.addWidget(label)
        #self.panel.insertWidget(1, label)
        self.panel.addStretch()
 def __init__(self, text="", align_flag=Qt.AlignLeft, label=None, spacer=None):
     QWidget.__init__(self)
     layout = QVBoxLayout()
     if label is not None:
         self.label = QLabel(label)
         self.label.setWordWrap(True)
         self.label.setStyleSheet("font: 8px")
         self.label.setContentsMargins(0, 0, 0, 0)
         self.label.setAlignment(align_flag)
         layout.addWidget(self.label)
     self.text = QLabel()
     self.text.setAlignment(align_flag)
     self.text.setContentsMargins(0, 0, 0, 0)
     layout.addWidget(self.text)
     layout.setSpacing(0)
     if spacer == "lower":
         layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding))
     if spacer == "upper":
         layout.insertSpacerItem(0, QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding))
     layout.setContentsMargins(0, 0, 0, 0)
     self.set_text(text)
     self.setLayout(layout)
class LabelledTextEdit(QWidget):
    text_changed = pyqtSignal(str, str)

    def __init__(self, name, align_flag=Qt.AlignLeft, label=None, spacer=None):
        QWidget.__init__(self)
        self.layout = QVBoxLayout()
        self.name = name
        if label is not None:
            self.label = QLabel(label)
            self.label.setWordWrap(True)
            self.label.setStyleSheet("font: bold 14px")
            self.label.setContentsMargins(0, 0, 0, 0)
            self.label.setAlignment(align_flag)
            self.layout.addWidget(self.label)
        self.text_edit = QTextEdit()
        self.text_edit.textChanged.connect(lambda: self.text_changed.emit(self.name, self.get_text()))
        self.layout.addWidget(self.text_edit)
        if spacer == "lower":
            self.layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding))
        if spacer == "upper":
            self.layout.insertSpacerItem(0, QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding))
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.layout)

    def format_label(self, size=14, bold=True, italic=False):
        self.label.setStyleSheet("font: {} {} {}px".format("bold" if bold else "", "italic" if italic else "", size))

    def get_text(self):
        return self.text_edit.toPlainText()

    def set_text(self, text):
        if not text:
            return
        if isinstance(text, list):
            text = text[0]
        self.text_edit.setText(text)

    def get_data(self):
        return self.get_text()
class InputLine(QWidget):
    value_changed = pyqtSignal(str, str)

    def __init__(self, name, align_flag=Qt.AlignCenter, enabled=True, val_dict=None, min_val=None, max_val=None,
                 dtype="str", maxwidth=None, label=None, spacer=None):
        QWidget.__init__(self)
        self.linked = False
        self.linked_value = None
        self.dtype = dtype
        self.layout = QVBoxLayout()
        if label is not None:
            self.label = QLabel(label)
            self.label.setWordWrap(True)
            self.label.setStyleSheet("font: 8px")
            self.label.setContentsMargins(0, 0, 0, 0)
            self.layout.addWidget(self.label)
            self.layout.setSpacing(0)
        self.line = QLineEdit()
        self.line.editingFinished.connect(self.emit_changed)
        self.line.setContentsMargins(0, 0, 0, 0)
        self.line.setEnabled(enabled)
        self.line.setStyleSheet(line_edit_style)
        self.line.setAlignment(align_flag)
        self.name = name
        if maxwidth is not None:
            self.setMaximumWidth(maxwidth)
        if self.dtype == "int":
            self.line.setValidator(MyIntValidator(min_val, max_val))
        if self.dtype == "float":
            self.line.setValidator(MyFloatValidator(min_val, max_val))
        if self.dtype == "equation":
            self.line.setValidator(MyEquationValidator(min_val, max_val))
        self.register_field(val_dict=val_dict)
        self.layout.addWidget(self.line)
        if spacer == "lower":
            self.layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding))
        if spacer == "upper":
            self.layout.insertSpacerItem(0, QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding))
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.layout)

    def format_label(self, size=14, bold=True, italic=False):
        self.label.setStyleSheet("font: {} {} {}px".format("bold" if bold else "", "italic" if italic else "", size))

    def emit_changed(self):
        if self.linked:
            data = self.get_data()
            self.linked_value = data
        self.value_changed.emit(self.name, self.text())

    def text(self):
        return self.line.text()

    def link_value(self, value):
        self.linked = True
        self.linked_value = value
        self.setText(str(self.linked_value))

    def setText(self, value):
        self.line.setText(str(value))

    def register_field(self, val_dict):
        if val_dict is None:
            return
        val_dict[self.name] = self

    def set_enabled(self, enabled):
        self.line.setEnabled(enabled)

    def get_data(self):
        text = self.text()
        if self.dtype == "int":
            return int(text)
        if self.dtype == "float":
            return float(text)
        if self.dtype == "equation":
            return text
        return text