Визуальная замена области подвиджетов в паре пользовательских виджетов одним виджетом в PyQt5?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Визуальная замена области подвиджетов в паре пользовательских виджетов одним виджетом в PyQt5?

Сообщение Anonymous »

В приведенном ниже примере кода у меня есть CustomWidget, состоящий из основной метки (красной) вверху и дополнительной метки (желтой) внизу, и я создаю несколько из них в области прокрутки:
Изображение

Когда я нажимаю кнопку «Объединить ", я бы хотел, чтобы последовательные пары подметок были заменены одной подметкой, имеющей текст левой подметки и покрывающей область обеих подметок - что-то вроде этого (отредактировано в программном обеспечении для обработки изображений ):
Изображение

Поэтому я подумал: я просто рассчитаю ширину «объединенной» подметки, применю ее к левой подметке и скрою правую подметку, чтобы добиться этого эффекта - к сожалению, это не так. Это не сработает, так как это портит другие ранее установленные отношения макета, поэтому фактический результат выглядит примерно так:
[img]https:/ /i.sstatic.net/jty2qWkF.png[/img]

Как мне добиться желаемого попарного визуального объединения вложенных меток?
Код:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class CustomWidget(QWidget):
def __init__(self, parent=None, maintext=""):
super().__init__(parent)
self.maintext = maintext
self.origwidth = 50
self.lbl_main = QLabel(self.maintext)
self.lbl_main.setAlignment(Qt.AlignCenter)
self.lbl_main.setMinimumWidth(self.origwidth)
self.lbl_main.setFixedWidth(self.origwidth)
self.lbl_main.setFixedHeight(100)
self.lbl_main.setStyleSheet("background: #3FFF0000;")
self.lbl_sub = QLabel("sub_{}".format(self.maintext))
self.lbl_sub.setAlignment(Qt.AlignCenter)
self.lbl_sub.setMinimumWidth(self.origwidth)
self.lbl_sub.setFixedWidth(self.origwidth)
self.lbl_sub.setFixedHeight(20)
self.lbl_sub.setStyleSheet("background: #3FFFFF00; border: 1px solid black;")
self.vspacer = QLabel()
self.layout = QVBoxLayout(self)
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.setSpacing(0)
self.layout.addWidget(self.lbl_main)
self.layout.addWidget(self.lbl_sub)
self.layout.addWidget(self.vspacer)
self.layout.setAlignment(self.lbl_main, Qt.AlignHCenter)
self.layout.setAlignment(self.lbl_sub, Qt.AlignHCenter)
self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)

class MyMainWindow(QMainWindow):
def __init__(self):
super(MyMainWindow, self).__init__()
self.num_cws = 10
# Define the geometry of the main window
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle("my first window")
self.centralwidget = QWidget(self)
self.layout = QHBoxLayout(self.centralwidget)
#self.centralwidget.setLayout(self.layout)
self.setCentralWidget(self.centralwidget)
self.scroll_area = QScrollArea()
self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.scroll_central = QWidget()
self.scroll_layout = QHBoxLayout(self.scroll_central)
self.scroll_area.setWidget(self.scroll_central)
self.scroll_area.setWidgetResizable(True)
self.layout.addWidget(self.scroll_area)
self.btn = QPushButton(text = 'Merge')
self.layout.addWidget(self.btn)
self.btn.clicked.connect(self.onBtnClick)
self.customwidgets = []
for ix in range(self.num_cws):
cw = CustomWidget(None, "{0}{0}".format(chr(65+ix)))
self.scroll_layout.addWidget(cw)
self.customwidgets.append(cw)
self.show()

def onBtnClick(self):
if self.btn.text() == "Merge":
self.btn.setText("Unmerge")
for ix in range(0, self.num_cws, 2):
cw_left = self.customwidgets[ix]
cw_right = self.customwidgets[ix+1]
llblgeom = cw_left.lbl_sub.geometry().translated( cw_left.lbl_sub.mapTo(self.scroll_central, QPoint(0,0)) )
rlblgeom = cw_right.lbl_sub.geometry().translated( cw_right.lbl_sub.mapTo(self.scroll_central, QPoint(0,0)) )
lbl_dual_width = rlblgeom.right() - llblgeom.left()
cw_right.lbl_sub.hide()
cw_left.lbl_sub.setFixedWidth(lbl_dual_width)
else:
self.btn.setText("Merge")
for ix in range(0, self.num_cws, 2):
cw_left = self.customwidgets[ix]
cw_right = self.customwidgets[ix+1]
cw_left.lbl_sub.setFixedWidth(cw_left.origwidth)
cw_right.lbl_sub.show()

if __name__== '__main__':
app = QApplication(sys.argv)
myGUI = MyMainWindow()
sys.exit(app.exec_())


Подробнее здесь: https://stackoverflow.com/questions/788 ... h-a-single
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»