Установить свойства виджета в PySide можно не только через соответствующие методы и конструктор класса. Можно их изменять с помощью метода setProperty по имени.
btn = QPushButton("Click Me")
btn.setProperty("flat", True)
Это аналогично вызову
btn.setFlat(True)
Если указать несуществующее свойство, то оно просто создается
btn.setProperty("btnType", "super")
Получить его значение можно методом .property(name)
btn_type = btn.property("btnType")
Когда это может быть полезно?
▫️Можно просто хранить какие то данные в виджете и потом их доставать обратно
widget = QWidget()
widget.setProperty('my_data', 123)
print(widget.property('my_data'))
▫️ Назначая эти свойства разным виджетам можно потом отличить виджеты во время итераци по ним. Например, найти все кнопки со свойством my_data="superbtn".
Но ведь вместо кастомного свойства можно использовать objectName, будет тот же результат.
Да, но y ObjectName есть ограничение - только строки.
▫️ Если нам потребуется не просто поиск а, например, сортировка по числу, то свойства позволяют нам это сделать. Поддерживается любой тип данных
widget.setProperty('my_data', {'Key': 'value'})
widget.setProperty('order', 1)
all_widgets.sort(key=w: w.property('order'))
Но ведь Python позволяет всё вышеперечисленное сделать простым созданием атрибута у объекта
widget.order = 1
widget.my_data = 123
Да, но я думаю что не надо объяснять почему не стоит так делать. К тому же, если у виджета нет свойства то метод .property(name) вернет None, а отсутствующий атрибут выбросит исключение.
▫️ Действительно полезное применение кастомным свойствам - контроль стилей. Здесь атрибутами не обойтись, нужны именно свойства.
Дело в том, что в селекторах стилей можно указывать конкретные свойства виджетов на которые следует назначать стиль.
Просто запустите этот код
from PySide2.QtWidgets import *
if __name__ == "__main__":
app = QApplication([])
widget = QWidget(minimumWidth=300)
layout = QVBoxLayout(widget)
btn1 = QPushButton("Action 1")
btn2 = QPushButton("Action 2")
btn3 = QPushButton("Action 3", flat=True)
layout.addWidget(btn1)
layout.addWidget(btn2)
layout.addWidget(btn3)
# добавим кастомное свойство одной кнопке
btn1.setProperty("btnType", "super")
# добавляем стили
widget.setStyleSheet(
"""
QPushButton[btnType="super"] {
background-color: yellow;
color: red;
}
QPushButton[flat="true"] {
color: yellow;
}
"""
)
widget.show()
app.exec_()
С помощью селектора мы избирательно назначили стили на конкретные кнопки.
Как получить список всех кастомный свойств?
Функция получения списка кастомных свойств отличается от получения дефолтных.
def print_widget_dyn_properties(widget):
for prop_name in widget.dynamicPropertyNames():
property_name = prop_name.data().decode()
property_value = widget.property(property_name)
print(f"{property_name}: {property_value}")
#tricks#qt
Как пелось в песне... не стареют душой ветераны.
А некоторые из них ещё духом и даже телом.
Один британский моряк-ветеран Второй Мировой подвергся нападению грабителей, когда ему было уже за 80. Двое молодых и наглых решили, что дедушка с тростью лёгкая добыча. Подойдя к нему они потребовали у него кошелек. Дед согласился, но попросил достать кошелек из кармана самим, так как ему трудно достать... Артрит там, артроз и всякая такая подагра. Когда один из грабителей наклонился, чтобы залезть в карман за кошельком, то получил от дедушки кулаком в нос. Затем и другому прилетел хук слева, а потом оба ещё получили тростью по жбану, после чего грабители, офигевшие от такого напора жертвы, сделали ноги. Не знали они, что дедушка после гибели своего корабля почти неделю провел в море со сломанной ногой и стал единственным выжившим из всего экипажа, потому что до службы занимался спортом. А после войны стал профессиональным боксером, дрался на ринге, как в перчатках, так и без. Конечно, кошелек не стоит жизни, но ветеран решил дать последний бой и победил. На принцип, видимо, пошёл.
#rn
И смех и грех. В море австралийский крейсер "Канберра" заметил британское судно "Драматик". Обнаружение было обоюдным, так как транспорт начал открыто радировать в эфир, что его преследует военный корабль с тремя трубами. Крейсер потратил десять минут, чтобы связаться с ним и приказал прекратить драматизировать и свернуть трагедию в эфире. #rn
Во время Второй Мировой британцы передали часть своих подводных лодок экипажам из союзных стран. Последние формировались из подводников, бежавших в Великобританию после оккупации их стран Германией, чтобы продолжить борьбу с Гитлером.
Союзные подлодки находились в оперативном подчинении Королевского флота, а в подводных силах метрополии была флотилия, состоявшая из союзных подлодок.
Британские субмарины были переданы норвежским, голландским, греческим, польским экипажам, а также французским из «Свободной Франции».
Но был нюанс. Всем перечисленным экипажам были переданы подлодки типа U, за исключением голландцев, которые получили подлодки типа Т.
Подлодки типа U по своим характеристикам не могли сравниться с типом Т, ни по вооружению, ни по автономности, ни по условиям жизни на борту.
Подлодки тип Т на тот момент были пиком вершины британского подплава - самыми грозными британскими подводными кораблями, способными разом атаковать цель десятью торпедами. Так почему же голландцы были удостоены доверия и получили возможность воевать на тип Т, а другие союзники нет?
Ваши соображения?)
#sub#rn
А документы, граждане, треба носить с собою (с)
Любопытный казус произошел в мае 1940-го, когда британская субмарина остановила в море судно в Норвежском море. Проверка документов выявила британского "купца", который направлялся в Мурманск. Судно было отпущено. Однако, британские подводники не догадались, кого они задержали. Это было британское судно-ловушка, привлекавшее к себе внимание немецких подлодок. Когда британская субмарина была замечена, то командир судна решил не раскрывать себя и ловушка притворилась обыкновенным транспортом. Липовые судовые документы проверку выдержали. ⚓️🇬🇧. #rn#sub
Храбрые итальянские моряки
Британская субмарина "Амбра" схлестнулась в бою с итальянским пароходом "Джима". Так как выходить в торпедную атаку на него было неудобно, британцы решили расправиться со старым судном с помощью 102-мм пушки. Но и у итальянцев тоже была пушка - 76-мм. "Амбра" открыла огонь с трех км, но уже после восьмого выстрела противника была вынуждена быстро смыться с помощью срочного погружения. Причина: итальянцы стреляли настолько метко, что британцами стало ясно - победы в артбою им не одержать. После этого "Амбра" всё-таки попыталась выйти в торпедную атаку, но "Джима", выжимая из своей машины что можно и нещадно тратя уголь, ушёл от ПЛ, которая так и не рискнула всплыть снова. В итоге, густо дымя, уходивший пароход, как бы дразнил противник, который беспомощно сидел под водой.
#rn#sub
"Трудная мишень"
Действуя у побережья Греции британская ПЛ "Торбей" обнаружила любопытный караван. Три буксира, идущие в кильватерной колонне, тащили за собой плавучий док в охранении шести небольших военных кораблей. Док был здоровый более 100 М длиной, плыл с небольшой скоростью. Практически, идеальная мишень, если бы не одно но - осадка целей была тоже небольшая. Командир ПЛ решил, что глубины хода торпед в метр будет достаточно и выпустил по буксирам и доку шесть торпед. И не дождался ни одного взрыва. Судя по всему, торпеды прошли под целями, так как дистанция до них была чуть более 1 км, а цели не меняли курса и скорости.
Потерпев неудачу, британцы плюнули и решили, что надо вообще пустить торпеды по поверхности, так как при такой дальности увернуться цели бы точно не успели. Тогда ПЛ выпустила две торпеды с углублением в 0 и они обе попали в док, потопив его.
#sub#rn
Британская ПЛ "Танталус" обнаружила у Малаккского полуострова и обстреляла небольшой японский каботажник. Первый выпущенный снаряд попал в цель и вызвал пожар в средней части судна, а последующие выстрелы - пламя в машинном отделении. После пяти выстрелов огонь был прекращен, и команда покинула судно. Затем было выпущено еще десять снарядов, чтобы прикончить его. Каботажник назывался "Паханг Мару", он направлялся из Куантана в Бангкок с 75 бочками мазута и 9 бочками смазочного масла. Затем он должен был загрузить 250 тонн риса в Бангкоке для возвращения в Куантан. После гибели судна следующие полчаса у британцев ушли на то, чтобы подобрать выживших, среди которых было девять малайцев, один китаец и один японский солдат. Последний уплыл далеко от остальных и поначалу отказывался от того, чтобы его поднимали. После безуспешной попытки утопиться он в конце концов схватился за трос и был поднят на борт. Японец обгорел и был очень напуган. Командир ПЛ лейтенант-коммандер Маккензи решил избавиться от местного экипажа как можно скорее. Он посадил местный экипаж на борт первой встретившейся китайской джонки. Японец, судя по всему, остался на борту лодки.
#sub#rn
Британский "Лунин".
9 ноября 1941-го командир британской ПЛ "Апхолдер" Д. Ванклин (по итогам войны самый результативный подводник Великобритании) оказался в схожей ситуации, что и командир К-21 Н. Лунин 5 июля 1942-го.
После разгрома британскими крейсерами и эсминцами итальянского конвоя "Дуйсбург" лодка Ванклина атаковала итальянские эсминцы проводивших подбор выживших с судов конвоя. Торпеды "Апхолдер" оторвали корму эсминцу "Libeccio", который после этого не затонул и был взят на буксир другим эсминцем. Позже в тот же день Ванклин атаковал два тяжелых крейсера класса "Trento" тремя торпедами. Согласно итальянским источникам, его целью была оперативная группа, состоявшая из тяжелых крейсеров "Trento" и "Trieste" в сопровождении эсминцев "Granatiere" , "Fuciliere", "Bersagliere" и "Alpino" . После торпедного залпа торпеды повели себя по разному: две пошли в сторону целей, а третья оказалась "бегуном по кругу", начав кружить над подлодкой, ушедшей после залпа на глубину. Там Ванклин услышал два взрыва и шумы тонущего корабля. Когда он подсплыл под перископ, то увидел два крейсера и эсминец. Так как перед торпедной стрельбой Ванклин видел рядом с крейсерами два эсминца, а уже после атаки был виден только один из них, то командир ПЛ решил, что торпеды поразили один из эсминцев, о чем и говорили шумы тонущего корабля. Поэтому Ванклин с чистой совестью посчитал, что в крейсера он не попал, но потопил один из сопровождавших их эсминцев. Что оказалось в реальности? Торпеды "Апхолдер" прошли мимо целей, а услышанные звуки тонущего корабля действительно были звуками тонущего эсминца, но это был поврежденный в предыдущей атаке эсминец "Libeccio", у которого как раз в момент нападения ПЛ на крейсера не выдержали переборки и он пошёл на дно. Вот такая интересная история. Схожесть случаев Ванклина и Лунин большая: оба атаковали группу тяжёлых кораблей, оба в в них не попали и оба предположили, что результатом их атак стало торпедирование эсминца.
#sub#rn
Батюшки, сколько "бегунов по кругу", да только не немецкие или американские, а британские! В сентябре 1941 британская ПЛ два раза выходила в атаку за свой поход и каждый раз в залпе оказывалась неисправная торпеда, начинавшая кружить вокруг лодки. Похоже, что и у британцев были серьёзные проблемы с гироскопами и, но про это известно куда меньше.
#sub#rn
Из любопытного.
Во время похода у побережья Суматры британская ПЛ искала пригодный сампан (азиатская лодка-плоскодонка), нужный для выполнения разведзадания. Сампан нашли. В нем было пять туземцев-сборщиков кокосов и обезьяна, обученная лазить за кокосами на дерево. Всю команду сампана сняли и перевели на ПЛ. Люди то перешли к британцами на борт без проблем, а вот с обезьяной пришлось повоевать, так как она отказалась сдаваться британцами в плен. Так что подводники Его Величества побегали за ней по сампану. Может даже кого-то из них покусали.
#rn#sub