Форум программистов, компьютерный форум, киберфорум
iamvic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
Путевые заметки в процессе познания Python и PyQt/PySide.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.

К вопросу о дизайне.

Запись от iamvic размещена 05.10.2022 в 23:08
Показов 1501 Комментарии 0

Редко пользуюсь Qt Designer-ом, поэтому всё время забываю первое правило дизайнера Сначала выложи весь расклад и только потом пакуй.

Например, для создания нижеприведённого файла дизайна (example.ui):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>553</width>
    <height>403</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QHBoxLayout" name="horizontalLayout">
    <item>
     <layout class="QGridLayout" name="gridLayout">
      <item row="0" column="0">
       <widget class="QTimeEdit" name="timeEdit"/>
      </item>
      <item row="1" column="0">
       <widget class="QCalendarWidget" name="calendarWidget"/>
      </item>
      <item row="2" column="0">
       <widget class="QLineEdit" name="lineEdit"/>
      </item>
      <item row="3" column="0">
       <widget class="QPushButton" name="pushButton">
        <property name="text">
         <string>PushButton</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
    <item>
     <widget class="QListWidget" name="listWidget"/>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>553</width>
     <height>32</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
потребовалось выполнить следующие действия:

1. после запуска Qt Designer выбрать пункт меню File --> New... в главном окне приложения
2. в открывшемся диалоге New Form выбрать строку Main Window в списке templates/forms и нажать кнопку Create (или просто щёлкнуть ЛКМ по этой строке)
3. перетащить на рабочее окно виджет Grid Layout, расположив его у левой границы рабочего окна с размерами в половину ширины рабочего окна,
4. последовательно заполнить Grid Layout виджетами Time Edit, Calendar Widget, Line Edit, Push Button по вертикали сверху вниз, поскольку здесь уже первое правило не работает - надо сначала тару приготовить, а потом раскладывать,
5. перетащить на рабочее окно виджет List Widget, расположив его у правой границы рабочего окна вне Grid Layout так, чтобы он не вылезал за пределы верхней и нижней границ Grid Layout,
6. щёлкнуть ПКМ по корню QMainWidow в Object Inspector,
7. выбрать в выпадающем меню пункты Lay out --> Lay Out Horizontally,
8. после выполнения этих действий вся эта совокупность виджетов сама выравняется по ширине и высоте главного окна и получившийся дизайн можно сохранить в файл.

Стоит отметить, что именно выполнение пункта 7 позволяет получить, как и было задумано, "резиновый" виджет.

А для проверки годности может пригодиться такая поделка:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
 
from PyQt5 import uic
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtCore import QTranslator, QLibraryInfo, QLocale
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QFileDialog, QMessageBox
from PyQt5.QtWidgets import QMainWindow, QDialog, QWidget
from PyQt5.QtWidgets import QStyleOption, QStyle
 
APP_NAME = 'UI Check Probe v0.01'
 
class Main_window(QMainWindow):
    def __init__(self, parent=None, fname=None):
        super(Main_window, self).__init__(parent)
        uic.loadUi(fname, self)
 
 
class Dialog(QDialog):
    def __init__(self, parent=None, fname=None):
        super(Dialog, self).__init__(parent)
        uic.loadUi(fname, self)
 
 
class Widget(QWidget):
    def __init__(self, parent=None, fname=None):
        super(Widget, self).__init__(parent)
        uic.loadUi(fname, self)
 
    def paintEvent(self, e):
        # иначе на этот виджет будет невозможно натянуть стиль
        opt = QStyleOption()
        opt.initFrom(self)
        p = QPainter(self)
        self.style().drawPrimitive(QStyle.PE_Widget, opt, p, self)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setApplicationName(APP_NAME)
 
    qtrn = QTranslator()
    # без этого в некоторых системах часть виджетов не русифицируется,
    # например, все стандартные диалоги под Windows
    if QLocale().name()[0:2] != 'en':
        qtrn.load('qtbase_' + QLocale().name()[0:2],
                  QLibraryInfo.location(QLibraryInfo.TranslationsPath))
        app.installTranslator(qtrn)
 
    fname = QFileDialog.getOpenFileName(
        None, 'Выберите файл', './', 'Файлы дизайна (*.ui)')
    if not fname[0]:
        sys.exit(1)
 
    f_ui = open(fname[0], 'r')
    for i in range(4):
        l_ui = ''
        l_ui = f_ui.readline()
    f_ui.close()
 
    s = l_ui.split('"')
    c_ui = s[1] if (s[0] == ' <widget class=' and
                    s[1] in ['QMainWindow','QDialog','QWidget']) else ''
 
    if c_ui == 'QMainWindow':
        w = Main_window(None, fname[0])
        w.show()
        sys.exit(app.exec_())
    elif c_ui == 'QDialog':
        w = Dialog(None, fname[0])
        sys.exit(w.exec_())
    elif c_ui == 'QWidget':
        w = Widget(None, fname[0])
        w.show()
        sys.exit(app.exec_())
    else:
        w = QMessageBox(
                QMessageBox.Critical,
                'Невозможно работать !!!',
                'Приём на дизайн осуществляется только для классов'
                ' <b>QMainWindow, QDialog, QWidget</b>.',
                QMessageBox.Ok,
                None)
        sys.exit(w.exec_())
Размещено в Памятка
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru