Qt4样式表和焦点矩形

Qt4样式表和焦点矩形,qt4,pyqt4,Qt4,Pyqt4,我想使用样式表:focus伪状态来控制树视图焦点状态的表示。除了Qt系统仍然绘制自己的focusrect之外,使用下面的样式表工作得很好。我如何要求Qt在仍然能够对键盘输入控件进行对焦的情况下不绘制focus rect QTreeView { background: #505050; border: 1px solid; border-radius: 10px; } QTreeView:focus { border: 2px groove; } 我不知道你的

我想使用样式表:focus伪状态来控制树视图焦点状态的表示。除了Qt系统仍然绘制自己的focusrect之外,使用下面的样式表工作得很好。我如何要求Qt在仍然能够对键盘输入控件进行对焦的情况下不绘制focus rect

QTreeView {
    background: #505050;
    border: 1px solid;
    border-radius: 10px;
}

QTreeView:focus { 
    border: 2px groove;
}

我不知道你的问题的直接答案,但这里有一个我用qt样式表定制的树视图的代码片段。也许它能在某种程度上帮助你。我相信show Edition selected属性是启用默认焦点绘制的功能(可能是错误的,已经有一段时间没有被我愚弄了)

您可以使用treeview的方法为treeview项目设置自定义绘制过程。在deligate的绘制方法中,可以从items选项中删除QStyle::State_HasFocus样式,并执行基本绘制例程。下面是一个例子,对不起,它是C++。
...
    NoFocusDelegate* delegate = new NoFocusDelegate();
    ui->treeView->setItemDelegate(delegate);
...

class NoFocusDelegate : public QStyledItemDelegate
{
protected:
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
};

void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
    QStyleOptionViewItem itemOption(option);
    if (itemOption.state & QStyle::State_HasFocus)
        itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
    QStyledItemDelegate::paint(painter, itemOption, index);
}
更新0:使用自定义QStyle对象将QFocusFrame从淹没在TReeView上移除。下面是应用于应用程序对象的自定义QMotifStyle子体的示例(我猜在您的示例中,它应该是QMacStyle子体)。每当检测到qtreeview小部件时,它不会进行任何帧矩形绘制

class MyStyle1 : public QMotifStyle
{
public:
    MyStyle1()
    {
        //???
    }

    void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget = 0 ) const
    {
        if (element==CE_FocusFrame)
        {
            const QFocusFrame* frame = qobject_cast<const QFocusFrame*>(widget);
            if (frame && frame->widget())
            {
                QTreeView* treeView = qobject_cast<QTreeView*>(frame->widget());
                if (treeView)
                {
                    qDebug() << "no CE_FocusFrame for QFocusFrame over QTreeViews";
                    return;
                }
            }
        }
        QMotifStyle::drawControl(element, option, painter, widget);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QCDEStyle style;
    a.setStyle(new MyStyle1());
    //a.setStyle(new QMotifStyle());
    MainWindow w;
    w.show();
    return a.exec();
}
classmystyle1:publicqmotifstyle
{
公众:
MyStyle1()
{
//???
}
void drawControl(ControlElement元素,常量QStyleOption*选项,qPaint*画师,常量QWidget*小部件=0)常量
{
if(element==CE\u FocusFrame)
{
const QFocusFrame*frame=qobject_cast(小部件);
if(frame&&frame->widget())
{
QTreeView*treeView=qobject_cast(frame->widget());
如果(树视图)
{

qDebug()围绕QTreeView小部件的focus rect本身就是一个Mac样式化功能。这会关闭每个小部件:

tree.setAttribute(Qt.WA_MacShowFocusRect, 0)

@serge,感谢您提供有关ItemDelegates的精彩信息。我遇到的第一个问题是在我设计的整个树视图周围有一个巨大的聚焦蓝色矩形。我上传了一个屏幕截图来说明:我第一次以为您想删除聚焦矩形淹没在树视图项目上,但我想您看到的突出显示是QFocusFrame淹没在您的控制之上,由style用于你的应用程序。它看起来像QMacStyle,但我可能错了。我也无法在我的笔记本电脑上检查它,因为我正在运行ubuntu。请,看看我对原始帖子所做的更新是否适用you@serge,这是一个仅限Mac的问题。tree.setAttribute(Qt.WA_MacShowFocusRect,0)感谢您的帮助!
tree.setAttribute(Qt.WA_MacShowFocusRect, 0)