2016-10-18 5 views
0

QStyledItemDelegate(Qt5)を使用して、QPixmapを私がホバーするとQTreeView行にペイントしました。OS X TreeViewペイント

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では動作しません。 paint()は単に私が行をクリックしたときには、など、ウィンドウのサイズが変更されたとき、呼ばれていますOS X上でホバーで呼び出されていない私は、ことがわかった:

  • のWindowsは、Linux(ミント
  • ホバー上の行をハイライトします、少なくとも)
  • OS Xがホバー上の任意のピクセルは変更されませんので、OSと同じように行うことができます必要

他のウィンドウマネージャはありませんので、それがpaint()を呼び出すことはありませんホバー上のチェックボックスをhightlights私はそれらをすべてテストすることはできません。 OSがそれを必要としなくても、paint()がホバー上で呼び出されるようにする方法はありますか?

+0

'paint 'を実装するのは仕事の半分だけです。他の半分はマウスイベントに反応して 'update()'を呼び出しています。これには、ビューにイベント・フィルターを追加する必要があります。 –

+0

@KubaOberはい、私はそれを他の場所でも読んでいますが、私はどのように、どこでそれをやるべきかについての情報が必要なので、私は頼んでいます。例は、他のすべてのプログラマーを助けるでしょう。 – Nil

答えて

1

私の問題の[おそらくは悪い]解決策が見つかりました。あなたが見ることができるように

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

、私はマウスが項目の上にある時はいつでもpaint()を呼び出すにQTreeView::item:hover上に空のCSS宣言、トリックのQtを追加しました。

#ifdefは、他のOSでは何も破壊していないので必要でもありません。

    私はすぐにテストし
  • paint()はできるだけ頻繁にCSS宣言が空であるため
  • 前に、それは他のOSのデフォルトのUIのスタイルを変更していないなどと呼ばれていると思います。

私はこのソリューションのファンだとは言えません。それはハックのように見えます。空のCSS宣言は何も変更してはいけません。 Qtはこの「バグ」を将来のバージョンで修正し、動作を停止する可能性があります。

+0

これは非常に巧妙な解決策です。ウィジェットモジュールが長期間メンテナンスされていることを考えれば、これはおそらく永遠に動作するでしょう。 –