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)
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