小编Tho*_*omi的帖子

静态链接到Qt时加载Qt插件?

我正在尝试在QIcons中使用SVG图形.我有一个静态库,其中包含我的所有图形资源,以及该静态库中的一个方法,该方法返回预先加载了正确图形的QIcons.我正在尝试这样做:

QIcon icon(":/icons/find.svg");
Run Code Online (Sandbox Code Playgroud)

我已经通过使用QDir列出它来验证已加载资源:

qDebug() << QDir(":/icons/").entryList();
Run Code Online (Sandbox Code Playgroud)

但是,未显示SVG图标.当我将图标加载代码更改为:

QIcon icon(":/icons/find.png");
Run Code Online (Sandbox Code Playgroud)

一切正常.

问题似乎是SV​​G插件永远不会被加载.我可以获得支持的图像类型列表,其中包含:

("bmp","pbm","pgm","png","ppm","xbm","xpm")

但没有提到SVG.

我已经确定我在我的静态库.pro文件和我的主应用程序.pro文件中都使用了SVG模块.

编辑:

似乎问题是我静态链接到Qt,因此插件都是静态库.QPluginLoader各州的文件:

请注意,如果您的应用程序与Qt静态链接,则无法使用QPluginLoader.在这种情况下,您还必须静态链接到插件.如果需要在静态链接的应用程序中加载动态库,可以使用QLibrary.

然而,静态链接到这些插件似乎什么都不做(支持的图像格式列表不会增长).

EDIT2:

此外,动态链接到Qt(重建我的整个应用程序后)使上面的代码完美地工作.但是,我静态链接到Qt,所以现在的问题更多的是关于在静态链接到Qt时加载Qt插件而不是一般的图标.我会更新帖子标题以反映这一点.

c++ icons qt svg qt4

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

使用QTextStream以非阻塞方式读取stdin

使用Qt,我试图以非阻塞的方式读取stdin流的内容.当套接字收到一些新数据时,我正在使用QSocketNotifier来提醒我.通知程序的设置如下所示:

QSocketNotifier *pNot = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read, this);
connect(pNot, SIGNAL(activated(int)), this, SLOT(onData()));
pNot->setEnabled(true);
Run Code Online (Sandbox Code Playgroud)

onData()插槽看起来是这样的:

