我正在尝试设计一个小部件,其中树视图和其他小部件在滚动窗口内共享一个垂直框:
树视图有一个文本列和一个图标列。图标列在一定行数后停止呈现。它停止的点是一致的。实际呈现的行数取决于图标的大小。使图标变小将呈现更多行。我已经看到它在图标中间停止渲染。
对于 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)