OS X TreeView绘画

时间:2016-10-18 17:11:33

标签: macos qt

当我将鼠标悬停在QStyledItemDelegate行时,我使用QPixmap(Qt5)绘制QTreeView

void ActionsItemDelegate::paint(
    const QStyleOptionViewItem &option,
    const QModelIndex& selectedProxy) const
{
    QStyledItemDelegate::paint(painter, option, selectedProxy);
    if (option.state & QStyle::State_MouseOver)
    {
        Draw qpixmap ...
    }
}

它在Windows和Linux上按预期工作,但我不能让它在OS X 10.11上运行。在OS X上悬停时根本不会调用paint()。当我点击一行,调整窗口大小等时调用它。我发现:

  • Windows突出显示悬停行
  • Linux(至少是Mint)高亮显示hover上的复选框
  • OS X在悬停时不会更改任何像素,因此不会调用paint(),因为不需要

任何其他Window Manager都可以和OS X一样。我无法测试它们。有没有办法确保即使操作系统不需要它也会在悬停时调用paint()

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的[可能很糟糕]。

#ifdef __APPLE__
    treeView->setStyleSheet("QTreeView::item:hover{}");
#endif

正如您所看到的,我在QTreeView::item:hover上添加了一个空的css声明,只要鼠标在某个项目上,就会欺骗Qt调用paint()

#ifdef甚至不需要,因为它没有破坏其他操作系统上的任何内容。

  • 我测试得很快,认为 paint()就像以前一样经常被调用
  • 它没有更改其他操作系统的默认UI样式,因为css声明为空。

我不能说我是这个解决方案的粉丝。它确实看起来像一个黑客。一个空的css声明不应该改变任何东西。 Qt可以解决这个问题" bug"在未来的版本上,它将停止工作。