创建大量Gtk小部件比在方法中传递上下文更好吗?

Is it better to create lots of Gtk widgets instead of passing context in methods?

本文关键字:上下文 更好 方法 Gtk 小部 创建      更新时间:2023-10-16

我对GTK/GTK++非常陌生,我来自MFC,所以我知道我有几个坏习惯需要摆脱;)

我想知道在Gtk::DrawingArea中绘制UI块的最佳方法(如"最有效")是什么。这些块可以在绘图区域的任何位置绘制(我不能使用堆栈或表)。

现在我已经创建了一个类UIBlock,并在其中添加了一个Draw()方法。因此,在我的衍生版本Gtk::DrawingArea::on_draw()中,我调用所有UIBlock::Draw(),并将我为绘制文本创建的Cairo::RefPtr<Cairo::Context>Glib::RefPtr<Pango::Layout>转移给它们。

所以我有这样的东西:

// MyDrawingArea.h
class MyDrawingArea : public Gtk::DrawingArea
{
protected:
    virtual bool on_draw(Cairo::RefPtr<Cairo::Context> const& cr) override;
private:
    std::vector<UIBlock> m_uiBlockList;
}
// MyDrawingArea.cpp
bool MyDrawingArea::on_draw(Cairo::RefPtr<Cairo::Context> const& cr)
{
    for(UIBlock const* uiBlock : m_uiBlockList)
    {
        uiBlock->Draw(cr, layout); // I've got a few other parameters like a bunch
                                   // of layouts for the different fonts I use,
                                   // the UI block position, etc...
    }
}

我想知道这个解决方案是否好,或者从Gtk::Widget简单地派生我的UIBlock类是否更容易和更有效。

希望我清楚我的问题;)谢谢!

编辑:

正如我在drahnr回答的评论中所说,GooCanvas不是一个选择,因为它不再被开发了。新一代的画布API是Clutter,但它在GTK中的集成仍在进行中。

所以我现在将继续使用我自制的Cairo溶液。但我仍然需要知道是否有良好的实践显示大量的矩形和文本在画布上。这是我现在的截图,但是当我有数十万个矩形时,它有点慢…

你正在重新实现GooCanvas(除非你有进一步的约束你没有提到)-它有一个GooCanvasItem,可以保持常规的GtkWidget s(称为GooCanvasWidget)。

https://wiki.gnome.org/action/show/Projects/GooCanvas?action=show&重定向= GooCanvas