———————-.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
GtkWidget *inputA;
GtkWidget *inputC;
GtkWidget *stack; // 用于切换界面的 GtkStack
// 将字符添加到输入框C
void on_key_clicked(GtkWidget *widget, gpointer data) {
const gchar *text = gtk_button_get_label(GTK_BUTTON(widget));
const gchar *current_text = gtk_entry_get_text(GTK_ENTRY(data));
gchar *new_text = g_strconcat(current_text, text, NULL);
gtk_entry_set_text(GTK_ENTRY(data), new_text);
g_free(new_text); // 释放内存
}
// 删除字符
void on_backspace_clicked(GtkWidget *widget, gpointer data) {
const gchar *current_text = gtk_entry_get_text(GTK_ENTRY(data));
if (g_utf8_strlen(current_text, -1) > 0) {
gchar *new_text = g_utf8_substring(current_text, 0, g_utf8_strlen(current_text, -1) – 1);
gtk_entry_set_text(GTK_ENTRY(data), new_text);
g_free(new_text);
}
}
// 切换到界面B
void switch_to_B(GtkWidget *widget, gpointer data) {
gtk_stack_set_visible_child_name(GTK_STACK(stack), “界面B”);
}
// 切换回界面A
void switch_to_A(GtkWidget *widget, gpointer data) {
gtk_stack_set_visible_child_name(GTK_STACK(stack), “界面A”);
}
// 创建虚拟键盘
GtkWidget* create_keyboard(GtkWidget *input) {
GtkWidget *keyboard = gtk_grid_new();
gtk_grid_set_column_spacing(GTK_GRID(keyboard), 5);
gtk_grid_set_row_spacing(GTK_GRID(keyboard), 5);
// 定义键盘布局
const char *keys[4][10] = {
{“1”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “0”},
{“Q”, “W”, “E”, “R”, “T”, “Y”, “U”, “I”, “O”, “P”},
{“A”, “S”, “D”, “F”, “G”, “H”, “J”, “K”, “L”, “Backspace”},
{“Z”, “X”, “C”, “V”, “B”, “N”, “M”, “”, “”, “”}
};
// 添加按钮到键盘
for (int row = 0; row < 4; row++) {
for (int col = 0; col < 10; col++) {
if (keys[row][col][0] != '\0') {
GtkWidget *key = gtk_button_new_with_label(keys[row][col]);
// 根据按钮名称判断是否为 Backspace
if (g_strcmp0(keys[row][col], "Backspace") == 0) {
g_signal_connect(key, "clicked", G_CALLBACK(on_backspace_clicked), input);
} else {
g_signal_connect(key, "clicked", G_CALLBACK(on_key_clicked), input);
}
gtk_grid_attach(GTK_GRID(keyboard), key, col, row, 1, 1);
}
}
}
return keyboard;
}
// 主界面
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "合并界面");
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
stack = gtk_stack_new();
// 界面A
GtkWidget *boxA = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
inputA = gtk_entry_new();
gtk_widget_set_size_request(inputA, 100, 20);
GtkWidget *buttonToB = gtk_button_new_with_label("切换到界面 B");
g_signal_connect(buttonToB, "clicked", G_CALLBACK(switch_to_B), NULL);
gtk_box_pack_start(GTK_BOX(boxA), inputA, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(boxA), buttonToB, FALSE, FALSE, 0);
gtk_stack_add_named(GTK_STACK(stack), boxA, "界面A");
// 界面B
GtkWidget *boxB = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
inputC = gtk_entry_new();
gtk_widget_set_size_request(inputC, 100, 20);
GtkWidget *keyboard = create_keyboard(inputC);
gtk_box_pack_start(GTK_BOX(boxB), inputC, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(boxB), keyboard, TRUE, TRUE, 0);
GtkWidget *buttonToA = gtk_button_new_with_label("切换到界面 A");
g_signal_connect(buttonToA, "clicked", G_CALLBACK(switch_to_A), NULL);
gtk_box_pack_start(GTK_BOX(boxB), buttonToA, FALSE, FALSE, 0);
gtk_stack_add_named(GTK_STACK(stack), boxB, "界面B");
// 添加 stack 到窗口
gtk_container_add(GTK_CONTAINER(window), stack);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}