Как я могу сделать так, чтобы пользовательский виджет (производный от «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); }
Мне нужно что-то подобное для моего пользовательского виджета кнопки.
Благодарю.
Ты можешь использовать 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);
}
Для зависания вы можете использовать тот же подход с любым производным виджетом:
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_;
}