linux c++ 拖拽事件
作者:野牛程序员:2023-07-09 09:10:30 C++阅读 2707
在Linux中,使用C++编写GUI应用程序可以通过一些库实现拖放(拖拽)事件。一个常用的图形库是GTK+,下面是一个简单的示例代码,演示了如何使用GTK+实现拖放事件。
#include <gtk/gtk.h> // 拖放源的回调函数 static gboolean drag_data_get(GtkWidget* widget, GdkDragContext* context, GtkSelectionData* selection_data, guint info, guint time, gpointer user_data) { // 在这里设置拖放数据 const gchar* text = "Hello, Drag and Drop!"; gtk_selection_data_set_text(selection_data, text, -1); return TRUE; } // 拖放目标的回调函数 static gboolean drag_data_received(GtkWidget* widget, GdkDragContext* context, gint x, gint y, GtkSelectionData* selection_data, guint info, guint time, gpointer user_data) { // 在这里获取拖放的数据 gchar* text = gtk_selection_data_get_text(selection_data); if (text != NULL) { g_print("Received data: %s\\n", text); g_free(text); } // 返回值表示拖放是否成功接收数据 return TRUE; } int main(int argc, char* argv[]) { gtk_init(&argc, &argv); GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); // 创建一个可拖放源的标签 GtkWidget* label = gtk_label_new("Drag Me!"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_drag_source_set(label, GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY); g_signal_connect(label, "drag-data-get", G_CALLBACK(drag_data_get), NULL); // 创建一个可接受拖放的标签 GtkWidget* target = gtk_label_new("Drop Here!"); gtk_label_set_selectable(GTK_LABEL(target), TRUE); gtk_drag_dest_set(target, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY); g_signal_connect(target, "drag-data-received", G_CALLBACK(drag_data_received), NULL); GtkWidget* vbox = gtk_vbox_new(TRUE, 5); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), target, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); gtk_widget_show_all(window); gtk_main(); return 0; }
这个示例程序创建了一个包含两个标签的窗口,一个标签作为拖放源,另一个标签作为拖放目标。你可以点击并拖动源标签,然后将其释放到目标标签上。在拖放源的回调函数中,我们设置了拖放的数据,而在拖放目标的回调函数中,我们获取并处理了拖放的数据。
请注意,这个示例使用了GTK+库,因此在编译和运行代码之前,你需要确保已经安装了GTK+库和相关的开发包。你可以使用适合你的Linux发行版的包管理器进行安装。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:setprecision在下一行输出依旧有效吗
- 下一篇:C++ 文件名判断文件类型