windows - 如何以融合风格禁用焦点边框和背景QTreeWidget?

标签 windows qt focus qtableview qtreeview

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

enter image description here

#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();
}

最佳答案

我花了很长时间才弄清楚这一点,但我也对 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();
}

关于windows - 如何以融合风格禁用焦点边框和背景QTreeWidget?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55847961/

相关文章:

c++ - 使用 gcc/g++ 使 C++ 程序在没有窗口的情况下运行?

windows - 创建批处理文件以删除、重命名和移动多个文件多个子文件夹

c++ - 通过搜索或键通过 QStandardItemModel 检索 QStandardItem

css - 在 Electron 中禁用 Bootstrap 按钮周围的橙色焦点轮廓

jQuery:在表单输入焦点上,显示 div。在模糊时隐藏 div(有警告)

jquery - 打开Fancybox-2后,将焦点发送到fancybox窗口

php - MySQL 外键约束在 Linux 服务器上失败,但在 Windows XAMPP 上有效

python - pip 版本 virtualenv 不匹配,不会升级

c++ - 如何调整可扩展对话框的大小?

c++ - Qt/C++ 连接经典蓝牙设备