我很想创建一个应用程序,它能够在固定大小的触摸屏中间显示不同的内容。在我浪漫的想象中,我将在屏幕的左右两侧有两个薄按钮来切换中间的内容。我希望这些内容显示带有变化信息的图片(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::小部件是正确的选择吗?我对每一个想法都表示感谢。
1条答案
按热度按时间gojuced71#
我能够找到答案。答案很简单。Gtk::Grid是一个Gtk::Widget,基本上可以填充任何内容。屏幕中间的内容只需从Gtk::Grid派生而来。