我为基于触摸的平板电脑开发了一些软件。该设备没有键盘,只有一个触摸屏(触摸屏模拟鼠标)。操作系统是Windows 10,我们使用Qt作为图形用户界面框架。
我们依赖于一个类库Point Cloud库,该库具有一个组件,当我们单击鼠标左键时,该组件需要按下SHIFT键才能生成某些内容。
我需要让底层软件组件相信已按下SHIFT键。
我试图通过“Qt手段”将按键事件发送到Qt小部件,但假的SHIFT按键似乎没有到达底层的sw。零件。可能因为它与Qt在一个不相关的类库中,并且该软件类库可能以不同方式检查关键事件(例如通过OS调用,c ++ std方式或类似方法)。
尝试“Qt方式”时似乎没有用:
QKeyEvent key_press(QEvent::KeyPress, Qt::Key_Shift, Qt::ShiftModifier);
QApplication::sendEvent(ui->qvtkWidget, &key_press);
因此,我可能需要使用操作系统方法伪造SHIFT键按下。
问题: 如何从Qt执行OS系统调用或类似操作,以使底层软件组件认为已按下并保持SHIFT键(同时用户按下鼠标左键)。
答案 0 :(得分:0)
您想要的不是伪造一个shift键输入,而是禁用交互级别的班次检查。绝对是一个XY问题。
vtk InteractorStyle类负责处理用户输入事件。您可以在pcl_visualizer.cpp的line 506
中看到boost::signals2::connection
pcl::visualization::PCLVisualizer::registerPointPickingCallback (boost::function<void (const pcl::visualization::PointPickingEvent&)> callback)
{
return (style_->registerPointPickingCallback (callback));
}
回调在PCLVisualizerInteractorStyle
类中注册。
您可以在构建PCLVisualizer
时传递自己的自定义交互器样式,这样您就可以安全地覆盖它。要使用的构造函数是one
PCLVisualizer (int &argc, char **argv, const std::string &name="", PCLVisualizerInteractorStyle *style=PCLVisualizerInteractorStyle::New(), const bool create_interactor=true)
初始化默认的交互器样式时,PointPickingCallback
类作为鼠标回调正在added automatically。因此,为了覆盖此行为,您需要从PCLVisualizerInteractorStyle
派生自己的类并覆盖Initialize()
方法,并在构建时将此新的交互器样式传递给PCLVisualizer
。
PointPickingCallback
内的Execute方法是检查shift键的位置。
void
pcl::visualization::PointPickingCallback::Execute (vtkObject *caller, unsigned long eventid, void*)
{
PCLVisualizerInteractorStyle *style = reinterpret_cast<PCLVisualizerInteractorStyle*>(caller);
vtkRenderWindowInteractor* iren = reinterpret_cast<pcl::visualization::PCLVisualizerInteractorStyle*>(caller)->GetInteractor ();
if (style->CurrentMode == 0)
{
if ((eventid == vtkCommand::LeftButtonPressEvent) && (iren->GetShiftKey () > 0))
{
float x = 0, y = 0, z = 0;
int idx = performSinglePick (iren, x, y, z);
// Create a PointPickingEvent if a point was selected
[... and so on]
总之,您需要:
PointPickingCallback
派生一个新类,该类覆盖了Execute
方法中对shift键的检查。PCLVisualizerInteractorStyle
导出并覆盖Initialize
方法,以注册新的自定义PointPickingCallback
类,该类不会检查shift键,作为鼠标回调。PCLVisualizer
。 值得注意的是。可视化器支持两种选择模式:用于区域选择和单点拾取的橡皮筋,可以通过按键“x”来互换。我认为要选择的默认值是橡皮筋,这就是为什么它可能会检查首先按下的换档键。