我正在尝试在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)
一切正常.
问题似乎是SVG插件永远不会被加载.我可以获得支持的图像类型列表,其中包含:
("bmp","pbm","pgm","png","ppm","xbm","xpm")
但没有提到SVG.
我已经确定我在我的静态库.pro文件和我的主应用程序.pro文件中都使用了SVG模块.
编辑:
似乎问题是我静态链接到Qt,因此插件都是静态库.QPluginLoader
各州的文件:
请注意,如果您的应用程序与Qt静态链接,则无法使用QPluginLoader.在这种情况下,您还必须静态链接到插件.如果需要在静态链接的应用程序中加载动态库,可以使用QLibrary.
然而,静态链接到这些插件似乎什么都不做(支持的图像格式列表不会增长).
EDIT2:
此外,动态链接到Qt(重建我的整个应用程序后)使上面的代码完美地工作.但是,我想静态链接到Qt,所以现在的问题更多的是关于在静态链接到Qt时加载Qt插件而不是一般的图标.我会更新帖子标题以反映这一点.
使用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行文本,我只读过第一行. …
我有一些可能重叠的矩形,在固定平面内随机大小和位置.由于这些矩形是随机的,有些可能不会重叠:
|----- | | |----| |----| | | |----|
有些可能只有一个角重叠:
|-----| | |--|--| |--|--| | |-----|
有些可能包含在另一个矩形内:
|----------------| | | | |-----| | | | | | | |-----| | |----------------|
有些可能会通过另一个矩形:
|----------------| | | |--|-------------------| | | | | |--|-------------------| |----------------|
等等
我正在尝试找到一种算法,该算法为我提供了一组矩形,这些矩形表示与输入集相同的区域,但没有重叠.有些情况很明显 - 可以丢弃包含在较大矩形内的矩形,并且在角上重叠的矩形可以分成三个矩形,也可以将矩形分成另一个矩形.我正在寻找的是一种处理所有这些情况的通用算法.我不在乎它是否效率不高 - 输入设置相当小(最多25个矩形)
找到重叠的矩形很容易,但它很快就会变得更难,尤其是当您考虑到一个矩形可能与多个其他矩形重叠时.
这是我的头脑.有什么建议吗?
更新:
我刚刚意识到了一件事:
我可以在添加矩形的时候运行这个算法,一个接一个地添加,或者在添加了所有矩形之后.添加矩形可能更容易,因为您只需要考虑一个矩形,但您仍需要考虑单个矩形与多个其他矩形重叠的情况.
这是一个通用的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)
由于以下原因,此解决方案非常糟糕:
if (clientProtoVersion == 5 || clientProtoVersion == 6)
.我正在寻找的是一种使用C++语言的功能智能地处理不同协议的方法.我考虑过使用模板类,可能使用指定协议版本的模板参数,或者可能是类heirarchy,每个不同的协议版本都有一个类...
我敢肯定这是一种非常常见的设计模式,所以很多人以前都遇到过这个问题.
编辑:
你们中的许多人已经建议继承heirarchy,最旧的协议版本在顶部,像这样(请原谅我的ASCII艺术):
IProtocol
^
|
CProtoVersion1
^
|
CProtoVersion2
^
|
CProtoVersion3
Run Code Online (Sandbox Code Playgroud)
......就重复使用而言,这似乎是一件明智的事情.但是,当您需要扩展协议并添加基本的新消息类型时会发生什么?如果我在其中添加虚拟方法IProtocol
并实现这些新方法CProtocolVersion4
,那么在早期协议版本中如何处理这些新方法?我想我的选择是:
EDIT2:
除了上述问题,当较新的协议消息需要比旧版本更多的输入时会发生什么?例如:
在protocl版本1中,我可能有:
ByteArray getFooMessage(string param1, int param2)
在协议版本2中,我可能想要:
ByteArray …
我正在寻找一种方法来欺骗并使用Qt语言学家和已经存在的翻译服务(如谷歌翻译)创建我的Qt应用程序的一些非常粗略的翻译.
谷歌翻译有一个公共API,所以我希望有人已经尝试过这个,但我似乎无法找到它.以前有人见过这样的事吗?
我不期待精彩的翻译 - 在这一点上,它只是作为一个概念证明.
我希望能够阻止用户在运行时移动QSplitter.调用会这样做setEnabled(false)
,但它也会禁用所有子窗口小部件 - 这不是我想要的.有没有办法实现这个目标?我是否必须禁用拆分器,然后手动重新启用所有子窗口小部件?这似乎相当麻烦,因为这必须是一种相当普遍的做法.
谁能提出任何建议?
我正在用C++编写Mac OS X 10.6及更高版本的应用程序.应用程序的一部分需要模拟鼠标移动和鼠标点击.我目前通过CGEvent
使用发布对象来执行此操作CGEventPost(kCGHIDEventTap, event);
.
这在很大程度上是有效的 - 我可以模拟鼠标移动和点击很好,但在某些方面似乎失败了.例如:
CGEventCreateMouseEvent(...)
使事件在Web浏览器中工作.这种不一致是沿着应用程序的边界.可能是什么原因?
对于新项目,Visual Studio 2010似乎默认不会抛出抛出的异常 - 您必须进入设置并启用该行为.此设置似乎是每个项目的设置,而不是系统范围的设置.
是否有任何方法可以强制默认行为中断所有新项目的抛出异常?
我在64位计算机上运行Windows 7 Professional上的Visual Studio 2010 Ultimate.
我正在尝试将我的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) 如何以编程方式强制将mac窗口作为前窗?我有窗口句柄,并希望确保我的窗口显示在所有其他窗口之上.我可以同时使用Carbon和Cocoa.