2

スタイルシート :focus 疑似状態を使用して、ツリー ビューのフォーカス状態の表現を制御したいと考えています。次のスタイルシートを使用すると、Qt システムが独自のフォーカス rect を描画することを除いて、うまく機能します。キーボード入力のコントロールにフォーカスできるようにしながら、Qt にフォーカス rect を描画しないようにするにはどうすればよいですか?

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

QTreeView:focus { 
    border: 2px groove;
}
4

3 に答える 3

14

QTreeViewウィジェット自体に焦点を当てることは、Macのスタイリング機能であることがわかります。これにより、ウィジェットごとにオフになります。

tree.setAttribute(Qt.WA_MacShowFocusRect, 0)
于 2010-01-02T01:22:36.173 に答える
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オブジェクトを使用してTReeViewに溺れることからQFocusFrameを削除します。以下は、アプリケーションオブジェクトに適用されるカスタム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();
}

これがお役に立てば幸いです

于 2010-01-01T01:33:16.190 に答える
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; }") +
于 2010-01-01T00:52:38.677 に答える