我想知道在同一进程中拥有多个QApplication/实例会产生什么影响(问题),以及如何解决与之相关的一些问题。QCoreApplication
场景如下:我想在开源第三方应用程序上制作一个包装器,以便将其转换为可嵌入小部件作为可选插件(该应用程序基本上由基于单一的QMainWindow接口组成)。
此类项目严重依赖QCoreApplication派生类,但基本上是因为它被用作已经存在的单例。我能够修改代码(并且我必须这样做才能将其公开QMainWindow为可嵌入的小部件),尽管由于该项目的复杂性我不能简单地删除父类。
因此,最终的应用程序将有自己的QApplication(在启动时创建),然后可以选择加载上述插件(从而创建第二个QCoreApplication)。只有第一个(主)QApplication用于事件循环 ( QCoreApplication::exec())。
我知道QCoreApplication单身的事实。在我的测试中,单例始终指向最后创建的实例:
qDebug() << qApp;
auto app1 = new QApplication(argc, argv);
qDebug() << qApp;
auto app2 = new TheOtherQApplication(argc, argv);
qDebug() << qApp;
Run Code Online (Sandbox Code Playgroud)
输出是
Q对象(0x0)
QApplication(0x6f9400,名称=“测试”)
QCoreApplication 中的 ASSERT 失败:“应该只有一个应用程序对象”,文件 kernel\qcoreapplication.cpp,第 595 行
TheOtherQApplication(0x2550dc0,名称=“测试”)
TheOtherQApplication(0x2550dc0,名称 =“测试”) TheOtherQApplication(0x2550dc0,名称 =“测试”)
可以看出,QApplication创建第二个实例后,它会替换全局实例。有什么办法可以解决这个问题吗?由于插件是可选的,明显的答案(QApplication在第二位加载主程序)不是一个合适的选择。
另外,拥有多个QApplication实例是否还有其他影响?或者都与事件循环(选中)和单例相关?
注意:由于第三方依赖项尚未完全更新,这是一个基于 Qt 4.7 的项目。计划在一年左右的时间内迁移到最新版本,但目前我必须处理 4.7。
顺便说一句,我已经审查了几个相关的问题,包括这个问题,但它没有提供任何有用的信息。
在Qt中有没有办法添加布局或小部件QMenu来创建自定义菜单?
下面的示例(左)是我的,我想通过添加非菜单小部件来瞄准类似于右侧模型的东西.如果无法完成QMenu,是否有指南可以在任何地方产生类似的结果(可能通过将更标准的小部件作为上下文菜单)?

Visual Studio 2013在构建时出现问题,它显示如下错误消息:
c:>devenv /build debug /project (project name) /projectconfig "debug|x64" (solution Name).sln
Run Code Online (Sandbox Code Playgroud)
1>此操作应仅在UI线程上进行.
以下基本代码是一个非常大的过程的一部分:
int x = foo();
if (x == 0) x = bar();
Run Code Online (Sandbox Code Playgroud)
x 在其他任何地方都没有修改,所以我可以这样做:
const int x = foo() == 0 ? bar() : foo();
Run Code Online (Sandbox Code Playgroud)
但是这foo()是一个非常昂贵和复杂的功能,所以我不能因为性能和它可能产生竞争条件并因此获得不同的值(它可能涉及读取外部资源)两次调用它.
我想让代码尽可能可读,如果可能的话,尽可能简短.一种选择是:
const int foo_ = foo(), x = foo_ == 0 ? bar() : foo_;
Run Code Online (Sandbox Code Playgroud)
另一方面,我想避免使用这种时间变量,主要是因为foo()可能依赖于外部资源,因此foo_在代码的其余部分中使用缓存值是无效的.
我正在发布我正在使用的解决方案,但我想知道是否有更好的选项(没有或几个代码混乱,在同一范围内没有时间变量,可读性......).提前致谢!
PS:它必须遵循至少C++ 11标准,因为它属于跨平台项目.
我知道它可能是基于意见的,但考虑到先前关于简单性(不是混乱代码)和避免时间变量(不是为了可读性而是为了代码安全性)的陈述,我想知道解决这个问题的选项.
一个非常简单的问题:
type
TMyRecord = Record
Int: Integer;
Str: String;
end;
PMyRecord = ^TMyRecord;
var
Data: PMyRecord;
begin
New(Data);
Data.Int := 42;
Data.Str := 'Test';
Dispose(Data);
end;
Run Code Online (Sandbox Code Playgroud)
我的问题是,我在这里创建了一个内存泄漏(有String)吗?我打电话Data.Str := '';之前应该打电话Dispose吗
谢谢!
我需要在QPushButton里面放一个QMenu.它是否可能,如果可能,那么如何?
我希望实现这样的目标:

我宣布一张布尔表并将其初始化 main()
const int dim = 2;
bool Table[dim][dim];
int main(){
Table[dim][dim] = {{false,false},{true,false}};
// code
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用mingw编译器和构建器选项 g++ -std=c++11.错误是
在赋值时,不能将大括号括起来的初始化列表转换为'bool'
我有分裂字符串的问题.下面的代码有效,但只有在字符串之间是''(空格).但即使有任何空白字符,我也需要拆分字符串.是strtok()甚至是必要的?
char input[1024];
char *string[3];
int i=0;
fgets(input,1024,stdin)!='\0') //get input
{
string[0]=strtok(input," "); //parce first string
while(string[i]!=NULL) //parce others
{
printf("string [%d]=%s\n",i,string[i]);
i++;
string[i]=strtok(NULL," ");
}
Run Code Online (Sandbox Code Playgroud) 我想在图像上绘制文本。我使用此代码,但是在图像上看不到任何文本。
void ImageSaver::save(const QString &path) const {
QImage image(img_);
QPainter p(&image);
p.setPen(QPen(Qt::red));
p.setFont(QFont("Times", 12, QFont::Bold));
p.drawText(image.rect(), Qt::AlignCenter, "Text");
image.save(path);
}
Run Code Online (Sandbox Code Playgroud) 我在iPhone 7上找到了使用Google的用户代理字符串:
Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A5297c Safari/602.1
Run Code Online (Sandbox Code Playgroud)
iPhone 7 PLUS的用户代理字符串是什么?有什么区别吗?