标签: gtk

如何在C GTK中检测到几个按键?

我正在写一个基于GTK的聊天,想要实现以下内容:

在GtkTextView中点击Enter时发送一条消息,但按Shift + Enter键入一个新行.

我只是无法弄清楚如何检测多键按下.我只能通过GdkEventKey检测到一个密钥.

c gtk events signals

1
推荐指数
1
解决办法
277
查看次数

将 Gtk.DrawingArea 或 Cairo 图案的内容保存到磁盘上的图像

我有一个使用Cairo 图像表面的小型 PyGI 项目,然后我使用表面图案进行缩放并在 Gtk.DrawingArea 上渲染。

我想将缩放版本写入PNG 文件。我试图用Surface.write_to_png()从原始表面写入,但它只写入原始(即非缩放)大小,所以我被困在那里。

然后我想我也许可以从 Gtk.DrawingArea 获取渲染图像并将其写入磁盘,但我还没有找到如何在 PyGI 中做到这一点(这似乎只能在 GTK+ 2 中实现 -将 gtk.DrawingArea 保存到文件)。所以我想弄清楚如何将缩放后的图像写入磁盘。

这是创建表面、放大并渲染它的代码:

def on_drawingarea1_draw (self, widget, ctx, data=None):

    # 'widget' is a Gtk.DrawingArea
    # 'ctx' is the Cairo context

    text = self.ui.entry1.get_text()
    if text == '':
        return

    # Get the data and encode it into the image
    version, size, im = qrencode.encode(text)
    im = im.convert('RGBA') # Cairo expects RGB

    # Create a …
Run Code Online (Sandbox Code Playgroud)

python gtk cairo pygobject pycairo

1
推荐指数
1
解决办法
3354
查看次数

