GTK4 ScrolledWindow делает контент нечитаемым

Я изучаю GTK4 и Python. Во время игры скласс, я столкнулся с этим странным поведением, которое я не могу понять.

Я хочу, чтобы моя боковая панель располагалась слева, а мой контент можно было прокручивать. Для этого я ввел контейнер между содержимым (сеткой) и стеком. Когда я это делаю, содержимое сетки больше не читается, так как его размер уменьшился. Однако теперь небольшой контент можно прокручивать.

Вот как это выглядит: См. изображение.

Я хотел бы понять, почему, когда сетка завернута вего содержимое сжимается, оставляя дополнительное нежелательное пространство для боковой панели стека.

Мой код:

      #!/usr/bin/python

import sys
import gi
gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')
from gi.repository import Gtk, Adw


class MainWindow(Gtk.ApplicationWindow):

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

        self.set_title("Demo")
        self.set_default_size(400, 400)

        #
        # Create grid and add some content to be scrolled
        #

        self.grid = Gtk.Grid()

        for row in range(50):
            self.grid.attach(Gtk.Label(label = "Text Text Text Text Text Text Text Text Text"), 0, row, 1, 1)
 
        #
        # Wrap grid in ScrolledWindow
        #

        self.scrollableContent = Gtk.ScrolledWindow()
        self.scrollableContent.set_child(self.grid)

        #
        # Create a stack, Add the ScrolledWindow.
        #

        self.content = Gtk.Stack()
        self.content.add_titled(self.scrollableContent, "Scrollable", "Content . . . . . . . . ")

        #
        # Create the sidebar and add the stack.
        #

        self.sidebar = Gtk.StackSidebar()
        self.sidebar.set_stack(self.content)

        #
        # Create a box to hold the sidebar and the content stack side by side Horizontaly.
        #

        self.structure = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)

        self.structure.set_homogeneous(False) # just to be sure

        self.structure.append(self.sidebar)      
        self.structure.append(self.content)

        #
        # Set the box as the content of the window it self.
        #

        self.set_child(self.structure)




class DemoApp(Adw.Application):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.connect('activate', self.on_activate)


    def on_activate(self, app):
        self.win = MainWindow(application=app)
        self.win.present()

app = DemoApp(application_id="com.vildljung.Demo")
app.run(sys.argv)

1 ответ

Кажется, что по умолчаниюGtkScrolledWindowне учитывает размеры дочернего виджета при собственных вычислениях.

В вашем случае кажется, что высота была рассчитана соответствующим образом, но не ширина. API предлагает эту функцию :

      void
gtk_scrolled_window_set_propagate_natural_width (
  GtkScrolledWindow* scrolled_window,
  gboolean propagate
)

который гарантирует, что размеры дочернего виджета распространяются на размеры прокручиваемого окна.

Я попробовал это на Gtkmm3.24, и это решило проблему.

Источник: https://gitlab.gnome.org/GNOME/gtk/-/issues/3515 .

Другие вопросы по тегам