【问题标题】:Can't add multiple buttons to window in gtkmm?不能在 gtkmm 中向窗口添加多个按钮?
【发布时间】:2016-04-16 09:44:00
【问题描述】:

我仍然是使用小部件工具包的新手,但我真的认为这应该可行。我从 developer.gnome.org 复制了这段代码,并将我自己的对象 (button2) 添加到 Buttons 类中,但只有原始的 m_button 显示在窗口中。 button.h的内容:

    #ifndef GTKMM_EXAMPLE_BUTTONS_H
    #define GTKMM_EXAMPLE_BUTTONS_H

    #include <gtkmm/window.h>
    #include <gtkmm/button.h>

    class Buttons : public Gtk::Window
    {
    public:
        Buttons()
        {
        m_button.add_pixlabel("info.xpm", "hi");
        button2.add_pixlabel("info.xpm", "hello");

        set_title("Pixmap'd buttons!");
        set_border_width(10);

        m_button.signal_clicked().connect( sigc::mem_fun(*this,
          &Buttons::on_button_clicked) );

        add(button2);
        add(m_button);

        show_all_children();
        }

        virtual ~Buttons()
        {
        }

    protected:
        //Signal handlers:
        void on_button_clicked()
        {
        }

        //Child widgets:
        Gtk::Button button2;
        Gtk::Button m_button;
        };

        #endif //GTKMM_EXAMPLE_BUTTONS_H

main.cpp 的内容:

    #include "buttons.h"
    #include <gtkmm/application.h>

    int main(int argc, char *argv[])
    {
    Glib::RefPtr<Gtk::Application> app =
    Gtk::Application::create(argc, argv,
    "org.gtkmm.examples.base");

    Buttons buttons;

    return app->run(buttons);
    }

【问题讨论】:

    标签: c++ gtk gtkmm


    【解决方案1】:

    我目前也在学习 Gtkmm,所以这可能不是最好的答案,但我认为这样做的正确方法是添加 Gtk::Box 对象,然后将 Gtk::Buttons 添加到 Gtk: :框

    我就是这样做的。此外,由于一致性,我已将您的标题 gtkmm_example_buttons.h 拆分为 gtkmm_example_buttons.hpp 和 gtkmm_example_buttons.cpp ,我还将按钮名称 m_button 更改为 button1 以匹配 button2 名称。

    //gtkmm_example_buttons.hpp
    #pragma once //used instead of the ifdef
    
    #include <gtkmm/window.h>
    #include <gtkmm/button.h>
    #include <gtkmm/box.h>
    
    class Buttons : public Gtk::Window
    {
    public:
    Buttons();
    virtual ~Buttons();
    
    protected:
    void on_button_clicked();
    Gtk::Button button1, button2;
    Gtk::Box box1;
    };
    

    我还删除了信号处理,因为它们只会使代码更加复杂。稍后您将了解更多信息。

    //gtkmm_example_buttons.cpp
    #include "gtkmm_example_buttons.hpp"
    #include <gtkmm/window.h>
    #include <gtkmm/button.h>
    #include <gtkmm/box.h>
    
    Buttons::Buttons()
    {
    button1.add_pixlabel("info.xpm", "hi");
    button2.add_pixlabel("info.xpm", "hello");
    
    set_title("Pixmap'd buttons!");
    set_border_width(10);
    add(box1);
    
    box1.pack_start(button1);
    box1.pack_start(button2);
    
    show_all_children();
    }
    
    Buttons::~Buttons()
    {
    }
    
    void Buttons::on_button_clicked()
    {
    }
    

    还有主要的:

    //main.cpp
    #include "gtkmm_example_buttons.hpp"
    #include <gtkmm.h>
    
    int main (int argc, char *argv[])
    {
    auto app = Gtk::Application::create(argc, argv, "org.gtkmm.test");
    //Shows the window and returns when it is closed.
    
    Buttons buttons;
    return app->run(buttons);
    }
    

    【讨论】:

    • 这是正确的答案,因为小部件不应该直接添加到窗口中。如果您添加两个小部件,我不知道会发生什么,但我认为您的按钮可能已经堆叠在一起了。始终使用框进行小部件布局。
    • 正确,一个 GtkWindow 只能容纳一个孩子。 (GtkBin 的子类只能容纳一个孩子。)使用 GtkBox 和 GtkGrid 等布局小部件来布局多个小部件。
    • 如何获取按钮事件并调用 main() 中的函数?
    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多