在我的应用程序中,tabstop控件上有一个讨厌的白色矩形。我尝试在样式表中查找,但是myitem:tabstop style什么也不做。有没有什么方法可以改变tabstop的颜色/或者让它变成另一种形式。
发布于 2013-07-09 06:18:54
不幸的是,焦点矩形不会受到样式表的影响。样式表很棒,但遗憾的是有一些限制。
有一种方法可以摆脱焦点矩形- here就是一个例子,说明了如何对按钮执行此操作。但是,您必须通过控件来处理此控件。基本上,这是在呈现控件时所做的,您忽略了焦点状态,并将控件绘制得好像没有焦点一样。
要完全改变焦点矩形的外观,我想你可以重写原语本身。很多小部件都是由可重用的原语组成的。因此,在创建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等),但重点是,在走这条路之前,您应该知道您要进入的是什么。
This是一篇很好的文章,介绍了QStyles以及如何利用它们的力量为您带来好处。
编辑:
对于Qt5的用户来说,QWindowsStyle现在已经被设置为私有的,请查看这里的快速explanation。但是从理论上讲,可以使用QWindowsStyle完成的所有操作都可以使用新的类QProxyStyle来完成。有关快速示例,请参阅here。我认为好消息是你没有锁定到一个特定的基础风格(如QWindowsStyle)。这很好。
https://stackoverflow.com/questions/17535616
复制相似问题