gtk_entry_get_text:断言'GTK_IS_ENTRY (entry)'失败
gtk_entry_get_text: assertion 'GTK_IS_ENTRY (entry)' failed
我正在用C++和GTK3创建一个小程序(只是学习它),但我遇到了麻烦。所以,我孤立了有问题的部分。
它被用来获取条目并在单击按钮时打印它。
这是代码:
#include <iostream>
#include <gtk/gtk.h>
using namespace std;
GtkWidget *wventana;
GtkWidget *wgrid;
//FUNCS
void ventana(string titulo, int margen)
{
const char * tituloc = titulo.c_str();
wventana = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_position (GTK_WINDOW (wventana), GTK_WIN_POS_CENTER);
gtk_window_set_title (GTK_WINDOW (wventana), tituloc);
gtk_container_set_border_width(GTK_CONTAINER(wventana), margen);
}
void grid()
{
wgrid = gtk_grid_new();
gtk_container_add(GTK_CONTAINER(wventana), wgrid);
gtk_grid_set_row_spacing (GTK_GRID (wgrid), 10);
gtk_grid_set_column_spacing (GTK_GRID (wgrid), 25);
}
void boton_clic (GtkEntry *wentrada, gpointer user_data)
{
const char *nombre;
nombre = gtk_entry_get_text(wentrada);
cout << nombre << endl;
}
void entrada(int x, int y, int lx, int ly)
{
GtkWidget *wentrada;
wentrada = gtk_entry_new();
gtk_grid_attach (GTK_GRID (wgrid), wentrada, x, y, lx, ly);
}
void boton(string texto, int x, int y, int lx, int ly)
{
const char * wtexto = texto.c_str();
GtkWidget *wboton;
wboton = gtk_button_new_with_label (wtexto);
gtk_grid_attach (GTK_GRID (wgrid), wboton, x, y, lx, ly);
g_signal_connect (GTK_BUTTON (wboton), "clicked", G_CALLBACK (boton_clic), G_OBJECT (wventana));
}
//MAIN
int main(int argc, char *argv[])
{
gtk_init (&argc, &argv);
ventana("ventana",10);
grid();
entrada(1, 1, 1, 1);
boton("Aprietame", 1, 2, 1, 1);
gtk_widget_show_all (wventana);
gtk_main ();
return 0;
}
它无法获取条目,并显示以下错误消息:
(boton:6669): Gtk-CRITICAL **: gtk_entry_get_text: assertion 'GTK_IS_ENTRY (entry)' failed
有人能告诉我问题出在哪里吗?还有,我该如何让它发挥作用?或者在任何情况下,有什么好的替代方案可以做到这一点?(必须具有独立的功能)
提前谢谢。
谢谢你的回答@potomato,我试着用你提出的更改来替换,是新代码:
#include <iostream>
#include <gtk/gtk.h>
using namespace std;
GtkWidget *wventana;
GtkWidget *wgrid;
//FUNCS
void ventana(string titulo, int margen)
{
const char * tituloc = titulo.c_str();
wventana = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_position (GTK_WINDOW (wventana), GTK_WIN_POS_CENTER);
gtk_window_set_title (GTK_WINDOW (wventana), tituloc);
gtk_container_set_border_width(GTK_CONTAINER(wventana), margen);
}
void grid()
{
wgrid = gtk_grid_new();
gtk_container_add(GTK_CONTAINER(wventana), wgrid);
gtk_grid_set_row_spacing (GTK_GRID (wgrid), 10);
gtk_grid_set_column_spacing (GTK_GRID (wgrid), 25);
}
void boton_clic (GtkButton *wboton, GtkEntry *wentrada)
{
const char *nombre;
nombre = gtk_entry_get_text (wentrada);
cout << nombre << endl;
}
void entrada(int x, int y, int lx, int ly)
{
GtkWidget *wentrada;
wentrada = gtk_entry_new();
gtk_grid_attach (GTK_GRID (wgrid), wentrada, x, y, lx, ly);
}
void boton(string texto, int x, int y, int lx, int ly)
{
const char * wtexto = texto.c_str();
GtkWidget *wboton;
wboton = gtk_button_new_with_label (wtexto);
gtk_grid_attach (GTK_GRID (wgrid), wboton, x, y, lx, ly);
g_signal_connect (wboton, "clicked", G_CALLBACK (boton_clic), wentrada);
}
//MAIN
int main(int argc, char *argv[])
{
gtk_init (&argc, &argv);
ventana("ventana",10);
grid();
entrada(1, 1, 1, 1);
boton("Aprietame", 1, 2, 1, 1);
gtk_widget_show_all (wventana);
gtk_main ();
return 0;
}
但当我试图编译它时,它显示:
In file included from /usr/include/glib-2.0/gobject/gobject.h:28:0,
from /usr/include/glib-2.0/gobject/gbinding.h:29,
from /usr/include/glib-2.0/glib-object.h:23,
from /usr/include/glib-2.0/gio/gioenums.h:28,
from /usr/include/glib-2.0/gio/giotypes.h:28,
from /usr/include/glib-2.0/gio/gio.h:26,
from /usr/include/gtk-3.0/gdk/gdkapplaunchcontext.h:28,
from /usr/include/gtk-3.0/gdk/gdk.h:32,
from /usr/include/gtk-3.0/gtk/gtk.h:30,
from boton.cpp:2:
boton.cpp: In function ‘void boton(std::string, int, int, int, int)’:
boton.cpp:51:64: error: ‘wentrada’ was not declared in this scope
g_signal_connect (wboton, "clicked", G_CALLBACK (boton_clic), wentrada);
^
/usr/include/glib-2.0/gobject/gsignal.h:472:73: note: in definition of macro ‘g_signal_connect’
g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
^
Compilation failed.
怎么了?我该怎么办???
你能再解释一下第二个论点吗?(英语不是我的母语,这部分对我来说有点困惑:P)
再次感谢。
boton_clic
信号处理程序有两个参数:一个GtkWidget *
和一个指向您指定的某些用户数据的指针。第一个自变量总是发送信号的对象,因此是wboton
;但是您将参数标记为wentrada
,并将其视为GtkEntry *
,因此出现错误消息。
第二个参数是连接信号时指定的用户数据。在您的g_signal_connect()
呼叫中,您在此处传递wventana
。但是,如果您想访问信号处理程序中的条目,则应该传递wentrada
。
所以,它应该是这样的:
void boton_clic (GtkButton *wboton, GtkEntry *wentrada)
{
const char *nombre;
nombre = gtk_entry_get_text (wentrada);
cout << nombre << endl;
}
...
g_signal_connect (wboton, "clicked", G_CALLBACK (boton_clic), wentrada);
相关文章:
- C++生成文件错误"implicit entry/start for main executable"
- Qt5 部署"procedure entry point could not be located"
- "Entry Point Not Found" Azure 中的错误 LightGBM R 包
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- 当使用 /ENTRY:main 和 /MT 运行时库编译为 /SUBSYSTEM:WINDOWS 时,应用程序崩溃
- Libavcodec "the procedure entry point for av_frame_alloc could not be located" Visual Studio 2017 C+
- 无法运行Qt C++发布版本。 'The procedure entry point could not be located'
- Map.Entry<> java
- 将 Gtk::Entry 添加到 Gtk::D ialog
- 奇怪的"Entry Point Not Found"错误
- "the procedure entry point _ZNSt8_detail15_List_node_base7_M_hookEPS0_ could not be located in the
- 为什么 Dart 中的原生包装函数与非常轻量级的函数相比"DEFINE NATIVE ENTRY"如此重量级?
- 交叉编译错误"arm-none-eabi-g++ cannot find entry symbol"
- 在win2k3上运行.exe时发生"The procedure entry point GetErrorMode could not be located in the dynamic link l
- 3 错误:错误:未在此范围内声明'Entry'。错误:模板参数 1 无效。错误:令牌之前声明中的类型无效'('
- 简单程序"LNK1561 entry point must be defined"
- 如何确定Tcl_Obj是否是某种类型的 ttk:: 实体,例如 ttk:entry
- 错误"No Entry point"
- 在 Gtk::Entry 小部件中强制输入数字
- 在更改Gtk::Entry的文本之前,我应该捕捉什么信号来获取它