1

如何使自定义小部件(源自“QFrame”)包含可检查/可切换的支持?如何让 Qt 的样式表 (CSS) 知道我的小部件已被用户检查/切换?

我需要在自定义小部件中使用某种信号或属性吗?

我不想使用(即)QPushButton,因为我需要我的按钮小部件才能使用 Qt 的 .ui 文件。

即当使用 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);    }

我的自定义按钮小部件需要类似的东西。

谢谢。

4

2 回答 2

2

您可以将hoverandfocus用于自定义小部件,但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);
}
于 2014-11-13T14:06:12.737 回答
1

对于悬停,您可以对任何派生小部件使用相同的方法:

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_;
}
于 2014-11-13T14:03:49.730 回答