gpt4 book ai didi

c++ - Gtkmm:创建一个列出 Gtk::DrawingArea 的 Gtk::ComboBox

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:52 27 4
gpt4 key购买 nike

我正在尝试创建一个 Gtk::ComboBox挂牌Gtk::DrawingArea小部件。我关注了this tutorial .到目前为止,这里是 Gtkmm3 的最小工作示例(即可用于重现问题):

#include <gtkmm.h>

class NewPlayerRow : public Gtk::ListBoxRow
{

public:

NewPlayerRow();

private:

// Model for the combobox row: a disc with the appropriate player color...
struct NewPlayerDiscColorComboRowModel : public Gtk::TreeModel::ColumnRecord
{
NewPlayerDiscColorComboRowModel()
{
add(m_discColorIcon);
}

Gtk::TreeModelColumn<Gtk::DrawingArea> m_discColorIcon;
};

NewPlayerDiscColorComboRowModel m_comboRowModel;
Glib::RefPtr<Gtk::ListStore> m_listStore;

Gtk::ComboBox m_comboBox;
};

NewPlayerRow::NewPlayerRow()
{
// First, create and register the TreeModel:
m_listStore = Gtk::ListStore::create(m_comboRowModel);
m_comboBox.set_model(m_listStore);

// Then, populate the TreeModel:
Gtk::TreeModel::Row row = *(m_listStore->append());
row[m_comboRowModel.m_discColorIcon] = Gtk::DrawingArea();

row = *(m_listStore->append());
row[m_comboRowModel.m_discColorIcon] = Gtk::DrawingArea();

// Add the model columns to the Combo:
m_comboBox.pack_start(m_comboRowModel.m_discColorIcon);

add(m_comboBox);
}

int main(int argc, char** argv)
{
Glib::RefPtr<Gtk::Application> app{Gtk::Application::create(argc, argv, "com.github.bobmorane22.connectx")};

NewPlayerRow np;
Gtk::Window w;
w.add(np);
w.show_all();

return app->run(w);
}

编译时出现如下错误:

In file included from /usr/include/glibmm-2.4/glibmm/value.h:196:0,
from /usr/include/glibmm-2.4/glibmm/propertyproxy_base.h:25,
from /usr/include/glibmm-2.4/glibmm/propertyproxy.h:25,
from /usr/include/glibmm-2.4/glibmm/objectbase.h:24,
from /usr/include/glibmm-2.4/glibmm/object.h:29,
from /usr/include/pangomm-1.4/pangomm/context.h:32,
from /usr/include/gtkmm-3.0/gtkmm/widget.h:32,
from /usr/include/gtkmm-3.0/gtkmm/actiongroup.h:29,
from /usr/include/gtkmm-3.0/gtkmm/application.h:32,
from src/main.cpp:32:
/usr/include/glibmm-2.4/glibmm/value_custom.h: In instantiation of ‘static void Glib::Value<T>::value_copy_func(const GValue*, GValue*) [with T = Gtk::DrawingArea; GValue = _GValue]’:
/usr/include/glibmm-2.4/glibmm/value_custom.h:257:9: required from ‘static GType Glib::Value<T>::value_type() [with T = Gtk::DrawingArea; GType = long unsigned int]’
/usr/include/gtkmm-3.0/gtkmm/treemodelcolumn.h:134:64: required from ‘Gtk::TreeModelColumn<T>::TreeModelColumn() [with T = Gtk::DrawingArea]’
src/main.cpp:50:9: required from here
/usr/include/glibmm-2.4/glibmm/value_custom.h:283:33: error: use of deleted function ‘Gtk::DrawingArea::DrawingArea(const Gtk::DrawingArea&)’
dest_value->data[0].v_pointer = new(std::nothrow) T(source);
^
In file included from /home/morane/Programming/cpp/ConnectX/cxgui/include/GeometricShape.h:35:0,
from /home/morane/Programming/cpp/ConnectX/cxgui/include/Disc.h:35,
from src/../include/../include/CXDisc.h:35,
from src/../include/../include/GBDisc.h:37,
from src/../include/GameBoard.h:41,
from src/../include/GameWindow.h:17,
from src/main.cpp:34:
/usr/include/gtkmm-3.0/gtkmm/drawingarea.h:64:3: note: declared here
DrawingArea(const DrawingArea&) = delete;

这似乎表明组合框行模型中的类型必须是可复制的才能工作。我试过替换类型 Gtk::DrawingAreastd::string (可复制)在上面的代码中,它构建良好并且运行良好。我可以看到带有文本行的组合框。

有解决办法吗?我真的很想创建一个列出绘图区域的组合框。


编辑 深入研究错误,我发现问题出在文件 value_custom.h 上。在 Glibmm 中。以下两个函数似乎解决了这个问题,因为它们尝试访问模板化类型的复制成员操作(在我的例子中是 Gtk::DrawingArea ,它是不可复制的,如上所述)。

// static
template <class T>
GType Value<T>::value_type()
{
if(!custom_type_)
{
custom_type_ = Glib::custom_boxed_type_register(
typeid(CppType).name(),
&Value<T>::value_init_func,
&Value<T>::value_free_func,
&Value<T>::value_copy_func);
}
return custom_type_;
}

// static
template <class T>
void Value<T>::value_copy_func(const GValue* src_value, GValue* dest_value)
{
// Assume the source is not NULL. See value_init_func().
const T& source = *static_cast<T*>(src_value->data[0].v_pointer);
dest_value->data[0].v_pointer = new(std::nothrow) T(source);
}

我开始觉得没有办法解决这个问题... documentation对于 Glib::Value<T>甚至提到类型 T必须实现复制分配/构造。

如果您有想法,我会洗耳恭听。

最佳答案

经过更多研究,我得出的结论是 Gtk::ComboBox es 根本就不是为保存小部件而设计的(因此是 Gtk::DrawingArea s),因为它使用了 Gtk::TreeModelColumn<T>在其 TreeModel , 其中T需要可复制。

换句话说,构成组合框模型的类型(即当您单击它时它实际列出的类型)必须是可复制的,否则框架将不允许您的代码编译。

起初,无法复制小部件这一事实对我来说毫无意义,但经过一番研究,我发现this article ,它清楚地解释了使用可复制小部件时可能遇到的一些(棘手)问题。

总而言之,我似乎正在努力完成一些事情,回想起来,无论如何在 UI 方面都会有点奇怪,我将尝试找到一些更简洁的方式来表达我的意图。

关于c++ - Gtkmm:创建一个列出 Gtk::DrawingArea 的 Gtk::ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51644290/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com