QTableView::item 和 cellWidget 之间的 Qt 样式表冲突

问题描述 投票:0回答:1

我在 Windows 上使用 Qt 5.15.2。我有一个

QTableWidget
,它有一堆
QComboBox
es作为单元格小部件。该应用程序使用以下样式表:

QComboBox:hover{background: yellow;}
QTableView::item:hover{color: red;}

现在当显示表格并将鼠标悬停在最后一个可见行的

QComboBox
上时,表格开始自动向下滚动,如下所示:

如果我将鼠标悬停在最后一个可见行的正常

QTableWidgetItem
上,这不会发生,如图所示。

如果我从样式表中删除任何一个

hover
关键字,那么一切正常,但我失去了我的风格。我的猜测是
QTableView::item
QComboBox
之间存在冲突,当它被用作单元格小部件时,所以我尝试通过使用
 更明确地说明样式表应该应用于哪些 
QComboBox

es
QTableView QComboBox:hover{background: yellow;}
QTableView::item:hover{color: red;}

但这也无济于事。请就如何解决这个问题提出任何建议?

这是我在这个例子中使用的代码:

#include <QTableWidget>
#include <QBoxLayout>
#include <QComboBox>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    qApp->setStyleSheet(
                "QComboBox{background: yellow;}"
                "QTableView::item:hover{color: red;}"
                        );

    auto rows = 100;
    auto cols = 5;
    auto table = new QTableWidget(rows, cols);

    for(auto i = 0; i != rows; ++i)
    {
        for(auto j = 0; j != cols; ++j)
        {
            if(j == 0)
            {
                auto item = new QTableWidgetItem("hello");
                table->setItem(i, j, item);
            }
            else
            {
                auto cb = new QComboBox();
                cb->addItems(QStringList() << "Item1" << "Item2");
                table->setCellWidget(i, j, cb);
            }
        }
    }

    table->setMinimumSize(800,600);
    table->show();
    return a.exec();
}

更新

正如下面 Abderrahmene Rayene 的回答所建议的,使用

setAutoScroll(false)
可以解决自动滚动的问题。不幸的是,当当前项目随着方向箭头发生变化时,表格将失去自动滚动的能力,如下所示。我还刚刚确认我的帖子中描述的整个问题在 Qt 5.15 之前的 Qt 版本中无法重现,所以我猜这是一个 Qt 回归错误。

qt qt5 qtstylesheets
1个回答
0
投票

当您悬停一个部分可见的项目时,您的

QTableWidget
似乎会自动滚动,我的猜测是它在悬停时将其视为选定的单元格,这会导致自动滚动。

要解决您的问题,您只需这样做:

table->setAutoScroll(false);

我将它应用到您的MRE 并且它起作用了。

这个解决方案背后的原因:

我通过使用

eventFilter
得出了你的表格自动滚动的结论,这帮助我注意到了
QEvent::Move
QComboBox
,如果他们在移动而我没有移动它们,那就意味着它是
auto
,所以我用谷歌搜索了这个:

qtablewidget 禁用确保可见

这让我想到了这个answer.

© www.soinside.com 2019 - 2024. All rights reserved.