我在 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 回归错误。
当您悬停一个部分可见的项目时,您的
QTableWidget
似乎会自动滚动,我的猜测是它在悬停时将其视为选定的单元格,这会导致自动滚动。
要解决您的问题,您只需这样做:
table->setAutoScroll(false);
我将它应用到您的MRE 并且它起作用了。
我通过使用
eventFilter
得出了你的表格自动滚动的结论,这帮助我注意到了QEvent::Move
的QComboBox
,如果他们在移动而我没有移动它们,那就意味着它是auto
,所以我用谷歌搜索了这个:
qtablewidget 禁用确保可见
这让我想到了这个answer.