Qt4 Stylesheets和Focus Rect

时间:2010-01-01 00:09:52

标签: qt4 pyqt4

我想使用样式表:focus伪状态来控制树视图焦点状态的表示。使用以下样式表效果很好,除了Qt系统仍然绘制它自己的焦点rect。如何让Qt不能绘制焦点rect,同时仍然可以将控件聚焦到键盘输入?

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

QTreeView:focus { 
    border: 2px groove;
}

3 个答案:

答案 0 :(得分:14)

QTreeView小部件周围的焦点矩形本身就是Mac样式功能。这会将每个小部件关闭:

tree.setAttribute(Qt.WA_MacShowFocusRect, 0)

答案 1 :(得分:1)

您可以使用树视图的setItemDelegate方法为树视图项设置自定义绘制过程。在绘制方法中,您可以从项目选项中删除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);
}

update0:使用自定义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();
}

希望这有帮助,尊重

答案 2 :(得分:0)

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

QString treeview_ss = "QTreeView { color: white; background: black; }" +
        QString("QTreeView { show-decoration-selected: 0; }") +
        QString("QTreeView::item:selected { border: 1px solid grey; }") +
        QString("QTreeView::item:selected:!active { color: white; border: 1px solid grey; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #000000, stop: 1 grey); }") +
        QString("QTreeView::item:selected:active { border: 1px solid grey; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #000000, stop: 1 grey); }") +
        QString("QTreeView::item:hover { border: 1px solid grey; }") +