void CIPCListener::onData()
{
    qDebug() << Q_FUNC_INFO;
    QTextStream stream(stdin, QIODevice::ReadOnly);

    QString str;

    forever
    {
        fd_set stdinfd;
        FD_ZERO( &stdinfd );
        FD_SET( STDIN_FILENO, &stdinfd );
        struct timeval tv;
        tv.tv_sec = 0;
        tv.tv_usec = 0;
        int ready = select( 1, &stdinfd, NULL, NULL, &tv );
        if( ready > 0 )
        {
            str += stream.readLine();
        }
        else
        {
            break;
        }
    }

    qDebug() << "Recieved data:" << str;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在尝试使用select()系统调用来告诉我何时我的数据用完了.但是,在实践中发生的事情是,在我读完第一行文本后,select()调用返回0.因此,例如,如果我向进程的stdin流写入5行文本,我只读过第一行. …

c++ qt stdin blocking

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

最小化随机矩形中的重叠

我有一些可能重叠的矩形,在固定平面内随机大小和位置.由于这些矩形是随机的,有些可能不会重叠:

|-----
|    |    |----|
|----|    |    |
          |----|

有些可能只有一个角重叠:

|-----|
|  |--|--|
|--|--|  |
   |-----|

有些可能包含在另一个矩形内:

|----------------|
|                |
|   |-----|      |
|   |     |      |
|   |-----|      |
|----------------|

有些可能会通过另一个矩形:

   |----------------|
   |                |
|--|-------------------|
|  |                |  |
|--|-------------------|
   |----------------|

等等

我正在尝试找到一种算法,该算法为我提供了一组矩形,这些矩形表示与输入集相同的区域,但没有重叠.有些情况很明显 - 可以丢弃包含在较大矩形内的矩形,并且在角上重叠的矩形可以分成三个矩形,也可以将矩形分成另一个矩形.我正在寻找的是一种处理所有这些情况的通用算法.我不在乎它是否效率不高 - 输入设置相当小(最多25个矩形)

找到重叠的矩形很容易,但它很快就会变得更难,尤其是当您考虑到一个矩形可能与多个其他矩形重叠时.

这是我的头脑.有什么建议吗?

更新:

我刚刚意识到了一件事:

我可以在添加矩形的时候运行这个算法,一个接一个地添加,或者在添加了所有矩形之后.添加矩形可能更容易,因为您只需要考虑一个矩形,但您仍需要考虑单个矩形与多个其他矩形重叠的情况.

language-agnostic algorithm ascii-art

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

如何在c ++中透明地处理不同的协议版本?

这是一个通用的C++设计问题.

我正在编写一个使用客户端/服务器模型的应用程序.现在我正在编写服务器端.许多客户已经存在(一些由我自己编写,另一些由第三方编写).问题是这些现有客户端都使用不同的协议版本(多年来已经有2-3次协议更改).

由于我正在重写服务器,我认为现在是设计我的代码的好时机,这样我就可以透明地处理许多不同的协议版本.在所有协议版本中,来自客户端的第一个通信包含协议版本,因此对于每个客户端连接,服务器确切地知道它需要谈论哪个协议.

执行此操作的天真方法是使用以下语句来丢弃代码:

if (clientProtocolVersion == 1)
    // do something here
else if (clientProtocolVersion == 2)
    // do something else here
else if (clientProtocolVersion == 3)
    // do a third thing here...
Run Code Online (Sandbox Code Playgroud)

由于以下原因,此解决方案非常糟糕:

  1. 当我添加新协议版本时,我必须在源树中找到使用这些if语句的所有位置,并修改它们以添加新功能.
  2. 如果出现了新的协议版本,并且协议版本的某些部分与另一个版本相同,我需要修改if语句以便它们读取if (clientProtoVersion == 5 || clientProtoVersion == 6).
  3. 我确信有更多的理由说明它的设计不好,但我现在想不到它们.

我正在寻找的是一种使用C++语言的功能智能地处理不同协议的方法.我考虑过使用模板类,可能使用指定协议版本的模板参数,或者可能是类heirarchy,每个不同的协议版本都有一个类...

我敢肯定这是一种非常常见的设计模式,所以很多人以前都遇到过这个问题.

编辑:

你们中的许多人已经建议继承heirarchy,最旧的协议版本在顶部,像这样(请原谅我的ASCII艺术):

IProtocol
    ^
    |
CProtoVersion1
    ^
    |
CProtoVersion2
    ^
    |
CProtoVersion3
Run Code Online (Sandbox Code Playgroud)

......就重复使用而言,这似乎是一件明智的事情.但是,当您需要扩展协议并添加基本的新消息类型时会发生什么?如果我在其中添加虚拟方法IProtocol并实现这些新方法CProtocolVersion4,那么在早期协议版本中如何处理这些新方法?我想我的选择是:

  • 使默认实现为NO_OP(或者可能在某处记录消息).
  • 抛出一个例外,虽然这似乎是一个坏主意,即使我正在输入它.
  • ......做点别的吗?

EDIT2:

除了上述问题,当较新的协议消息需要比旧版本更多的输入时会发生什么?例如:

在protocl版本1中,我可能有:

ByteArray getFooMessage(string param1, int param2)

在协议版本2中,我可能想要:

ByteArray …

c++ language-agnostic design-patterns protocols

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

Qt语言学家和谷歌翻译

我正在寻找一种方法来欺骗并使用Qt语言学家和已经存在的翻译服务(如谷歌翻译)创建我的Qt应用程序的一些非常粗略的翻译.

谷歌翻译有一个公共API,所以我希望有人已经尝试过这个,但我似乎无法找到它.以前有人见过这样的事吗?

我不期待精彩的翻译 - 在这一点上,它只是作为一个概念证明.

c++ qt translation

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

Qt拆分器禁用

我希望能够阻止用户在运行时移动QSplitter.调用会这样做setEnabled(false),但它也会禁用所有子窗口小部件 - 这不是我想要的.有没有办法实现这个目标?我是否必须禁用拆分器,然后手动重新启用所有子窗口小部件?这似乎相当麻烦,因为这必须是一种相当普遍的做法.

谁能提出任何建议?

c++ qt

7
推荐指数
2
解决办法
3875
查看次数

在Mac OS X上模拟鼠标点击对某些应用程序不起作用

我正在用C++编写Mac OS X 10.6及更高版本的应用程序.应用程序的一部分需要模拟鼠标移动和鼠标点击.我目前通过CGEvent使用发布对象来执行此操作CGEventPost(kCGHIDEventTap, event);.

这在很大程度上是有效的 - 我可以模拟鼠标移动和点击很好,但在某些方面似乎失败了.例如:

  • 在Mozilla Firefox和Safari中,我可以单击所有菜单,但不能单击网站中的链接.当我尝试时,链接突出显示,但浏览器从不跟随链接.但是,我可以右键单击一个链接,选择"在新选项卡中打开链接",一切都按预期工作.解决 - 使用创建鼠标事件CGEventCreateMouseEvent(...)使事件在Web浏览器中工作.
  • 我可以单击"仪表板"图标以使仪表板变亮,但我无法单击任何仪表板小组件上的"i"按钮.同样,点击聚光灯搜索小部件中的任何搜索结果也不起作用.

这种不一致是沿着应用程序的边界.可能是什么原因?

c++ macos mouse events

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

默认情况下,在Visual Studio 2010中为所有项目启用异常处理

对于新项目,Visual Studio 2010似乎默认不会抛出抛出的异常 - 您必须进入设置并启用该行为.此设置似乎是每个项目的设置,而不是系统范围的设置.

是否有任何方法可以强制默认行为中断所有新项目的抛出异常?

我在64位计算机上运行Windows 7 Professional上的Visual Studio 2010 Ultimate.

visual-studio-2010

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

ld报告缺少符号,但符号似乎存在

我正在尝试将我的mac应用程序链接到精彩的libancillary库.但是,我更改了库构建脚本以创建共享库.我可以使用以下方法检查此库中的符号nm libancillary.dylib- 结果是:

libancillary.dylib(single module):
         U ___sF
         U __keymgr_get_and_lock_processwide_ptr
         U __keymgr_get_and_lock_processwide_ptr_2
         U __keymgr_set_and_unlock_processwide_ptr
         U _abort
00002cfe T _ancil_recv_fd
00002c87 T _ancil_recv_fds
00002b6a T _ancil_recv_fds_with_buffer
00002e9e T _ancil_send_fd
00002e27 T _ancil_send_fds
00002d3f T _ancil_send_fds_with_buffer
         U _calloc
         U _dlopen
         U _dlsym
         U _fflush
         U _fprintf
         U _free
         U _malloc
         U _recvmsg
         U _sendmsg
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试链接我的应用程序时,我得到的输出是:

g++ -headerpad_max_install_names -framework AppKit -framework Cocoa -framework IOKit -framework CoreFoundation -framework Carbon -framework OpenGL -framework SystemConfiguration -framework Security -Wl,-bind_at_load -arch i386 -o MyApp build/app.o …
Run Code Online (Sandbox Code Playgroud)

c++ macos linker gcc undefined-symbol

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

如何强制Mac窗口前景?

如何以编程方式强制将mac窗口作为前窗?我有窗口句柄,并希望确保我的窗口显示在所有其他窗口之上.我可以同时使用Carbon和Cocoa.

c++ macos graphics cocoa macos-carbon

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