【问题标题】:How to disable focus border and background it QTreeWidget with fusion style?如何使用融合样式禁用焦点边框和背景 QTreeWidget?
【发布时间】:2019-04-25 11:13:04
【问题描述】:

如何使用融合样式禁用焦点边框和背景 QTreeWidget?焦点很烦人。特别是当我使用交替的原始颜色时。

#include <QApplication>
#include <QWidget>
#include <QTreeWidget>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyle("fusion");

    QWidget *mainWidget = new QWidget();
    mainWidget->resize(200,150);

    QTreeWidget *myTree = new QTreeWidget(mainWidget);
    myTree->resize(200,150);

    QTreeWidgetItem *item;
    item = new QTreeWidgetItem(myTree);
    item->setText(0,"item1");
    //...
    item = new QTreeWidgetItem(myTree);
    item->setText(0,"item6");

    myTree->setAlternatingRowColors(true);
    myTree->setStyleSheet("QTreeView {background-color: #222222;"
                          "           alternate-background-color: #333333;"
                          "           selection-background-color: #FF77FF;}");

    myTree->setFocus();
    item->setSelected(true);

    mainWidget->show();
    return a.exec();
}

【问题讨论】:

  • 您指的是第一项的“暗”焦点矩形吗?如果是这种情况,您可以使用项目委托,实现 paint() 方法并针对 QStyle.State_Selected 和 QStyle.State_HasFocus 检查 QStyleOptionViewItem.state:如果它具有焦点且未选中,只需取消设置 State_HasFocus 并继续使用带有新选项的标准 paint() 实现。

标签: windows qt focus qtableview qtreeview


【解决方案1】:

我花了一些时间才弄清楚这一点,但我也对 Qt 样式表有所了解。基本上有必要设置QTreeView::item 的CSS 属性,以防伪状态selected 被禁用而伪状态focus 被启用。

如果想要禁用小焦点矩形的绘制,可以使用自定义的QProxyStyle 来执行此操作,如 (https://stackoverflow.com/a/17294081/5762796) 所示。

看起来,焦点框的样式没有 Qt Css 属性。

#include <QApplication>
#include <QWidget>
#include <QTreeWidget>
#include <QProxyStyle>

// Disables focus drawing for all widgets
class Style_tweaks : public QProxyStyle
{
public:
    void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
        QPainter *painter, const QWidget *widget) const
    {
        if (element == QStyle::PE_FrameFocusRect) return;

        QProxyStyle::drawPrimitive(element, option, painter, widget);
    }
};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyle("fusion");
    a.setStyle(new Style_tweaks);

    auto myTree = new QTreeWidget;
    myTree->resize(200, 150);

    auto item1 = new QTreeWidgetItem(myTree);
    item1->setText(0, "item1");
    auto item2 = new QTreeWidgetItem(myTree);
    item2->setText(0, "item6");
    auto item3 = new QTreeWidgetItem(myTree);
    item3->setText(0, "item7");

    myTree->setAlternatingRowColors(true);
    myTree->setStyleSheet("\
        QTreeView {background-color: #222222; alternate-background-color: #333333; selection-background-color: #FF77FF; } \
        QTreeView::item:!selected:focus { background-color: #222222; alternate-background-color: #333333; selection-background-color: #222222;outline-color: white}\
    ");

/*  item3->setSelected(true);*/
    myTree->setFocus();
    item3->setSelected(true);

    myTree->show();
    return a.exec();
}

【讨论】:

  • 焦点在所选项目行的开头仍显示为一条小线。但是一个不错的技巧!
  • @Arseniy:我可以确认项目周围有一个微弱的矩形,颜色略有不同。不幸的是,我不知道这个矩形的原因。
  • 如果仔细观察,我们可以在您的应用程序中看到这个矩形。这个矩形比#222222 更灰一些。这是重点:)
  • @Arseniy:我稍微改变了我的解决方案,因此不再绘制焦点框。
  • 尝试将 #222222 和 #333333 更改为 #999999。你会看到矩形。
猜你喜欢
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2014-04-18
  • 2020-10-22
  • 2018-05-12
  • 1970-01-01
相关资源
最近更新 更多