Perl Gtk无法创建抽象(非实例化)类型`GtkBox'的实例

我正在尝试一个简单的Perl GtK,gui只包含一个窗口和一个垂直框.我得到一个分段错误,在此之前有一个警告:"无法创建抽象(非实例化)类型的实例'GtkBox'"

GUI是:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">Text to EPUB</property>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <placeholder/>
        </child>
        <child>
          <placeholder/>
        </child>
      </object>
    </child>
  </object>
</interface>
Run Code Online (Sandbox Code Playgroud)

代码是:

#!/usr/bin/perl
use warnings;
use strict;

use File::Spec::Functions qw(rel2abs);
use File::Basename;
use File::Copy;
use Glib;
use Gtk2 '-init';

my $basedir = dirname(rel2abs($0));

my $guifile = "$basedir/txt2epub1.gui";

print "GUI file: $guifile\n";
my $builder = Gtk2::Builder->new();
$builder->add_from_file($guifile) or die "Couldn't …
Run Code Online (Sandbox Code Playgroud)

gtk perl

1
推荐指数
1
解决办法
672
查看次数

GTK +如何绘制到绘图区域

我想在gtk + cairo绘图区域内绘制一些线条(实际上是正弦波),但我无法想出办法.所以我的代码首先定义了绘图区域,该绘图区域有一个函数回调函数,该函数将白色背景绘制到绘图区域本身......此时我想在每次START按钮之后开始绘制一段sin波.按下(按钮有一个回调绘图功能)....所以首先......有可能这样做吗?我错过了什么?谢谢.

    #include <cairo.h>
    #include <gtk/gtk.h>

    int x = 0;
    int x_old = 0;
    float value = 0;
    float value_old = 0;
    GtkWidget *button = NULL;
    GtkWidget *window = NULL;
    GtkWidget *area = NULL;
    GtkWidget *table = NULL;

    static gboolean load_interface(GtkWidget *widget)
    {
     cairo_t *cr;
     cr = gdk_cairo_create(area->window);
     cairo_set_source_rgb(cr, 1, 1, 1);
     cairo_rectangle(cr, 0, 0, 900, 400);
     cairo_fill(cr);
    }

    void draw(GtkWidget *widget)
    {
     cairo_t *cr;
     cr = gdk_cairo_create(widget->window);

     x_old = x;
     x = x + 15;
     value_old = value; …
Run Code Online (Sandbox Code Playgroud)

c gtk cairo

1
推荐指数
1
解决办法
1万
查看次数

Gdk pixbuf从内存加载图像

使用GTK + 3.6我想从内存中的缓冲区显示图像,而不是磁盘上的文件.我有一个const char *data图像数据,我正在尝试从它创建一个GTK图像.到目前为止,我已经尝试了两种我认为可行的方法.两者都使用GdkPixbuf,因此需要图像数据guchar* (unsigned char*).

有了这个要求,我必须投射数据:

guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
Run Code Online (Sandbox Code Playgroud)

然后我尝试了以下内容:

  1. 将数据写入GdkPixbufLoader gdk_pixbuf_loader_write.在这里我得到一个错误"Unrecognized image file format"或者如果我用特定类型(jpg)创建加载器我得到一个错误,说它不是JPG文件格式(它是,如下所述).

    编辑:一些代码:

    guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
    int stride = ((1056 * 32 + 31) & ~31)/8;
    GdkPixbufLoader *loader = gdk_pixbuf_loader_new();
    GError *error = NULL;
    
    if(!gdk_pixbuf_loader_write(loader, gudata, data_size, &error)
    { 
        printf("Error:\n%s\n", error->message); 
    }
    
    Run Code Online (Sandbox Code Playgroud)

    编辑03/01/2013:从写入函数中删除了stride参数 - 错误打印.

    开罗表面不起作用.显示黑屏和噪音.

  2. 初始化pixbuf gdk_pixbuf_new_from_data然后图像看起来像电视噪声,这表明数据是错误的(并且已经被转换),或者其他参数是错误的(图像行步幅,但它不是:)).

之后的错误我只是想将数据写入到文件中foo.jpg使用ofstream,是的,我得到一个正常的图像文件.file终端中的命令确认它是一个JPEG图像,并且使用一个简单的代码块我从该foo.jpg创建了一个GdkPixbuf来检查它的行步长值,它匹配我传递给上述函数的值.

图像数据是否因演员表而损坏,如果是,我该如何解决?我得到了图像数据const char*.我看过QtPixmap,它也加载了unsigned char*.

我需要使用单独的库吗?(libjpeg?)我安装了libgtk3-dev.

谢谢!

c++ gtk jpeg image-processing gdkpixbuf

1
推荐指数
1
解决办法
7128
查看次数

应用程序是否可以覆盖一个窗口小部件的一个属性的gtk主题?

我正在写一个gtk应用程序,它与我的主题不相符.具体来说,应用程序需要适合只有50像素宽的工具栏,并且需要包含进度条,但主题有ProgressBar :: min-horizo​​ntal-bar-width = 150(这是默认值).我想告诉代码中的gtk,这个特定的小部件可以忽略该特定的样式属性.

我意识到我可以改变我的系统的主题,但如果我在将来做任何与主题相关的事情,应用程序就会破坏.我更喜欢强大的解决方案.

我也更喜欢保持主题其余部分的解决方案,因此进度条看起来很正常(除了更小).

编辑:这是gtk3

c++ gtk

1
推荐指数
2
解决办法
3728
查看次数

如何在 GTK TextView 中自动滚动到底部

我在 GTK 文本视图中发现了奇怪的异常,希望有人能解释一下。

有一个简单的功能可以滚动到窗口底部:

richTextBox.ScrollToIter(richTextBox.Buffer.EndIter, 0, true, 0, 0);
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,这可能应该有效。但有时它会使用 MemoryAccessViolation(Linux 中的 SIGSEGV)使整个应用程序崩溃

每次我向 TreeView 插入文本时,我的应用程序都会调用此方法,以便我可以始终处于关闭状态(您正在向某个窗口插入文本,并且想要查看最新文本,例如在聊天中)

文本仅从主线程插入,并且此函数也仅在主线程中调用,因此这与我自己的应用程序中的多线程无关,但是我发现 TextView 正在与应用程序的其余部分异步呈现文本。就像负责绘制和处理文本的线程并不是真正的主线程一样。例如,如果我将大文本加载到 TextView 中,即使 TextView 以某种方式加载文本,我的应用程序也会响应。

出于这个原因,我相信 TextView 实际上正在使用自己的单独线程,并且当我尝试滚动窗口时,该线程正在更改文本。正在更改的文本会使 iter 无效,因此在我传递richTextBox.Buffer.EndIter给 TextView ScrollToBottom 函数的 IL 代码之间的某处,该文本可能已被此外部线程更改并且 iter 无效,这就是我收到此内存访问异常的原因。

这甚至可能是 GTK 中的一个错误,但我使用的是非常稳定的版本 (2.1.20),该版本随所有单声道版本一起提供,直到 mono3,甚至适用于所有 Windows gtk# 版本。

有没有其他方法可以“安全”向下滚动

c# gtk

1
推荐指数
1
解决办法
2903
查看次数

从GtkListBox中删除非GtkListBoxRow父级

关于我最近遇到过的事情,请快速说明.我使用python,但我想,它也适用于其他语言.

from gi.repository import Gtk

win = Gtk.Window()
listbox = Gtk.ListBox()
somewidget = Gtk.Somewidget()
win.add(listbox)

listbox.insert(somewidget -1)
listbox.remove(somewidget)  #ERROR
Run Code Online (Sandbox Code Playgroud)

这是一个GtkListBox,填充了一个非GtkListBoxRow类型的项目.当试图从GtkListBox中删除它时,它给了我以下内容:

Gtk-CRITICAL **: gtk_container_remove: assertion 'gtk_widget_get_parent (widget) == GTK_WIDGET (container) || GTK_IS_ASSISTANT (container) || GTK_IS_ACTION_BAR (container) || GTK_IS_POPOVER_MENU (container)' failed
Run Code Online (Sandbox Code Playgroud)

python gtk

1
推荐指数
1
解决办法
293
查看次数

gtk + -3.0找不到问题

我正在使用Vala语言编写程序。当我尝试.deb在启动板上生成程序包时,出现此错误错误

CMake找不到valac软件包gtk+-3.0。它使用valacversion 0.30。尽管它确实找到了,但是当我在计算机上执行此操作时(使用cmake进行构建)。

这是我第一次尝试构建.deb软件包,所以我对如何处理感到有些困惑。有人可以告诉我如何解决此问题吗?提前致谢。

gtk vala deb launchpad

1
推荐指数
1
解决办法
1591
查看次数

Glade作为GTK3/4/5的起点(而不是Gnome-Builder)

现在已经花了一些时间来掌握Gnome Builder,Glade,Vala和Genie - 并考虑到优秀的Gnome人机界面指南(GHIG) - 为什么Glade不是几乎所有GTK GUI应用程序的起点?

例如,是否有任何程序将采用Glade(模板)xml文件并自动生成相应的程序化Vala或Genie源代码?如果有标准的Gtk.ApplicationWindow Glade xml文件,例如,随Glade/Gnome附带的GHIG,这些文件可以快速适应特定项目和带有信号自动生成的Genie类模板 - 加上完整的gresource/meson/flatpak结构.这只是直接导入Gnome-Builder作为起点.有这样的事吗?

更新

以下文件application.gs是使用Genie属性组合从application.ui自动生成的.不想在这里重新发明轮子 - 因此这个问题的原因.以下删除了一些字段,但实际文件已完全填写并可以使用.除了'application.ui'的内容之外,唯一需要的信息是资源路径和ui文件名.一切都已包含在Glade文件中.

/*
  {PROJECT_SPACE}

  '{PROJECT_NAME}' is a command line tool that will parse a glade ui
  template and generate a skeleton class in the Genie language
  with composite widgets. It will generate GTKTemplate, GTKChild
  and GTKCallback entries.

  '{PROJECT_NAME}' exists within the {PROJECT_NAMESPACE} namespace.

  Copyright (C) 2018 {AUTHOR_NAME} {AUTHOR_EMAIL}

  This library is free software; you can redistribute it and or
  or modify it …
Run Code Online (Sandbox Code Playgroud)

gtk gnome glade gtk3

1
推荐指数
1
解决办法
508
查看次数

标签 统计

gtk ×10

c ×2

c++ ×2

cairo ×2

python ×2

c# ×1

deb ×1

events ×1

gdkpixbuf ×1

glade ×1

gnome ×1

gtk3 ×1

image-processing ×1

jpeg ×1

launchpad ×1

perl ×1

pycairo ×1

pygobject ×1

signals ×1

vala ×1