小编Kan*_*noN的帖子

用bool替换Boolean的正则表达式

我正在研究最近从X/Motif转移到Qt的C++代码库.我正在尝试编写一个Perl脚本,用bool替换所有出现的布尔值(来自X).该脚本只是做了一个简单的替换.

s/\bBoolean\b/bool/g
Run Code Online (Sandbox Code Playgroud)

有几个条件.

1)我们的代码中有CORBA,\ b匹配CORBA :: Boolean,应该更改.
2)如果它被发现是一个字符串(即"布尔")它不应该匹配

更新:

对于#1,我使用了lookbehind

s/(?<!:)\bBoolean\b/bool/g;
Run Code Online (Sandbox Code Playgroud)

对于#2,我使用了前瞻.

s/(?<!:)\bBoolean\b(?!")/bool/g</pre>
Run Code Online (Sandbox Code Playgroud)

这很可能适用于我的情况,但以下改进如何?

3)如果在字符串的中间,请不要匹配(感谢nohat).
4)如果在评论中不匹配.(// 要么 /**/)

regex perl

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

QDrag 在拖动时被破坏

我有一个 Windows/Linux Qt 4.3 应用程序,它在 QTreeView 中使用拖放操作。我有两个非常相似的应用程序,它们使用同一组 Qt 库。拖放功能在 Linux 上都适用,但在 Windows 上仅适用于其中一种。

在不起作用的应用程序中,一旦移动鼠标,QDrag 对象就会被删除。它由事件队列中的 DeferredDelete 事件删除,该事件队列在拖动期间仍在 Qt 中处理。我不知道如何查看导致 QDrag 对象过早删除的原因。

我想不出调试这个问题的好方法。我比较了来源,找不到任何明显的东西。我尝试在另一个应用程序中使用其中一个应用程序的代码。

有什么建议么?

更新:

QDrag 操作失败的原因是 COM 未成功初始化,因此 QDrag::exec 中对 DoDragDrop 的调用立即返回。QApplication 尝试通过在 qt_init 中调用 OleInitialize 来初始化 COM,但失败并出现错误“设置后无法更改线程模式”。

有趣的是,即使 OleInitialize 是 main 中完成的第一件事,也会发生这种情况,因此线程模式最初是由某些外部依赖项设置的。在 Windows 上运行的应用程序之间的差异之一是失败的应用程序还包含 .NET 代码,因此这可能就是问题所在。

解决了:

此问题是 COM/CLR 互操作问题。CLR 在初始化时将单元状态设置为 MTA,然后当 Qt 尝试初始化 COM 时会失败。Adam NathanGotcha with STAThreadAttribute and Managed C++中讨论了这个问题和旧的解决方案。在 Visual Studio 2005 中,您可以在“配置属性”>“链接器”>“高级”中设置 /CLRTHREADATTRIBUTE:STA 编译器选项,将线程属性设置为 STA,而无需创建新的入口点。

c++ com qt drag-and-drop

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

标签 统计

c++ ×1

com ×1

drag-and-drop ×1

perl ×1

qt ×1

regex ×1