我正在使用GTK +(gtkmm)开发图形软件,并希望构建一个免费的手绘功能。
我连接到signal_motion_notify_event
上的Gtk::EventBox
,并在事件框中将set_event_compression
设置为false
。我还在包含事件框的窗口上设置了set_event_compression(false)
,但似乎没有任何效果。该程序运行不流畅,以至于它允许绘制的槽线,而是我得到多个单点或短划线。
我还尝试在额外的Gdk::Window::get_pointer(int,int,Gdk::ModifierType)
中使用thread
,但这也不起作用(也没有通过线条绘制)。
下面是一些示例代码来说明(我使用Gtk::Image
- 类绘制一个pixbuf):
Toolbox.cc
// 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();
}
}
答案 0 :(得分:0)
在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()
(函数名称可能已更改)将仅返回在处理该帧期间累积的运动坐标。
以下是两个例子:
gtk3-demo
python2
,pygtk2
和gtk2
才能对此进行测试。所有这些例子都缺乏连贯性(线之间存在差距)。
使用GTK +建立合适的自由手绘图是不可能的!
还有一个example using Qt5,它是连贯的: Qt5 Scribble