C++ GTK&x2B;3.0c++;将GtkTextBuffer传递给函数
我正在学习GTK+库,在尝试将文本从文件加载到TextView时遇到了一些问题C++ GTK&x2B;3.0c++;将GtkTextBuffer传递给函数,c++,gtk,gtk3,glib,C++,Gtk,Gtk3,Glib,我正在学习GTK+库,在尝试将文本从文件加载到TextView时遇到了一些问题 // main.cpp GtkWidget *textInput; GtkTextBuffer *textBuffer; [...] //Create text input field textInput = gtk_text_view_new(); gtk_box_pack_start(GTK_BOX (vbox), textInput, 1, 1, 0); textBuffer = gtk_text_view_g
// main.cpp
GtkWidget *textInput;
GtkTextBuffer *textBuffer;
[...]
//Create text input field
textInput = gtk_text_view_new();
gtk_box_pack_start(GTK_BOX (vbox), textInput, 1, 1, 0);
textBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW (textInput));
// Menu actions
g_signal_connect(G_OBJECT(openFile), "activate", G_CALLBACK(showOpenFileDialog), textBuffer);
当我尝试在main.cpp中更改textBuffer时,一切都很顺利。但是
void showOpenFileDialog(GtkTextBuffer *buffer)
{
GtkWidget *openFileDialog;
openFileDialog = gtk_file_chooser_dialog_new("Open file", GTK_WINDOW(NULL), GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
gtk_dialog_run(GTK_DIALOG(openFileDialog));
const gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(openFileDialog));
ifstream file(filename);
string line;
if(file.is_open())
{
while(getline(file, line))
{
GtkTextIter endOfTextInput;
gtk_text_buffer_get_end_iter(buffer, &endOfTextInput);
gtk_text_buffer_insert(buffer, &endOfTextInput, line.c_str(), line.size());
}
}
gtk_widget_destroy(openFileDialog);
}
从文件加载每一行后,GTK将运行时错误输出到控制台:
(asdddd.exe:3872): Gtk-CRITICAL **: gtk_text_buffer_get_end_iter: assertion `GTK
_IS_TEXT_BUFFER (buffer)' failed
(asdddd.exe:3872): Gtk-CRITICAL **: gtk_text_buffer_insert: assertion `GTK_IS_TE
XT_BUFFER (buffer)' failed
我试着这样做:
GTK_TEXT_BUFFER(buffer)
但这给了我另一个错误
(asdddd.exe:3872): GLib-GObject-WARNING **: invalid cast from `GtkMenuItem' to `
GtkTextBuffer'
有人能帮我吗?您需要使用
void showOpenFileDialog(GtkMenuItem*openFile,GtkTextBuffer*buffer)
进行回调,因为第一个参数是调用方,第二个参数是作为最后一个参数传递给g\u signal\u connect
。GtkMenuItem::activate的签名是
void signalHandler(GtkMenuItem *sender, gpointer user_data);
您的信号处理程序(在本例中,showOpenFileDialog()
)必须具有此签名。在本例中,您将文本缓冲区正确地传递到g\u signal\u connect()
行中,但这会被分配给user\u data
参数(在本例中,GtkMenuItem
本身,即openFile
,是发送方
)
不幸的是,无法对GObject信号进行静态类型检查。我不知道是否存在可以提供帮助的静态分析工具。添加
GtkMenuItem*openFile
完成了工作,谢谢!