1

在我的应用程序中,制表符控件上有一个烦人的白色矩形。我试图查看样式表,但 myitem:tabstop 样式没有做任何事情。有什么办法我可以以某种方式更改制表位颜色/或使其成为另一种形式。

4

1 回答 1

1

不幸的是,焦点矩形不受样式表的影响。样式表很棒,但遗憾的是有一些限制。

有一种方法可以摆脱焦点矩形 -是一个如何为按钮执行此操作的示例。虽然,您必须通过控制来处理此控制。基本上,这样做是在控件的呈现中,您忽略了聚焦状态,并像没有聚焦一样绘制控件。

要完全改变焦点矩形的外观,我想您可以覆盖图元本身。许多小部件由可重用的原语组成。因此,在创建 QStyle 对象时,我们可以覆盖某些小部件或某些图元的绘制方式。

因此,在您的情况下,您将创建一个 QStyle 类,如下所示:

class CustomStyle : public QWindowsStyle
{
    Q_OBJECT

public:
    CustomStyle() {}

    void drawPrimitive(PrimitiveElement which,
                       const QStyleOption *option, QPainter *painter,
                       const QWidget *widget = 0) const;

}

然后在实现中,您将提供任何方法来绘制您喜欢的焦点矩形。下面是默认的 Windows 实现。

void CustomStyle::drawPrimitive(PrimitiveElement which,
                                const QStyleOption *option,
                                QPainter *painter,
                                const QWidget *widget) const
{
    switch (which) {
    case PE_FrameFocusRect:
        if (const QStyleOptionFocusRect *fropt = qstyleoption_cast<const QStyleOptionFocusRect *>(opt)) {
        //### check for d->alt_down
        if (!(fropt->state & State_KeyboardFocusChange) && !proxy()->styleHint(SH_UnderlineShortcut, opt))
            return;
        QRect r = opt->rect;
        p->save();
        p->setBackgroundMode(Qt::TransparentMode);
        QColor bg_col = fropt->backgroundColor;
        if (!bg_col.isValid())
            bg_col = p->background().color();
        // Create an "XOR" color.
        QColor patternCol((bg_col.red() ^ 0xff) & 0xff,
                          (bg_col.green() ^ 0xff) & 0xff,
                          (bg_col.blue() ^ 0xff) & 0xff);
        p->setBrush(QBrush(patternCol, Qt::Dense4Pattern));
        p->setBrushOrigin(r.topLeft());
        p->setPen(Qt::NoPen);
        p->drawRect(r.left(), r.top(), r.width(), 1);    // Top
        p->drawRect(r.left(), r.bottom(), r.width(), 1); // Bottom
        p->drawRect(r.left(), r.top(), 1, r.height());   // Left
        p->drawRect(r.right(), r.top(), 1, r.height());  // Right
        p->restore();
    }
        break;
    default:
        QWindowsStyle::drawPrimitive(which, option, painter, widget);
    }
}

然后只需将您的样式类提供给您的应用程序

QApplication::setStyle(new CustomStyle);

不利的一面是,通过继承 QWindowsStyle,我们将应用程序锁定为窗口外观。除了windows之外,您还可以使用其他基本样式(例如QMacStyle等...),但重点是在走这条路之前您应该知道您正在进入什么。

是一篇关于 QStyles 以及如何利用它们的力量为您带来好处的好文章。

编辑:

对于 Qt5 的用户,QWindowsStyle 现在已设为私有,请参阅此处以获得快速说明。但理论上,所有可以用 QWindowsStyle 完成的事情都可以用新的类 QProxyStyle 完成。请参阅此处以获取快速示例。我认为好消息是您没有锁定特定的基本样式(如 QWindowsStyle)。哪个好。

于 2013-07-08T22:18:54.047 回答