GTKMM:在叠加层上移动日历(裁剪问题)

gtkmm: moving a calendar on an overlay (cropping issue)

本文关键字:日历 裁剪 问题 移动 叠加 GTKMM      更新时间:2023-10-16

使用 Ubuntu 14.04 和 libgtkmm-3.0-dev

我有一个日历小部件放在覆盖容器上。在不进行任何更改的情况下,日历将显示在叠加层的左上角。我想稍微向下移动日历,但底部不断被切断。

请参阅下面的一些示例代码,这些代码将演示该问题。 如果将"newAlloc.set_y(30);"更改为"newAlloc.set_y(0);",则不会出现裁剪问题,但日历当然会返回到顶部。

#include <gtk/gtk.h>
#include <gtkmm.h>
#include <iostream>
void CalendarSizeAllocate(Gtk::Allocation alloc, Gtk::Calendar * cal)
{
    Gtk::Allocation newAlloc = alloc;
    newAlloc.set_y(30);
    cal->set_allocation(newAlloc);
}
int main(int argc, char *argv[])
{
  Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
    Gtk::Window window;
    window.set_default_size(300, 300);
    GtkWidget * Overlay = gtk_overlay_new();
    window.add(*Glib::wrap(Overlay));
    Gtk::Box box;
    gtk_container_add(GTK_CONTAINER(Overlay), GTK_WIDGET(box.gobj()));  
    Gtk::Calendar * calendar = new Gtk::Calendar();
    calendar->set_valign(Gtk::ALIGN_START);
    calendar->signal_size_allocate().connect(sigc::bind<Gtk::Calendar*>(sigc::ptr_fun(&CalendarSizeAllocate), calendar));
    gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), GTK_WIDGET(calendar->gobj()));
    window.show_all();
    app->run(window);
  return 0;
}

修复:

用于覆盖项目放置;您必须使用边距进行精确放置;和 H对齐和 V对齐用于通用放置。

calendar->set_margin_top(30); // This will push the calendar 30 pixels(?) down from the top.

您也不需要手动设置分配大小;您可以改用set_size_request(width, height)

更多细节在这里:

叠加说明

设置边距