Праздники закончились и появилось время разобраться с непоняткой, проявившейся на Lubuntu 18.04
с одной из быстрых настроек дополнительного экрана (см. ниже комментария
# нет устройств отображения или оно кривое в screenprobe.py
https://www.cyberforum.ru/blog... g6887.html).
С целью повышения экстрима для проведения опытов был использован давно ушедший в отставку
Toshiba NB100 с дополнительным монитором LG Flatron L1732S.
Неприятности проявили себя при выборе быстрой настройки "дополнительный экран справа от основного".
И ладно бы только моя поделка отказывалась работать, но и другие приложения, использующие Qt,
вели себя очень странно на дополнительном экране.
На прилагаемой картинке видно, как отрывается и уходит ввысь раскрытое меню у Qt Assistent,
если окно приложения находится ниже определённого уровня.

Разобраться с происходящим помог скриптик:
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 мс, в данном случае.
Есть повод задуматься об определении быстродействия, чтобы не играть в лотерею
|