微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GTK4 使用 GtkDropTarget 从 pixbuf 设置图像的问题

如何解决GTK4 使用 GtkDropTarget 从 pixbuf 设置图像的问题

我正在测试一个 gtk4 小部件,它是 GtkDropTarget。我计划将一个拖到窗口的图像设置为窗口本身的图像。但是一旦我拖动图像文件就会出现错误。需要说明的是,这是 vala 中的代码

int main (string[] args) {
    var app = new App();
    return app.run(args);
}

public class App : Gtk.Application {
    public App () {
    Object (
        application_id: "com.github.ea",flags: ApplicationFlags.FLAGS_NONE
    );
    }
    public override void activate () {
    var window = new Window (this);
    add_window (window);
    }
}

public class Window : Gtk.applicationwindow {
    public Window (Gtk.Application app) {
        Object (application: app);
    }

construct {
        title = "Drag";
    set_default_size (640,480);
    var drag_source = new DragSource ();
    set_child (drag_source.self);       
    show ();
    }
}

public class DragSource {
    public Gtk.Image self;

    public DragSource () {

        self = new Gtk.Image ();
        var drag_controller = new Gtk.DropTarget (GLib.Type.INVALID,Gdk.DragAction.copY);

        drag_controller.set_gtypes ({typeof(File)});

        self.add_controller (drag_controller);
        drag_controller.on_drop.connect (on_drop);
    }

    private bool on_drop (GLib.Value val,double x,double y) {
        File filename = (File) val;
        var file_path = filename.get_path ();
        
        if (val.holds(typeof(File)) == true) {
        print ("The dragged object is a file.\n");

        if ("png" in file_path || "jpg" in file_path) {
                print ("The dragged object is an image.\n");
                self.set_from_pixbuf (pixbuf(file_path));
        }
            else {
                print ("The dragged object is NOT an image.\n");
        }
    }
        else {
            print ("The dragged object is NOT a file.\n");
        return false;
        }
        return true;
    }

    private Gdk.Pixbuf pixbuf (string file) {
        try {
            return new Gdk.Pixbuf.from_file (file);
        } catch (Error e) {
            error ("%s",e.message);
            }
        }
}

这将编译并运行。但是一旦我将图像文件拖到窗口中,就会发生错误并且图像不显示。这是发生的事情的图片。应该发生的是,当我从我的文件管理器中拖动一个 png 文件时,拖动的图像应该是 GtkImage 中显示的图像,这是窗口的主要小部件。

在我第一次从我的电脑中拖动图像文件时,出现此错误

The dragged object is a file.
The dragged object is an image.

(v:3891): Gtk-CRITICAL **: 08:52:28.861: gtk_image_set_from_pixbuf: assertion 'GTK_IS_IMAGE (image)' Failed

在第二次拖动时,显示

(v:3891): Gdk-CRITICAL **: 08:53:33.388: gdk_drop_set_actions: assertion 'priv->state == GDK_DROP_STATE_NONE' Failed
The dragged object is a file.
The dragged object is an image.

(v:3891): Gtk-CRITICAL **: 08:53:33.973: gtk_image_set_from_pixbuf: assertion 'GTK_IS_IMAGE (image)' Failed

我真的很感激帮助。谢谢!

解决方法

这就是我将如何实现你的意图

int main (string[] args) {
    var app = new App ();
    return app.run (args);
}

public class App : Gtk.Application {
    public App () {
        Object (
            application_id: "com.github.ea",flags : ApplicationFlags.FLAGS_NONE
        );
    }

    public override void activate () {
        var window = new Window (this);
        window.present ();
    }
}

public class Window : Gtk.ApplicationWindow {
    public Window (Gtk.Application app) {
        Object (application: app);
    }

    construct {
        title = "Drag an Image!";
        set_default_size (640,480);

        var image = new Gtk.Image ();
        image.vexpand = image.hexpand = true;

        var controller = new Gtk.DropTarget (typeof (GLib.File),Gdk.DragAction.COPY);
        controller.on_drop.connect ((target,value,x,y) => {
            var file = (GLib.File) value;
            var filename = file.get_path ();
            if (GLib.ContentType.guess (filename,null,null).contains ("image")) {
                image.set_from_file (filename);
            }
        });
        image.add_controller (controller);

        set_child (image);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?