Я пытаюсь создать окно с помощью gtkmm, в котором у меня есть два текстовых представления. Текстовые представления должны быть организованы как вертикальный разделенный экран. Вот так:
Позже я хочу иметь возможность разбивать экран по вертикали и горизонтали снова и снова и изменять размер разделенных областей, как в emacs.
Я думал, что простой разделенный экран должен быть легким, но я уже застрял там. Я думал об использовании Gtk::Grid в качестве контейнера макета, и каждый раз, когда пользователь хочет разделить экран, я думал о добавлении строки или столбца и добавлении нового текстового представления во вновь созданную область.
Вот мой код:
main.cc
#include <gtkmm/application.h>
#include "examplewindow.h"
int main(int argc, char *argv[])
{
auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
ExampleWindow window;
//Shows the window and returns when it is closed.
return app->run(window);
}
примерwindow.h
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H
#include <gtkmm.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
virtual ~ExampleWindow();
protected:
Gtk::Grid main_grid;
Gtk::ScrolledWindow scrolled_window1;
Gtk::ScrolledWindow scrolled_window2;
Gtk::TextView text_view1;
Gtk::TextView text_view2;
Glib::RefPtr<Gtk::TextBuffer> text_buffer1, text_buffer2;
void fill_buffers();
};
#endif //GTKMM_EXAMPLEWINDOW_H
примерwindow.cc
#include "examplewindow.h"
ExampleWindow::ExampleWindow() {
set_title("Gtk splitted textviews");
set_border_width(12);
add(main_grid);
scrolled_window1.add(text_view1);
scrolled_window1.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
scrolled_window2.add(text_view2);
scrolled_window1.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
main_grid.insert_column(0);
main_grid.attach(scrolled_window1, 0, 0, 1, 1);
//scrolled_window1.set_hexpand(true);
//scrolled_window1.set_vexpand(true);
main_grid.attach(scrolled_window2, 1, 0, 1, 1);
//scrolled_window1.set_hexpand(true);
//scrolled_window1.set_vexpand(true);
fill_buffers();
text_view1.set_buffer(text_buffer1);
text_view2.set_buffer(text_buffer2);
show_all_children();
}
ExampleWindow::~ExampleWindow() {}
void ExampleWindow::fill_buffers() {
text_buffer1 = Gtk::TextBuffer::create();
text_buffer1->set_text("This is the text from TextBuffer #1.");
text_buffer2 = Gtk::TextBuffer::create();
text_buffer2->set_text(
"This is some alternative text, from TextBuffer #2.");
}
построить с:
g++ examplewindow.cc main.cc -o splittv `pkg-config gtkmm-3.0 --cflags --libs`
Просмотры текста явно слишком малы. Если я устанавливаю для heexpand и vexpand значение true в обоих текстовых представлениях, text_view1 подавляет text_view2.
GtkPaned
- person Gerhardh   schedule 14.09.2017