【问题标题】:Custom checkable / toggleble QFrame widget自定义可检查/可切换 QFrame 小部件
【发布时间】:2015-01-10 16:29:52
【问题描述】:

如何使自定义小部件(源自“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);    }

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

谢谢。

【问题讨论】:

    标签: c++ css qt widget qframe


    【解决方案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_;
    }
    

    【讨论】:

    • 感谢 SingerOfTheFall,但我很想找到一种方法来使用它而不是修改 styleSheet。
    【解决方案2】:

    您可以将hoverfocus 用于自定义小部件,但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);
    }
    

    【讨论】:

    • 感谢 Ezee。这是迄今为止我能想到的最好的方法。如果有任何方法可以复制与 QPushButton 中使用的相同的“已检查”动作,那么我真的很感兴趣(“只是为了运动”)。 (使用 "QFrame#btnName:checked { }" 而不是 "QFrame#btnName[checked="true"] { }")
    • 如果您想使用与QAbstractButton 后代不同的小部件,这是唯一的方法,但您可以从QAbstractButton 继承并实现您自己的外观。通过这种方式,我相信您将能够设法使用:checked
    • 对于“QAbstractButton”,您需要实现自己的“paintEvent”。而且我相信这种类型的小部件不能用作“Qt Creator”中的“可推广”小部件。无论如何,感谢您的帮助!我会坚持使用“setProperty”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2015-07-27
    • 2013-07-22
    • 2016-08-24
    • 1970-01-01
    • 2017-08-25
    • 2022-01-19
    相关资源
    最近更新 更多