2014-11-02 153 views
0

我正在學習GTK +庫,並且在嘗試從文件加載文本到TextView時遇到了一些問題。GTK + 3.0 C++將GtkTextBuffer傳遞給函數

// 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' 

任何人都可以幫助我嗎?

回答

1

爲GtkMenuItem簽名::激活是

void signalHandler(GtkMenuItem *sender, gpointer user_data); 

信號處理程序(在這種情況下,showOpenFileDialog())必須具有此簽名。在你的情況下,你正在將文本緩衝區正確地傳遞到g_signal_connect()行,但被分配給user_data參數(GtkMenuItem本身,在這種情況下爲openFile,是sender)。

不幸的是,GObject信號不能進行靜態類型檢查。我不知道是否存在可以提供幫助的靜態分析工具。

0

您需要使用void showOpenFileDialog(GtkMenuItem *openFile, GtkTextBuffer *buffer)作爲回調,因爲第一個參數將是調用者,第二個是user_data作爲最後一個參數傳遞給g_signal_connect

+0

添加'GtkMenuItem * openFile'做了工作,謝謝! – 2014-11-02 19:38:51