У вашего подхода есть две основные и общие проблемы.
* НИКОГДА * не редактируйте вывод pyuic
Это происходит очень часто: вы получаете хорошо отформатированный файл python и заставляют думать, что вы можете использовать этот файл для написания своей программы.
Возможно, вы также заметили предупреждение в этом файле:
# WARNING! All changes made in this file will be lost!
Как вы уже узнали, как только вам нужно будет изменить пользовательский интерфейс, вы попадете в беспорядок объединения новых модификаций с уже написанным вами кодом.
Суть в том, что вы должны думать об этих файлах как о ресурсных файлах (в отличие от изображения, базы данных или файла конфигурации), и их нужно использовать как таковые: поскольку они python файлы, они могут быть импортированы как модуль, и их классы должны использоваться для создания интерфейса ваших актуальных виджетов и windows.
. Есть три основных способа сделать это все они объяснены в с использованием документа Designer
Я настоятельно рекомендую вам использовать третий метод (подход множественного наследования), поскольку он позволяет вам иметь ссылки на объекты пользовательского интерфейса в качестве прямых атрибутов экземпляра (self.tabWidget
, et c.).
Кроме того, вы можете полностью отказаться от подхода pyui c и напрямую импортировать файлы .ui
с помощью функции loadUI
из модуля uic
.
from PyQt5 import QtWidgets
from PyQt5 import uic
class MyWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
uic.loadUI('mywindow.ui', self)
Это позволяет сэкономить некоторое время, поскольку вам не нужно перестраивать файл каждый раз, когда вы вносите изменения; также иногда можно забыть сделать этот шаг, что может создать некоторую путаницу.
Просто помните, что этот путь всегда относительно файла, который содержит класс, который его загрузит (и абсолютные пути никогда не должны использоваться).
Всегда используйте менеджер раскладки
Использование фиксированных размеров и позиций виджетов обычно не рекомендуется, так как то, что вы видите на вашем компьютере, вероятно, будет сильно отличаться от других.
Это может зависеть от ряда аспектов, но самое главное:
- операционная система (и ее версия);
- настройки экрана (разрешение, стандартное или высокое разрешение - например, экраны Retina) ;
- пользовательская настройка (размеры шрифтов по умолчанию, некоторые «темы», которые используют разные поля и пробелы между объектами);
Все это потенциально делает фиксированный макет непригодным для использования, поскольку виджеты могут перекрываться или становятся невидимыми, потому что скрыты другими или потому что доступного размера экрана недостаточно для отображения интерфейса как Вы разработали его.
Использование менеджеров компоновки упрощает все это, потому что они автоматически изменят размер интерфейса, гарантируя, что все виджеты будут по крайней мере использовать столько места, сколько им нужно, оставляя место для тех, кто может воспользоваться преимуществами использования большего количества size.
Хотя это может показаться более сложным в управлении (особенно для сложных интерфейсов), это просто привычка.
В большинстве случаев вы получаете вложенных макетов, но с ними все в порядке.
В вашем случае вы, вероятно, будете использовать что-то вроде следующей структуры:
- вертикальный макет в качестве основного макета;
- горизонтальное расположение сверху;
- горизонтальная прокладка с фиксированной шириной;
- поле со списком;
- еще одна горизонтальная прокладка для правого поля;
- вкладка;
- вертикальная раскладка для первой вкладки;
- два вертикально выровненных групповых блока
- горизонтальный макет для второй вкладки;
- два горизонтально выровненных групповых блока;
- ...
Как последнее замечание, я не думаю, что вам нужно использовать прокси-стиль для настройки размера прямоугольника: как вы можете видеть, текст обрезается, и это связано с тем, как вы рисуете и вращаетесь, что также приводит к к окраске вопроса о вкладке фона. Удалите размеры из таблицы стилей и прокси-стиля, затем используйте эти значения размеров в пределах tabSizeHint()
:
def tabSizeHint(self, index):
s = QtWidgets.QTabBar.tabSizeHint(self, index)
s.transpose()
s.setHeight(max(s.height(), 50))
s.setWidth(max(s.width(), 100))
return s
Поскольку существует небольшое перекрытие между панелью вкладок и содержимым вкладок, вы можете убедиться, что они правильно выровнены установив смещение псевдоэлементов ::pane
и ::tab-bar
:
QTabWidget::pane {top: 0px;}
QTabWidget::tab-bar {right: 0px;}
Кроме того, убедитесь, что таблица стилей верхнего кадра применяется только к объектам QFrame (и, возможно, к имени объекта), в противном случае к каждому дочернему виджету будет наследовать.
self.frame.setStyleSheet("QFrame#frame {background-color: rgb(59, 118, 150);}")
Имея все это в виду, вы получите более чистый внешний вид, правильное отображение и расположение виджета / панели вкладок, гибкость компоновки и, что самое важное, возможность редактировать интерфейс на лету без дальнейших проблем и головной боли: -)