Как узнать состав виджета для его полной кастомизации через setStyleSheet. PyQt5

Добрый день столкнулся с проблемой, что не могу управлять стилем виджета, так как не знаю к каким свойствам обратится, здесь нашел вот такой пример по кастомизации QCalendarWidget ссылка. Вопрос, как уважаемый, нашел такие атрибуты как '#qt_calendar_navigationbar'или 'CalendarWidget QToolButton::menu-indicator' когда задавал стиль. Подскажите способ как я могу узнать состав стандартного виджета. Заранее благодарю.


Ответы (1 шт):

Автор решения: Sergey Tatarincev

Частично свойства описаны в Qt Style Sheets Reference

Но если этого мало, можете для любого виждета получить интересующее. Рекурсивно обойдите дерево деток нужного вам объекта и получите то что вам надо.

Приведу пример на c++ (надеюсь проблем переписать на python не будет)

// Функция рекурсивного обхода деток
static void dump_object_tree(QObject* o, QString pr=""){    
    foreach (QObject* child, o->children()) {
        qDebug()<<QString("%1 %2 (%3)").arg(pr).arg(child->objectName()).arg(child->metaObject()->className());
        dump_object_tree(child,pr+" ");
    }
}
// и к примеру в конструкторе посмотрим состав QCalendarWidget, лежащего на форме
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    // .......
    dump_object_tree(ui->calendarWidget);
}

В выводе получим:

"  (QVBoxLayout)"
"  (QCalendarModel)"
" qt_calendar_calendarview (QCalendarView)"
"  qt_scrollarea_viewport (QWidget)"
"  qt_scrollarea_hcontainer (QWidget)"
"    (QScrollBar)"
"    (QBoxLayout)"
"  qt_scrollarea_vcontainer (QWidget)"
"    (QScrollBar)"
"    (QBoxLayout)"
"   (QStyledItemDelegate)"
"   (QHeaderView)"
"   qt_scrollarea_viewport (QWidget)"
"   qt_scrollarea_hcontainer (QWidget)"
"     (QScrollBar)"
"     (QBoxLayout)"
"   qt_scrollarea_vcontainer (QWidget)"
"     (QScrollBar)"
"     (QBoxLayout)"
"    (QItemSelectionModel)"
"   (QHeaderView)"
"   qt_scrollarea_viewport (QWidget)"
"   qt_scrollarea_hcontainer (QWidget)"
"     (QScrollBar)"
"     (QBoxLayout)"
"   qt_scrollarea_vcontainer (QWidget)"
"     (QScrollBar)"
"     (QBoxLayout)"
"    (QItemSelectionModel)"
"   (QTableCornerButton)"
"   (QItemSelectionModel)"
" qt_calendar_navigationbar (QWidget)"
"  qt_calendar_prevmonth (QPrevNextCalButton)"
"  qt_calendar_nextmonth (QPrevNextCalButton)"
"  qt_calendar_monthbutton (QToolButton)"
"    (QMenu)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"     (QAction)"
"  qt_calendar_yearbutton (QToolButton)"
"  qt_calendar_yearedit (QSpinBox)"
"   qt_spinbox_lineedit (QLineEdit)"
"     (QWidgetLineControl)"
"   qt_spinboxvalidator (QValidator)"
"   (QHBoxLayout)"
"  (QCalendarDelegate)"
"  (QCalendarTextNavigator)"

Часть детей (типа QAction) интереса не представляют, но часть можем использовать. К примеру поменять фон кнопки предыдущего месяца:

#qt_calendar_prevmonth { background-color: green; }

→ Ссылка