9

タスクを優先度別に一覧表示するためのpygtk.treeviewを含むダイアログがあります。各行には、その優先度に基づいて背景色が設定されているため、たとえば、最も高い優先度の背景は明るい赤になります。

行選択の色はそれほど簡単には変更できません。を使用して設定できますtreeview.modify_base(gtk.STATE_SELECTED, "#C4C4C4")が、優先順位の概念を強化するために使用される色とうまく機能する色はありません。

選択色を、通常の行の背景として使用される色の少し暗いバージョンに変更することを考えたので、上記の例では、それはより暗い赤になります。treeselectionのchangedシグナルに応答して上記の関数を呼び出してみましたが、動作しますが、ちらつきが大きくなります。

もう1つのアイデアは、選択範囲を透明に変更し、代わりに境界線を配置することでしたが、私が知る限り、これは不可能です。

  1. ちらつきを起こさずに、上記のように選択色を変更するにはどうすればよいですか?
  2. 行の周囲に境界線のみを設定して、選択範囲の表示を変更できますか?

注:これは、ユーザーが選択したテーマに違反していることを認識しています。それには正当な理由があると思います。優先度を色で示すと、すぐに認識できます。選択色はこれを隠します。別の提案があれば、私はそれらを受け入れますが、ユーザーが優先順位を識別しやすいようにする必要があります。

4

5 に答える 5

4

ここで説明する方法を使用できます。簡単にテストしましたが、ちらつきなく機能します。基本的に、トリックはセルレンダラーの「マークアップ」プロパティを使用することです。ただし、1つの落とし穴があります。この方法で背景色を変更する場合は、行全体ではなく、「実際の」テキストの背後にある背景のみが変更されます。ただし、実際には私の意図であるテキストの色(<span foreground = ...)を変更したい場合は、問題ないように見えます。

私は次のCellDataFuncを持っています(これはC#ですが、それでも役立つことを願っています):

private void CellDataFunc(Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter) {
    Item item = (Item) model.GetValue (iter, 0);
    if(cell is CellRendererText) {
        int id = (int)column.GetData("colId");
        string text = "";
        switch(id) {
            case 0: text = item.Name;  break;
            case 1: text = item.Size; break;
            case 2: text = item.Time.ToString();  break;                
        }
        //(cell as Gtk.CellRendererText).Text = text;
        if(item.Highlight) {
            (cell as Gtk.CellRendererText).Markup = 
                            "<span background=\"red\">"+text+"</span>";
        } else {
            (cell as Gtk.CellRendererText).Markup = text;
        }
    }
}
于 2012-03-03T17:55:13.657 に答える
2

選択を示すために、左端に別のpixbufセル(たとえば、小さなアイコンと同じサイズ)を追加できます。選択した行は、背景に使用される色のより「塗りつぶされた」(飽和した)バージョンでこれを塗りつぶすことができます。例えば。優先度の高いピンクの背景を使用する場合は、選択インジケーターに赤を使用できます。または、アイコンを使用することもできます。

これをカラーフィル方法で実装するには:

  1. Tobiasの提案に従って、組み込みの強調表示を無効にします(「STATE_SELECTEDの色をSTATE_NORMALと同じにします」)。
  2. それに基づいてウィジェットを作成すると、おそらくメソッドgtk.gdk.Pixbufを使用して、単色の領域を作成できます。fill
  3. 「選択」セルにはCellRendererPixbufを使用します。

次に、選択の変更時に「選択セル」に色を付けたり、色を消したりして、どの行が選択されているかを示したり、アイコン(銘柄記号など)を表示したりできます。

私はこれを実装していないことに注意してください、それは単なるアイデアです。通常のGTK選択表示とは大きく異なるため、(明らかに)使用可能かどうかはあなたの判断で判断してください。

于 2010-06-23T08:06:32.950 に答える
0

ちらつきの意味がわかりません。境界線には、TreeViewのサブクラス化が必要です。

組み込みの強調表示を無効にするには、STATE_SELECTEDの色をSTATE_NORMALと同じにします。次に、各列にdata_funcを設定し、選択範囲にあるかどうかに応じて、セルレンダラーの色を変更します。

あなたはおそらくあなたの優先順位のためにこれをすでに行っているので、行を強調するために色を何かで乗算するだけです。

于 2010-06-23T07:38:38.057 に答える
0

質問は古くなっていますが、他の誰かが役立つ可能性があります...選択を完全に無効にし、ツリーでホバー効果を作成するには、次の手順に従います。1.ツリーでシステム選択を無効にします。

  _treeView.Selection.Mode = SelectionMode.None;
  1. MotionNotifyEventイベントの処理:

    [ConnectBefore]
    private void TreeViewOnMotionNotifyEvent(object o, MotionNotifyEventArgs args)
    {
        TreePath treePath;
        TreeIter iter;
    
        int x = Convert.ToInt32(args.Event.X);
        int y = Convert.ToInt32(args.Event.Y);
    
        _treeView.GetPathAtPos(x, y, out treePath);
        _treeView.Model.GetIter(out iter, treePath);
    
        BindObject fieldModel = CellUtil.GetModelValue(_treeView.Model, iter, 1) as BindObject;
    
        HoverLine = _vievModel.BindObjectCollection.IndexOf(fieldModel);
    }
    
  2. SetCellDataFuncメソッドの場合:

    BindObject fieldModel = CellUtil.GetModelValue(treeModel, iter, 1) as BindObject;
    int rowCount = _vievModel.BindObjectCollection.IndexOf(fieldModel);
    
    if (HoverLine == rowCount)
    {
            cellRenderer.CellBackgroundGdk = ThemeUtility.GdkOddSelectionColor; //Your selection color
    }
    else
    {
            cellRenderer.CellBackgroundGdk = ThemeUtility.SystemSelectionColor; //Your system selection color
    }
    ...
    
于 2017-03-20T13:47:28.500 に答える
0

ModifiedBaseとModifyTextの両方を呼び出すことは私のために働きました。ModifiedBaseを呼び出すだけで、テキストの色が白に変わります

GTK C#の例:

treeViewList.ModifyBase(StateType.Selected、treeViewList.Style.Base(StateType.Normal)); treeViewList.ModifyText(StateType.Selected、treeViewList.Style.Text(StateType.Normal));

于 2020-02-05T10:07:22.070 に答える