Установка одинакового поля для виджетов в QFrame

#python #pyqt #pyqt5

#python #pyqt #pyqt5

Вопрос:

У меня есть два виджета в классе QFrame. Первый виджет — это QTabWidget, а следующий — кнопка. Я пытался установить верхнее поле для кнопки. Я попытался обновить его, установив margin-top в отрицательное значение для Qpushbutton, это не сработало. Я пытался выровнять кнопку сверху, на той же высоте панели вкладок

не сработало.

 class TableTreeItemChild(QFrame):
    """Component for showing child widget of tree item"""

    def __init__(self, dbData, urlDBIndex):
        super(TableTreeItemChild, self).__init__()

        self.urlDBIndex = urlDBIndex

        self.tableTreeTab = TableTreeTab(dbData)

        self.setupUI()

    def setupUI(self):
        """Setting up the component"""
        mainLayout = QHBoxLayout()
        mainLayout.setContentsMargins(0, 0, 0, 0)

        mainLayout.addWidget(self.tableTreeTab)

        exportButton = QPushButton("")
        exportButton.setIcon(QIcon("assets/icons/export_icon_16.png"))
        exportButton.setStyleSheet("QPushButton{border: 1px solid #e1e1e1; padding:5px; border-radius:4px; } ")
        exportButton.setGeometry(0, -100, 10, 10)
        exportButton.clicked.connect(self.onExportButtonClick)

        mainLayout.addWidget(exportButton)

        self.setFixedWidth(800)
        self.setLayout(mainLayout)
 

Текущий вывод приведенного выше кода:

Текущий вывод:
Текущий вывод

Комментарии:

1. Ваш вопрос неясен. Что вы подразумеваете под «верхним краем»? Вы случайно не пытаетесь выровнять кнопку сверху, на той же высоте панели вкладок?

2. ДА.. это то, что я имел в виду

Ответ №1:

Чтобы выровнять виджет сверху в макете, alignment необходимо указать аргумент.
Помните, что addWidget() у этого есть три аргумента (обязательный виджет, растяжение и выравнивание), поэтому, если вы не укажете растяжение, выравнивание должно быть ключевым:

 mainLayout.addWidget(exportButton, alignment=QtCore.Qt.AlignTop)
 

Три соображения:

  1. установка геометрии для виджета, добавляемого в макет, бесполезна, так как макет автоматически изменит геометрию виджета в зависимости от ситуации;
  2. таблицы стилей в Qt не такие продвинутые, как «веб» CSS: они применяются только к свойствам виджетов, и они не предназначены (и не должны) для обеспечения контроля над позиционированием, изменением размера или выравниванием;
  3. хотя выравнивание приведет к размещению вашего виджета сверху, невозможно гарантировать, что он будет точно выровнен с другими виджетами, и это связано с тем, как Qt рисует элементы: могут быть некоторые обходные пути, но они не на 100% безопасны во всех ситуациях; как объяснялось выше, Qtтаблицы стилей переопределяют только внешний вид отдельных виджетов, в них нет разметки, как в обычном CSS, поскольку за это отвечают менеджеры компоновки (подклассы QLayout), и они не поддерживают таблицы стилей;