——————————pro————————————-
INCLUDEPATH += /usr/include/gtk-3.0 \
/usr/include/at-spi2-atk/2.0 \
/usr/include/at-spi-2.0 \
/usr/include/dbus-1.0 \
/usr/lib/x86_64-linux-gnu/dbus-1.0/include \
/usr/include/gtk-3.0 /usr/include/gio-unix-2.0 \
/usr/include/cairo /usr/include/pango-1.0 \
/usr/include/harfbuzz \
/usr/include/pango-1.0 \
/usr/include/fribidi \
/usr/include/harfbuzz \
/usr/include/atk-1.0 \
/usr/include/cairo \
/usr/include/pixman-1 \
/usr/include/uuid \
/usr/include/freetype2 \
/usr/include/gdk-pixbuf-2.0 \
/usr/include/libpng16 \
/usr/include/x86_64-linux-gnu \
/usr/include/libmount \
/usr/include/blkid \
/usr/include/glib-2.0 \
/usr/lib/x86_64-linux-gnu/glib-2.0/include\
/usr/include/
LIBS += -pthread \
-pthread \
-lgtk-3 \
-lgdk-3 \
-lpangocairo-1.0 \
-lpango-1.0 \
-lharfbuzz \
-latk-1.0 \
-lcairo-gobject \
-lcairo \
-lgdk_pixbuf-2.0 \
-lgio-2.0 \
-lgobject-2.0 \
-lglib-2.0 \
-lserialport
INCLUDEPATH += /home/yue/openCV/install/include\
/home/yue/openCV/install/include/opencv4 \
/home/yue/openCV/install/include/opencv2
LIBS += /home/yue/openCV/install/lib/libopencv_highgui.so \
/home/yue/openCV/install/lib/libopencv_core.so \
/home/yue/openCV/install/lib/libopencv_imgproc.so \
/home/yue/openCV/install/lib/libopencv_imgcodecs.so
SOURCES += \
main.cpp
—————–main.cpp——————————————
#include
#include
#include
using namespace cv;
// 窗口中的图片位置
static int img_x = 0;
static int img_y = 0;
static int start_x = 0;
static int start_y = 0;
static bool dragging = false;
static bool in_image = false;
static Mat img;
// 检查鼠标是否在图片范围内
bool is_mouse_in_image(int mouse_x, int mouse_y) {
return (mouse_x >= img_x && mouse_x <= (img_x + img.cols) &&
mouse_y >= img_y && mouse_y <= (img_y + img.rows));
}
// 绘制图片到 GTK 窗口
static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr) {
if (img.empty()) return FALSE;
// 将 OpenCV Mat 转换为 Cairo 图像
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data(
(const guchar*)img.data,
GDK_COLORSPACE_RGB,
false,
8,
img.cols,
img.rows,
img.step,
NULL,
NULL
);
// 在指定位置绘制图像
gdk_cairo_set_source_pixbuf(cr, pixbuf, img_x, img_y);
cairo_paint(cr);
g_object_unref(pixbuf);
return FALSE;
}
// 处理鼠标按下事件
static gboolean on_button_press_event(GtkWidget *widget, GdkEventButton *event) {
if (event->button == GDK_BUTTON_PRIMARY) {
if (in_image) {
// 记录开始拖动的位置
dragging = true;
start_x = event->x – img_x;
start_y = event->y – img_y;
}
}
return FALSE;
}
// 处理鼠标释放事件
static gboolean on_button_release_event(GtkWidget *widget, GdkEventButton *event) {
if (event->button == GDK_BUTTON_PRIMARY) {
dragging = false;
}
return FALSE;
}
// 处理鼠标移动事件
static gboolean on_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) {
if (dragging) {
// 计算新的位置
img_x = event->x – start_x;
img_y = event->y – start_y;
gtk_widget_queue_draw(widget); // 触发重绘
} else {
// 更新鼠标是否在图像上
in_image = is_mouse_in_image(event->x, event->y);
}
return FALSE;
}
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
// 加载图片
img = imread(“/home/yue/monkey.png”, IMREAD_COLOR);
if (img.empty()) {
g_print(“Failed to load image\n”);
return -1;
}
// 创建 GTK 窗口
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget *drawing_area = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), drawing_area);
gtk_widget_set_size_request(drawing_area, 800, 600); // 设置绘图区的大小
// 连接绘制事件
g_signal_connect(G_OBJECT(drawing_area), “draw”, G_CALLBACK(on_draw_event), NULL);
// 连接鼠标事件
g_signal_connect(G_OBJECT(drawing_area), “button-press-event”, G_CALLBACK(on_button_press_event), NULL);
g_signal_connect(G_OBJECT(drawing_area), “button-release-event”, G_CALLBACK(on_button_release_event), NULL);
g_signal_connect(G_OBJECT(drawing_area), “motion-notify-event”, G_CALLBACK(on_motion_notify_event), NULL);
gtk_widget_add_events(drawing_area, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);
g_signal_connect(window, “destroy”, G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}