繁体   English   中英

写意Gtk / set_event_compression(false)不起作用

[英]Freehand drawing Gtk / set_event_compression(false) does not work

我正在使用GTK +(gtkmm)开发图形软件,并希望构建免费的手绘图功能。

我连接到Gtk::EventBox signal_motion_notify_event上的set_event_compression ,并在事件框中将set_event_compression设置为false 我还在包含事件框的窗口上设置了set_event_compression(false) ,但似乎没有任何效果。 该程序运行不流畅,无法绘制槽线,而是出现多个单点或短划线。

我还尝试在额外的thread使用Gdk::Window::get_pointer(int,int,Gdk::ModifierType) ,但这也不起作用(也无法通过线条绘制)。

这是一些示例代码来说明(我使用Gtk::Image -class绘制pixbuf):

工具箱

// eb means EventBox
Gtk::EventBox& eb = drawingWin->getEventBox();
eb.signal_motion_notify_event().connect(sigc::mem_fun(image, &Image::motionEvent));

DrawingWindow.cc

DrawingWindow::DrawingWindow(int x, int y) : area(x, y), background("/home/tux/Pictures/Arch_Linux_Wallpaper_by_james66.jpg")
{
    // eb means EventBox
    eb.get_window()->set_event_compression(false);
}

Image.cc

bool Image::motionEvent(_GdkEventMotion* event)
{
    if(event)
    {
        mutex.lock();
        //custom set_pixel function on Gdk::Pixbuf using guint8* Gdk::Pixbuf::get_pixels() const
        this->set_pixel(event->x, event->y, 0x000000ff);
        //updates the Gtk::Image by calling Gtk::Image::set(Glib::RefPtr<Gdk::Pixbuf>)
        this->_udpate();
        mutex.unlock();
    }
}

在GIMP(最初是为GTK +编写的程序)中,如果鼠标移动得太快,则单点之间也会有间隙,这些间隙之间会填充直线。

在GTK +和gtkmm中,有Gdk::EventMask 可以使用Gtk::Widget::set_events(Gdk::EventMask) 需要确保设置了POINTER_MOTION_MASK (不是POINTER_MOTION_HINT_MASK )。

还需要确保禁用事件压缩。 在包括GTK3之前,可以使用Gdk::Window::set_event_compression(false)

在GTK4中,事件压缩始终处于打开状态:

使用GTK4,需要查看运动事件之间的事件历史记录,以重建合并的事件。 在gtk4中,事件传递速率固定为由帧时钟运行(即60hz)。 get_motion_history() (函数名称可能已更改)将仅返回在处理该帧期间累积的运动坐标。

这是两个示例:

  1. gtk3-demo
  2. PyGtk2 (需要安装python2pygtk2gtk2进行测试。

所有这些示例都缺乏连贯性(线条之间存在间隙)。

没有插值功能,就不可能使用GTK +构建更丰富的自由手绘图!

还有一个使用Qt5示例 ,它是连贯的: Qt5 Scribble

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM