Пользовательский виджет QFrame с возможностью переключения / переключения

Как я могу сделать так, чтобы пользовательский виджет (производный от «QFrame») содержал поддержку для проверки / переключения?
Как заставить таблицу стилей (CSS) Qt знать, что мой виджет был проверен / переключен пользователем?

Есть ли какой-то сигнал или свойство, которое мне нужно использовать в моем настраиваемом виджете?

Я не хочу использовать (т. Е.) QPushButton, потому что мне нужен мой виджет кнопок, чтобы использовать .ui-файл Qt.

То есть при использовании QPushButton — все просто:

QPushButton#btnName:focus:pressed { border-image: url(ThemesPathKey/menu-top-h.png);    }
QPushButton#btnName:checked {   border-image: url(ThemesPathKey/menu-top-h.png);    }
QPushButton#btnName:hover { border-image: url(ThemesPathKey/menu-top-h.png);    }

Мне нужно что-то подобное для моего пользовательского виджета кнопки.

Благодарю.

1

Решение

Ты можешь использовать hover а также focus для пользовательского виджета, но checked поддерживается только для кнопок и флажков.

Заменить checked Вы можете использовать пользовательское свойство:

QPushButton#btnName[checked="true"] {   border-image: url(ThemesPathKey/menu-top-h.png);    }

когда твой виджет нажал, чтобы переключить checked свойство как это:

void mousePressEvent(QMouseEvent*) override
{
bool checked = property("checked").toBool();
setProperty("checked", !checked);
style()->polish(this);
}
2

Другие решения

Для зависания вы можете использовать тот же подход с любым производным виджетом:

class MyClass : public QFrame
{
<...>
}

MyClass a;
a.setStyleSheet("MyClassa:hover{<...>}"); //this will work
a.setStyleSheet("MyClass#a:hover{<...>}"); //and this will work
a.setStyleSheet("QFrame:hover{<...>}"); //Even this will work, too

Проверка / снятие отметки является более сложным. Кадры не имеют состояний проверки, поэтому вам придется реализовать их самостоятельно.

class MyClass : public QFrame
{
public:
<...>
protected:
void mousePressEvent(QMouseEvent * e) override
{
checked_ = !checked_;
if(checked)
setStyleSheet("border:1px solid black;");
else
setStyleSheet("border:0px;");
}
bool checked_;
}

или что-то вроде этого

class MyClass : public QFrame
{
public:
<...>
protected:
void paintEvent(QPaintEvent * e) override
{
if(checked)
{
//draw something
}
else
{
//draw something else
}
}
bool checked_;
}
1

По вопросам рекламы [email protected]