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

Размышления к определению экрана во время старта приложения под Linux.

Запись от iamvic размещена 14.01.2021 в 15:16
Показов 3762 Комментарии 0
Метки linux, pyqt5, python, python 3

Праздники закончились и появилось время разобраться с непоняткой, проявившейся на Lubuntu 18.04
с одной из быстрых настроек дополнительного экрана (см. ниже комментария
# нет устройств отображения или оно кривое в screenprobe.py
https://www.cyberforum.ru/blog... g6887.html).

С целью повышения экстрима для проведения опытов был использован давно ушедший в отставку
Toshiba NB100 с дополнительным монитором LG Flatron L1732S.

Неприятности проявили себя при выборе быстрой настройки "дополнительный экран справа от основного".
И ладно бы только моя поделка отказывалась работать, но и другие приложения, использующие Qt,
вели себя очень странно на дополнительном экране.
На прилагаемой картинке видно, как отрывается и уходит ввысь раскрытое меню у Qt Assistent,
если окно приложения находится ниже определённого уровня.

Нажмите на изображение для увеличения
Название: screeshot_with_qt_fake.jpg
Просмотров: 1579
Размер:	16.6 Кб
ID:	6701

Разобраться с происходящим помог скриптик:

checkscreen.py:
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
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import platform, sys
from PyQt5.QtCore import PYQT_VERSION_STR, QT_VERSION_STR
from PyQt5.QtWidgets import QApplication
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
 
    print('Python version {!s}'.format(sys.version))
    print('PyQt5 version {!s}'.format(PYQT_VERSION_STR))
    print('Qt5 version {!s}'.format(QT_VERSION_STR))
    print('platform.architecture() =', platform.architecture())
    print('platform.machine() =', platform.machine())
    print('platform.processor() =', platform.processor())
    print('platform.system() =', platform.system())
    print('platform.release() =', platform.release())
    print('platform.version() =', platform.version())
    print('')
 
    screens = QApplication.screens()
    for i in range(len(screens)):
        print('QApplication.screens()[{!s}].availableGeometry()\n --> {!s}'.format(
            i, screens[i].availableGeometry()))
        print('QApplication.screens()[{!s}].geometry()\n --> {!s}'.format(
            i, screens[i].geometry()))
        print('')
 
        if (int(QT_VERSION_STR.split('.')[1]) >= 10 and
            int(PYQT_VERSION_STR.split('.')[1]) >= 10):
 
            print('QApplication.screenAt(QApplication.screens()[{!s}].geometry()'
                  '.bottomLeft()).availableGeometry()\n --> {!s}'.format(
                      i,
                      QApplication.screenAt(
                          screens[i].geometry().bottomLeft()
                      ).availableGeometry()
                 ))
            print('QApplication.screenAt(QApplication.screens()[{!s}].geometry()'
                  '.bottomLeft()).geometry()\n --> {!s}'.format(
                      i,
                      QApplication.screenAt(
                          screens[i].geometry().bottomLeft()
                      ).geometry()
                 ))
            print('')
    sys.exit(0)
По результатам выполнения сразу определился виновник:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
user@nb100-user:~$./checkscreen.py
QApplication: invalid style override passed, ignoring it.
Python version 3.6.9 (default, Oct  8 2020, 12:12:24) [GCC 8.4.0]
PyQt5 version 5.10.1
Qt5 version 5.9.5
platform.architecture() = ('32bit', 'ELF')
platform.machine() = i686
platform.processor() = i686
platform.system() = Linux
platform.release() = 4.15.0-129-generic
platform.version() = #132-Ubuntu SMP Thu Dec 10 14:07:35 UTC 2020
 
QApplication.screens()[0].availableGeometry()
 --> PyQt5.QtCore.QRect(0, 0, 1024, 576)
QApplication.screens()[0].geometry()
 --> PyQt5.QtCore.QRect(0, 0, 1024, 600)
 
QApplication.screens()[1].availableGeometry()
 --> PyQt5.QtCore.QRect(1024, 0, 1280, 576)
QApplication.screens()[1].geometry()
 --> PyQt5.QtCore.QRect(1024, 0, 1280, 1024)
Из последних двух строк протокола видно, что под Lubuntu 18.04 вызов QApplication.screens()[1].availableGeometry()
возвращает довольно странный размер экрана по вертикали, что и приводит к отказам моей поделки и,
вероятно, служит причиной отрыва раскрывающегося меню в приложениях, использующих Qt.

По сути, это локальная заморочка Lubuntu, поскольку Xubuntu 18.04 на том же железе выдаёт вполне вменяемые
результаты:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
user@nb100-user:~$./checkscreen.py
Python version 3.6.9 (default, Oct  8 2020, 12:12:24) [GCC 8.4.0]
PyQt5 version 5.10.1
Qt5 version 5.9.5
platform.architecture() = ('32bit', 'ELF')
platform.machine() = i686
platform.processor() = i686
platform.system() = Linux
platform.release() = 5.4.0-60-generic
platform.version() = #67~18.04.1-Ubuntu SMP Tue Jan 5 21:52:49 UTC 2021
 
QApplication.screens[0].availableGeometry()
 --> PyQt5.QtCore.QRect(0, 25, 1024, 575)
QApplication.screens[0].geometry()
 --> PyQt5.QtCore.QRect(0, 0, 1024, 600)
 
QApplication.screens[1].availableGeometry()
 --> PyQt5.QtCore.QRect(1024, 25, 1280, 999)
QApplication.screens[1].geometry()
 --> PyQt5.QtCore.QRect(1024, 0, 1280, 1024)
И до кучи, что происходит в Windows (на моём стенде с тем же самым дополнительным монитором):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
C:\Tools>py37_64 checkscreen.py
Python version 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)]
PyQt5 version 5.9.2
Qt5 version 5.9.3
platform.architecture() = ('64bit', 'WindowsPE')
platform.machine() = AMD64
platform.processor() = Intel64 Family 6 Model 15 Stepping 11, GenuineIntel
platform.system() = Windows
platform.release() = 7
platform.version() = 6.1.7601
 
QApplication.screens()[0].availableGeometry()
 --> PyQt5.QtCore.QRect(0, 0, 1024, 728)
QApplication.screens()[0].geometry()
 --> PyQt5.QtCore.QRect(0, 0, 1024, 768)
 
QApplication.screens()[1].availableGeometry()
 --> PyQt5.QtCore.QRect(1024, 0, 1280, 1024)
QApplication.screens()[1].geometry()
 --> PyQt5.QtCore.QRect(1024, 0, 1280, 1024)
И вот теперь становится понятно, что в случае Qt5 < 5.10 для определения экрана, на котором по умолчанию
открывается окно приложения при старте, лучше использовать QScreen.geomertry().
А менять его начальную геометрию, наверное, лучше по данным QScreen.availableGeometry().

Попутно выяснилось, что первичная оценка 100 мс для задержки изменения геометрии окна слишком оптимистична
для слабого железа. X11 не успевает с отрисовкой - потребовалось 150 мс, в данном случае.
Есть повод задуматься об определении быстродействия, чтобы не играть в лотерею
Метки linux, pyqt5, python, python 3
Размещено в Памятка
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru