c++ gtkmm 3.0切换Gtk::窗口中容器小部件的内容

camsedfj  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(159)

我很想创建一个应用程序,它能够在固定大小的触摸屏中间显示不同的内容。在我浪漫的想象中,我将在屏幕的左右两侧有两个薄按钮来切换中间的内容。我希望这些内容显示带有变化信息的图片(Gtk::DrawingArea),或者有排列在Gtk::网格中的按钮。基本上,我希望在没有标题栏的Gtk::窗口中间有变化的Gtk:Windows。但是窗口中的窗口没有意义。我搜索了gtkmm容器小部件,但不知道选择哪一个。可能,没有,我需要一个完全不同的方法?
我的第一种方法是设置一个名为“GrundStruktur”的Gtk::窗口,其中包含一个用于左右两个按钮的网格和一个用于通用Gtk::Widget的占位符。
主要功能:

#include "GrundStruktur.h"
#include "Dachgeschoss.h"
#include <memory>
#include <gtkmm/application.h>
#include <gtkmm/button.h>

int main (int argc, char *argv[])
{
  auto app = Gtk::Application::create(argc, argv, "LBW.Touchscreen.DG");
  //std::unique_ptr<Gtk::Widget> hey = std::make_unique<Gtk::Button> ("Oha");
  //std::unique_ptr<Gtk::Widget> ho = std::make_unique<Gtk::Button> ("Aho");
  Gtk::Widget * ho = new Gtk::Button("Aho");
  Gtk::Widget * hey = new Gtk::Button("Oha");
  GrundStruktur grundStruktur{ho, hey};
  return app->run(grundStruktur);
}

GrundStruktur的构造器接受一个std::initializer_list,它带有指向Gtk::Widgets的指针。出于测试的目的,我创建了两个Gtk::Button,传递给GrundStruktur。我想使用std::unique_ptr而不是传统的指向堆的指针,但是没有设法让它与initializer_list一起运行。但是我只能一个接一个地关注问题;- )
GrundStruktur看起来是这样的:

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

class GrundStruktur : public Gtk::Window
{
    public:
        //GrundStruktur(std::initializer_list<std::unique_ptr<Gtk::Widget> > il);
        GrundStruktur(std::initializer_list<Gtk::Widget* > il);
        ~GrundStruktur();

    private:
        Gtk::Grid grid_haupt_teilung; 
        
        Gtk::Button button_mitte_wechsel_links;
        Gtk::Button button_mitte_wechsel_rechts;

        std::vector<Gtk::Widget* > Mitte;
        //std::vector<std::unique_ptr<Gtk::Widget > > Mitte;
        
        //Signal handlers:
        void links_modus();  //durchtoggeln links
        void rechts_modus(); //durchtoggeln rechts
};

std::vector〈Gtk::Widget*〉米特应该保存指向屏幕中间的Widget的指针。如果用户按下Gtk::Button button_mitte_wechsel_links,下一个Widget应该显示在屏幕上,依此类推。
下面是构造函数:

GrundStruktur::GrundStruktur(std::initializer_list<Gtk::Widget* > il) : Mitte(il)
{
    set_default_size(800, 480);
    set_size_request(800, 480);
    set_decorated(false);
    set_resizable(false);  
    set_position(Gtk::WIN_POS_CENTER);

    button_mitte_wechsel_links = Gtk::Button("<");
    button_mitte_wechsel_rechts = Gtk::Button(">");

    grid_haupt_teilung.set_orientation(Gtk::ORIENTATION_HORIZONTAL);

    grid_haupt_teilung.attach(button_mitte_wechsel_links,  0, 0);
    grid_haupt_teilung.attach(*Mitte.front(),              1, 0);
    grid_haupt_teilung.attach(button_mitte_wechsel_rechts, 2, 0);

    add(grid_haupt_teilung);
button_mitte_wechsel_links.signal_clicked().connect(sigc::mem_fun(*this,&GrundStruktur::links_modus));
    button_mitte_wechsel_rechts.signal_clicked().connect(sigc::mem_fun(*this,&GrundStruktur::rechts_modus));

    show_all_children();
}

我的测试按钮在main()中运行良好。Gtk::Buttons是Gtk::Widgets -很好。但是如果我想设置一个自定义的Widget容器来保存Gtk::Grid,我不知道该取哪个。在gtkmm文档中有一个Gtk::Fixed Widget,我可能可以使用它,但是我不能从Gtk::Fixed派生一个自定义类。
屏幕中间的自定义小部件是什么类型的?Gtk::小部件是正确的选择吗?我对每一个想法都表示感谢。

gojuced7

gojuced71#

我能够找到答案。答案很简单。Gtk::Grid是一个Gtk::Widget,基本上可以填充任何内容。屏幕中间的内容只需从Gtk::Grid派生而来。

相关问题