• GTK构件 --- 文本视图控件GTKtextview


    GTK构件 — 文本视图控件GTKtextview

      文本视图控件(GtkTextView)是用以取代原有的文本编辑(GtkText)控件的,它包括一个文本缓冲区(GtkTextBuffer),用来保存文本控件显示的带有标记性的文字,且一个缓冲区支持多个显示;缓冲区文本的迭代(GtkTextIter),用来替代缓冲区的某一位置(首部、尾部、某一行等),以便向其中插入数据或控件;缓冲区的书签(GtkTextMark),表示缓冲区中的某一具体位置,以便进行滚动操作;缓冲区的文本标记(GtkTextTag),可以应用到缓冲区中文本的属性标记(如本例中的蓝色前景,居中等);缓冲区的标记表(GtkTextTagTable)联合多种文本属性标记一起使用。
      当文本视图缓冲区(GtkTextBuffer)光标发生变化时将触发mark_set信号。

    1.相关接口函数

    /*创建文本视图*/
    GtkWidget*gtk_text_view_new (void)
    /*获取文本视图缓冲区*/
    GtkTextBuffer*gtk_text_view_get_buffer (GtkTextView *text_view)
    /*获取缓冲区文本的起始位置和结束位置,start、end定义GtkTextIter 变量取地址传入即可*/
    void gtk_text_buffer_get_bounds (GtkTextBuffer *buffer,GtkTextIter *start,GtkTextIter   *end)
    /*像缓冲区插入数据*/
    void gtk_text_buffer_insert (GtkTextBuffer *buffer,GtkTextIter *iter,const gchar *text,gint len)
    形参:buffer --文本缓冲区
          iter  --插入数据位置,gtk_text_buffer_get_bounds获取的的位置
          text  --插入内容
          len  --插入的内容长度,填-1表示插入整个text
    /*获取缓冲区的起始位置*/
    void gtk_text_buffer_get_start_iter (GtkTextBuffer *buffer,GtkTextIter *iter)
    /*获取缓冲区的结束位置*/
    void gtk_text_buffer_get_end_iter (GtkTextBuffer *buffer,GtkTextIter *iter)
    /*获取缓冲区的行数*/
    gint gtk_text_iter_get_line (const GtkTextIter *iter)
    /*获取缓冲区列数*/
    gint gtk_text_iter_get_line_offset (const GtkTextIter *iter)
    /*删除缓冲区中的内容,end填-1表示从start到缓冲区结束*/
    gtk_text_buffer_delete (GtkTextBuffer *buffer,GtkTextIter *start,GtkTextIter *end)
    /*获取字符数*/
    gint gtk_text_buffer_get_char_count (GtkTextBuffer *buffer)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    2.文本视图构件示例

    在这里插入图片描述

    #include 
    #include 
    
    GtkTextBuffer *textbuffer;
    GtkWidget*status;
    guint statusbar_flag;
    
    void text_callback(GtkWidget *widget,gpointer data)
    {
    	GtkTextIter end;
    	gtk_text_buffer_get_end_iter (textbuffer,&end);
    	gint row = gtk_text_iter_get_line(&end);
    	gint col = gtk_text_iter_get_line_offset(&end);
    	int count=gtk_text_buffer_get_char_count(textbuffer);
    	g_print("文本行:%d\t文本列:%d\t字数:%d\n",row,col,count);
    	
    	gchar buff[100];
    	snprintf(buff,sizeof(buff),"行:%d\t列:%d\t字数:%d",row+1,col+1,count);
    	
    	gtk_statusbar_push (GTK_STATUSBAR (status),statusbar_flag,buff);
    }	
    
    int main(int argc,char *argv[])
    {
    	GtkWidget *window;
    	GtkWidget *text;
    	GtkWidget *box;
    	GtkTextIter start,end;
    	gchar *buff;
    	gtk_init(&argc,&argv);
    	window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(window),"文本");
    	g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    	gtk_window_set_default_size(GTK_WINDOW(window), 350, 300);
    
    	/*创建纵向盒*/
    	box=gtk_vbox_new(FALSE,0);
    	gtk_container_add(GTK_CONTAINER(window),box);
    	gtk_widget_show(box);
    	/*创建文本框*/
    	text=gtk_text_view_new();
    	/*获取文本框缓冲区*/
    	textbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
    	gtk_box_pack_start(GTK_BOX(box),text,TRUE,TRUE, 0);
    	g_signal_connect(G_OBJECT(textbuffer),"mark_set", G_CALLBACK(text_callback),NULL);
    	gtk_widget_show(text);
    
    	/*创建状态栏*/
    	status=gtk_statusbar_new();
    	gtk_box_pack_start(GTK_BOX(box),status,FALSE,FALSE, 0);
    	gtk_widget_show(status);
    	/*获取状态栏标志*/
    	statusbar_flag=gtk_statusbar_get_context_id (GTK_STATUSBAR(status) ,"TEXT VIEW");
    	
    	/*获取文本缓冲区的起始地址和结束地址*/
    	gtk_text_buffer_get_bounds(textbuffer,&start,&end);
    	/*插入内容*/
    	gtk_text_buffer_insert(textbuffer,&start,"文本框使用示例!", -1);
    	gtk_text_buffer_get_bounds(textbuffer,&start,&end);
    	/*获取指定区域的文本内容*/
    	buff=gtk_text_buffer_get_text(GTK_TEXT_BUFFER(textbuffer),&start,&end,FALSE);
    	g_print("buff=%s\n",buff);
    	/*设置文本内容*/
    	gtk_text_buffer_set_text(GTK_TEXT_BUFFER(textbuffer),"123456789",-1);
    
    	/*获取缓冲区的起始位置和结束位置*/
    	gtk_text_buffer_get_bounds(textbuffer,&start,&end);
    	gtk_text_buffer_insert(textbuffer,&end,"\n文本框使用示例!123456789", -1);
    
    	gtk_text_buffer_get_end_iter (textbuffer,&end);
    	/*获取当前文本的行列*/
    	gint row = gtk_text_iter_get_line(&end);
    	gint col = gtk_text_iter_get_line_offset(&end);
    	int count=gtk_text_buffer_get_char_count(textbuffer);
    	g_print("文本行:%d\t文本列:%d\t字数:%d\n",row,col,count);
    	gchar data[100];
    	snprintf(data,sizeof(data),"行:%d\t列:%d\t字数:%d",row+1,col+1,count);
    	/*将行、列、字数显示到状态栏*/
    	gtk_statusbar_push (GTK_STATUSBAR (status),statusbar_flag,data);
    	
    	/*删除指定区域内容*/
    	//gtk_text_buffer_delete(textbuffer,&start,&end);
    	gtk_widget_show(window);
    	gtk_main();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
  • 相关阅读:
    c++ 批量导出c# 函数,格式
    如何在ios成功上架android tv?​
    头条系统-05-延迟队列精准发布文章-概述&添加任务(db和redis实现延迟任务)、取消&拉取任务&定时刷新(redis管道、分布式锁setNx)
    react面试题总结
    MySQL启动报错:mysql拒绝访问错误5
    Spring使用(三)
    【ARM】使用Ubuntu-base构建根文件系统
    FreeSWITCH 1.10.10 简单图形化界面11 - 简单封装一下JSSIP
    第二证券:庄家会出现在十大流通股东吗?
    MySQL主从复制(基于binlog日志方式)
  • 原文地址:https://blog.csdn.net/weixin_44453694/article/details/127455090