如何将 Gtk::Entry 打包到 Gtk::HeaderBar 中,以便条目完全填满 header 栏?

How do I pack a Gtk::Entry into a Gtk::HeaderBar so the entry completely fills the header bar?

我正在 gtkmm-3.0 中制作一个程序,其中有一个 Gtk::HeaderBar 作为标题栏。

我正在尝试使用以下代码将 Gtk::Entry 打包到其中:

Gtk::HeaderBar headerBar;
Gtk::Entry entry;

headerBar.set_hexpand();
headerBar.set_halign((Gtk::Align)GTK_ALIGN_FILL);
entry.set_hexpand();
entry.set_halign((Gtk::Align)GTK_ALIGN_FILL);
headerBar.pack_start(uriEntry);
headerBar.set_show_close_button();

条目包装正确,但它只填充了 header 栏的 一半 space,这非常混乱。使用 headerBar.add(entry)headerBar.pack_end(entry) 丝毫没有帮助(该条目仍然填充了它应该占用的 space 的一半)。

此外,在 headerBar.pack_start(entry) 行之前使用 headerBar.pack_start()Gtk::Button 会将按钮放置在其位置,但条目将在其停止的同一点停止扩展以前,比以前短。

如何让条目填满整个 header 栏?

问题是 Gtk::HeaderBar 也有一个使用 space 的“标题”小部件。您可以设置一个标题,结果是:

你明白为什么只有一半的屏幕给条目了。一种解决方法是定义您自己的自定义 header 栏。这是一个极其简单的例子:

#include <gtkmm.h>

class MainWindow : public Gtk::ApplicationWindow
{

public:

    MainWindow();

private:

    Gtk::Box m_customHeaderBar;
    Gtk::Entry m_entry;

};

MainWindow::MainWindow()
{
    m_entry.set_hexpand_set(true);
    m_entry.set_hexpand();

    m_customHeaderBar.pack_start(m_entry);

    set_titlebar(m_customHeaderBar);
}

int main(int argc, char *argv[])
{
    auto app = Gtk::Application::create(argc, argv, "org.gtkmm.examples.base");
  
    MainWindow window;
    window.show_all();
  
    return app->run(window);
}

结果是:

当然,您必须自己添加一个关闭按钮和所有内容(我建议制作 class)。这部分就交给你了。