gtkmm 3 ScrolledWindow 内框内的 TreeView 无法正确呈现图标

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

我正在尝试设计一个小部件,其中树视图和其他小部件在滚动窗口内共享一个垂直框:

树视图有一个文本列和一个图标列。图标列在一定行数后停止呈现。它停止的点是一致的。实际呈现的行数取决于图标的大小。使图标变小将呈现更多行。我已经看到它在图标中间停止渲染。

对于 40 x 40 像素的图标,如果我尝试渲染 500 行,大约 400 行可以正确渲染。我尝试渲染的行数也会影响结果:对于一些大量的行(10000 多行),我会遇到分段错误,对于另外大量的行,渲染有效。

如果树视图直接放置在滚动窗口内,一切总是正确呈现。我尝试将 treeview 放在框内固定大小的滚动窗口内,在滚动窗口内,但结果同样有问题。

这是它在 389 行后停止渲染时的样子:

任何解决问题或找到解决问题方法的帮助将不胜感激。

下面是该问题的一个小型演示应用程序。它在 Linux 上使用 gtkmm 3。

test.h

#ifndef TEST_H_
#define TEST_H_

#include <thread>

#include <gtkmm.h>

class model_columns : public Gtk::TreeModel::ColumnRecord
{
public:
   model_columns()
   {
      add(m_col_desc);
      add(m_col_topic_type_icon);
   }

   Gtk::TreeModelColumn<std::string> m_col_desc;
   Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf>> m_col_topic_type_icon;
};

class test: public Gtk::Window
{
public:
   test();

private:
   Gtk::ScrolledWindow m_scrolled_window;
   Gtk::ScrolledWindow m_scrolled_window_1;
   Glib::RefPtr<Gtk::ListStore> m_ref_list_model;
   model_columns m_model_columns;
   Gtk::TreeView m_tree_view;
   Gtk::Box m_box;

   Gtk::Frame m_frame;
};

test.cpp

#include "test.h"

#include <iostream>

test::test()
{
   resize(1050, 1000);
   add(m_scrolled_window);
   m_scrolled_window.add(m_box);

   m_box.set_orientation(Gtk::ORIENTATION_VERTICAL);
   m_box.pack_start(m_tree_view, true,  true);

   m_ref_list_model = Gtk::ListStore::create(m_model_columns);
   m_tree_view.set_model(m_ref_list_model);
   m_tree_view.append_column("Desc1", m_model_columns.m_col_topic_type_icon);
   m_tree_view.append_column("Desc2", m_model_columns.m_col_desc);
   m_tree_view.set_headers_visible(false);

   auto icon = Gdk::Pixbuf::create_from_file("circle.png");
   icon = icon->scale_simple(40,
                             40,
                             Gdk::INTERP_BILINEAR);
   for (uint32_t i = 0; i < 500; i++)
   {
      Gtk::TreeModel::Children::iterator iter = m_ref_list_model->append();
      Gtk::TreeModel::Row row = *iter;
      row[m_model_columns.m_col_desc] = std::to_string(i);
      row[m_model_columns.m_col_topic_type_icon] = icon;
   }
}

main.cpp

#include <gtkmm.h>
#include <giomm/application.h>

#include "test.h"

int main (int argc, char ** argv)
{
   Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.test_app");
   test test_i;
   app->run(test_i);
   return 0;
}

制作文件

EXECUTABLE=test_app
CFLAGS=-c -Wall 

CC=g++
SOURCES = main.cpp test.cpp
OBJECTS=$(SOURCES:.cpp=.o)

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(OBJECTS) -o $@ `pkg-config gtkmm-3.0 --libs`

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@  `pkg-config gtkmm-3.0 --cflags` -g 

clean:
    rm -rf *.o $(EXECUTABLE)

应用程序在运行时使用的名为 circle.png 的图标文件

gtk gnome gtkmm
© www.soinside.com 2019 - 2024. All rights reserved.