Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 停止颜色问题_C++_Qt_Styles_Tabstop - Fatal编程技术网

C++ 停止颜色问题

C++ 停止颜色问题,c++,qt,styles,tabstop,C++,Qt,Styles,Tabstop,在我的应用程序中,tabstop控件上有一个恼人的白色矩形。我试图查看样式表,但myitem:tabstop样式没有任何作用。是否有任何方法可以改变tabstop颜色/或使其成为另一种形式。不幸的是,焦点矩形不受样式表的影响。样式表令人惊讶,但遗憾的是,它有一些限制 有一种方法可以去除焦点矩形——这是一个如何对按钮执行此操作的示例。不过,您必须逐个控件处理此控件。基本上,这是在渲染控件时进行的,您忽略了聚焦状态,并将控件绘制为非聚焦状态 要完全改变焦点矩形的外观,我想您可以覆盖原语本身。很多小部

在我的应用程序中,tabstop控件上有一个恼人的白色矩形。我试图查看样式表,但myitem:tabstop样式没有任何作用。是否有任何方法可以改变tabstop颜色/或使其成为另一种形式。

不幸的是,焦点矩形不受样式表的影响。样式表令人惊讶,但遗憾的是,它有一些限制

有一种方法可以去除焦点矩形——这是一个如何对按钮执行此操作的示例。不过,您必须逐个控件处理此控件。基本上,这是在渲染控件时进行的,您忽略了聚焦状态,并将控件绘制为非聚焦状态

要完全改变焦点矩形的外观,我想您可以覆盖原语本身。很多小部件都是由可重用的原语组成的。因此,在创建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);
    }
}
这里的缺点是,通过子类化QWindowsStyle,我们将应用程序锁定为windows外观。除了windows样式,您还可以使用其他基本样式(如QMacStyle等),但关键是,在走这条路之前,您应该知道您将进入什么样的环境

这是一篇关于QStyles以及如何利用QStyles的强大功能为您带来好处的好文章

编辑:


对于Qt5的用户,QWindowsStyle现在已成为私有的,请参阅此处以获取快速信息。但从理论上讲,QWindowsStyle可以实现的所有功能都可以通过新类QProxyStyle实现。有关快速示例,请参见。我认为好消息是,您没有锁定到特定的基本样式(如QWindowsStyle)。这很好。

不幸的是,焦点矩形不受样式表的影响。样式表令人惊讶,但遗憾的是,它有一些限制

有一种方法可以去除焦点矩形——这是一个如何对按钮执行此操作的示例。不过,您必须逐个控件处理此控件。基本上,这是在渲染控件时进行的,您忽略了聚焦状态,并将控件绘制为非聚焦状态

要完全改变焦点矩形的外观,我想您可以覆盖原语本身。很多小部件都是由可重用的原语组成的。因此,在创建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);
    }
}
这里的缺点是,通过子类化QWindowsStyle,我们将应用程序锁定为windows外观。除了windows样式,您还可以使用其他基本样式(如QMacStyle等),但关键是,在走这条路之前,您应该知道您将进入什么样的环境

这是一篇关于QStyles以及如何利用QStyles的强大功能为您带来好处的好文章

编辑:


对于Qt5的用户,QWindowsStyle现在已成为私有的,请参阅此处以获取快速信息。但从理论上讲,QWindowsStyle可以实现的所有功能都可以通过新类QProxyStyle实现。有关快速示例,请参见。我认为好消息是,您没有锁定到特定的基本样式(如QWindowsStyle)。这很好。

请添加更多描述问题的详细信息。考虑添加问题和相关代码的屏幕截图,以帮助其他用户理解你在这里得到的内容。请添加描述问题的更多细节。考虑添加一个问题的截图和相关代码来帮助其他用户理解你在这里得到的是什么。嗨,我试着用这个,但是最终我找不到qWoDOWS式样类。我想它已经在新的qt版本中被删除了。您使用的是Qt5吗?我仍然是4.8.*。使用QProxyStyle仍然有一种方法可以做到这一点。我将用几个链接更新我的答案。我使用QProxyStyle实现了它。问题结束。嗨,我试着用这个,但最终我找不到QWindowsStyle类。我想它已经在新的qt版本中被删除了。您使用的是Qt5吗?我仍然是4.8.*。使用QProxyStyle仍然有一种方法可以做到这一点。我将用几个链接更新我的答案。我使用QProxyStyle实现了它。问题结束。