Установить свойства виджета в 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
‼️💻The Gardiyum hacking group claimed responsibility for cyber attacks on three major institutions in Bahrain through three separate statements.
🔻 According to the group's claims, over the past 24 hours, operations were carried out against the Khaleeji Bank, the Bahrain Stock Exchange, and Gulf Air airlines, resulting in the systems of these entities being rendered inaccessible for consecutive hours.
🔻 Following these attacks, widespread disruption in service delivery occurred, which, according to Gardiyum, has led to significant damage and extensive dissatisfaction.
#Bahrain
🇧🇭‼️The Public Prosecution of the Al Khalifa regime in Bahrain is demanding the death penalty for who took photos from restricted areas after Iranian attacks!
🔺This authority has accused the detainees of "great treason."
🔺The Ministry of Interior of the Al Khalifa regime arrested 12 Bahraini citizens on charges of filming and sharing videos related to the Iranian armed forces' attacks on U.S. military sites.
#Bahrain
#Iran, #Bahrain: Il Ministero dell'Interno del Bahrain ha annunciato il divieto di manifestazioni e assembramenti in luoghi pubblici per motivi di sicurezza relativi al conflitto scaturitosi nel Golfo.
🇧🇭⛔️ The anti-Iran draft resolution proposed by Bahrain was not adopted
🔹The UN Security Council rejected Bahrain's anti-Iran draft resolution on reopening the Strait of Hormuz, with Russia and China casting vetoes.
🔺 The Bahraini draft resolution initially emphasized the use of all necessary means to reopen the Strait of Hormuz—implying military action—and later, after this clause was removed, focused on defensive and proportionate efforts to ensure maritime security. However, Russia and China used their veto power to block its adoption.
➡️ The representatives of Pakistan and Colombia also refrained from participating in the vote.
#Iran#Bahrain
🇧🇭‼️Seyyed Mohammad al-Mousawi, a Bahraini citizen, was martyred today due to injuries sustained from torture in the prison of the Al Khalifa regime. In the released video, the effects of torture and signs of beating are clearly visible on his face and various parts of his body, and evidence of electric shock is also apparent on his body.
— The martyr was from the Al-Muharraq region and was the son of Seyyed Mohsen al-Mousawi, a cleric from the area, who had previously been imprisoned by the Bahraini regime for over 12 years and was released in 2024 on the occasion of Eid; however, he was recently rearrested by the regime.
➡️ Today, Bahrainis gathered in front the family home of the martyr Seyyed Mohammad al-Mousawi and held a funeral procession for his body while chanting slogans pledging covenant with the martyr.
✍️The Al Khalifa regime has recently arrested and imprisoned a number of Bahraini citizens on false charges of cooperating with Iran or photographing the sites of attacks. The deep-rooted rancor and enmity of the Al Khalifa regime toward Iran and Bahrain’s Shia community are the main reasons behind the arrest and killing of innocent Bahraini citizens and the inhumane actions taken against them.
✍️ Following the heavy strikes by Iran’s armed forces against American bases in the country, Bahrain is on the verge of another popular uprising against the Al Khalifa regime. With the support of Iran and the Shia religious authority, the people can overthrow the puppet Al Khalifa regime.
#Iran#Bahrain
🇮🇷#Iran - 🇧🇭#Bahrain: Footage circulating on Iranian channels show the aftermath of an Iranian missile that has struck Bahrain's Petrolum Company in Sitra moments ago.
🇮🇷#Iran - 🇧🇭#Bahrain: Footage showing an Iranian drone hitting a high-rise building in Bahrain, Manama, earlier today.
(via @Osint613 on X & @theleaflet)