我有一个QComboBox填写QString使用:
comboBox->addItem(someString);
Run Code Online (Sandbox Code Playgroud)
当我启动GUI应用程序时,宽度QComboBox始终为70,即使最小的项目要大得多.如何动态设置的宽度QComboBox,例如,在最大QString范围内的comboBox?
编辑:
经过一些进一步的测试后,我发现了以下解
// get the minimum width that fits the largest item.
int width = ui->sieveSizeComboBox->minimumSizeHint().width();
// set the ComboBoxe to that width.
ui->sieveSizeComboBox->setMinimumWidth(width);
Run Code Online (Sandbox Code Playgroud) 我最近开始使用C++ 14而不是C++ 11来使我的C++代码库现代化.
在用C++ 14 替换了一次std::unique_ptr.reset(new ...)使用后std::make_unique,我意识到我的测试套件(由大约30个C++测试程序组成)运行速度慢了约50%.
旧C++ 11代码(快速):
class Foo
{
public:
Foo(size_t size)
{
array.reset(new char[size]);
}
private:
std::unique_ptr<char[]> array;
};
Run Code Online (Sandbox Code Playgroud)
新的C++ 14代码(慢):
class Foo
{
public:
Foo(size_t size)
{
array = std::make_unique<char[]>(size);
}
private:
std::unique_ptr<char[]> array;
};
Run Code Online (Sandbox Code Playgroud)
使用C++ 14代码时,GCC和Clang都运行得慢得多std::make_unique.当我使用valgrind测试两个版本时,它报告C++ 11和C++ 14代码使用相同数量的分配和相同数量的已分配内存,并且没有内存泄漏.
当我查看上面生成的测试程序的程序集时,我怀疑C++ 14版本std::make_unique在使用memset分配后使用重置内存.C++ 11版本没有这样做:
C++ 11程序集(GCC 7.4,x64)
main:
sub rsp, 8
movsx rdi, edi
call operator new[](unsigned long)
mov rdi, rax
call operator delete[](void*)
xor eax, eax
add rsp, …Run Code Online (Sandbox Code Playgroud) 我需要一个可移植的C++库来进行IPC.到目前为止我使用了fork()和SysV共享内存,但这限制了我使用Linux/Unix.我发现有3个主要的C++库提供便携式解决方案(包括Windows和Mac OS X).我真的很喜欢Boost,并且想要使用它,但我需要进程,看起来这只是一个实验分支,直到现在!?我以前从未听说过ACE或POCO,因此我被困住了,我不知道选择哪一个.我需要fork(),sleep()(usleep()会很棒)和共享内存当然.性能和文档也是重要的标准.
谢谢你的帮助!
我无法弄清楚如何更改QComboBox的一个特定项目的文本颜色.我能够更改项目的背景颜色:
comboBox->setItemData(i, Qt::green, Qt::BackgroundRole);
Run Code Online (Sandbox Code Playgroud)
(Qt::ForegroundRole完全没有效果,Qt 4.6,Ubuntu 10.04)
我能够用样式表更改所有项目的文本颜色,但我无法弄清楚如何更改一个指定项目的文本颜色.
谢谢你的帮助!
我在C++ 11代码中有一个警告,我想正确修复,但我真的不知道如何.我创建了自己的异常类,派生自std::runtime_error:
class MyError : public std::runtime_error
{
public:
MyError(const std::string& str, const std::string& message)
: std::runtime_error(message),
str_(str)
{ }
virtual ~MyError()
{ }
std::string getStr() const
{
return str_;
}
private:
std::string str_;
};
Run Code Online (Sandbox Code Playgroud)
当我使用clang-cl编译该代码时,/Wall我得到以下警告:
warning: definition of implicit copy constructor for 'MyError' is deprecated
because it has a user-declared destructor [-Wdeprecated]
Run Code Online (Sandbox Code Playgroud)
因为我已经定义了一个析构函数,MyError所以不会生成复制构造函数MyError.我不完全明白这是否会引起任何问题......
现在我可以通过简单地删除虚拟析构函数来消除该警告,但我总是认为如果基类(在本例中std::runtime_error)具有虚拟析构函数,派生类应该具有虚拟析构函数.
因此,我想最好不要删除虚拟析构函数,而是定义复制构造函数.但是如果我需要定义复制构造函数,也许我还应该定义复制赋值运算符和移动构造函数以及移动赋值运算符.但这对我的简单异常类似乎有点过分了!?
任何想法如何最好地解决这个问题?
我用Qt创建器创建了一个菜单栏和一些菜单.其中一个菜单必须编码才能使用QActionGroup功能.现在可以很容易地将我的自定义菜单添加到菜单栏中:
printMenu = menuBar()->addMenu(tr("&Print"));
Run Code Online (Sandbox Code Playgroud)
但我的菜单将位于菜单栏的最后位置.如何在指定位置添加菜单?(例如,文件菜单后面的第二个位置)
问候
我需要在我的C++应用程序中QTextEdit使用文本记录器,用于在Qt 3.3之前使用此功能,但不幸的是它已被删除.有没有我可以使用的替代方案?
经过大量的互联网研究,我在我的C++程序中实现了一个小的汇编程序,用cpuid获取CPU的L1缓存大小.
int CPUID_getL1CacheSize() {
int l1CacheSize = -1;
asm ( "mov $5, %%eax\n\t" // EAX=80000005h: L1 Cache and TLB Identifiers
"cpuid\n\t"
"mov %%eax, %0" // eax into l1CacheSize
: "=r"(l1CacheSize) // output
: // no input
: "%eax" // clobbered register
);
return l1CacheSize;
}
Run Code Online (Sandbox Code Playgroud)
它适用于带有MinGW(GCC,G ++)的Windows 7 64位.接下来我在Mac计算机上使用GCC 4.0尝试了这个,因为我的程序在ComboBox中显示奇怪的字符串并且某些信号无法连接(Qt GUI),因此必定存在错误.
这是我的第一个汇编程序,希望有人能给我一个提示,谢谢!
我想在我的C++程序中运行一个小的UNIX shell脚本,我想捕获shell脚本的退出代码.但是std :: system返回的值并不是我所期望的:
#include <iostream>
#include <cstdlib>
int main()
{
std::cout << std::system("echo Hello >/dev/null") << std::endl;
std::cout << std::system("which does_not_exisit 2>/dev/null") << std::endl;
std::cout << std::system("exit 0") << std::endl;
std::cout << std::system("exit 1") << std::endl;
std::cout << std::system("exit 2") << std::endl;
std::cout << std::system("exit 3") << std::endl;
std::cout << std::system("echo exit 4 | bash") << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的Linux机器上,这会产生:
0
256
0
256
512
768
1024
Run Code Online (Sandbox Code Playgroud)
似乎所有大于0的退出代码都乘以256.这种行为的原因是什么?这是可移植的UNIX操作系统吗?
MSVC 2019 添加了一个新的_udiv128()内在(文档),我想在我的 C++ 代码中使用它。然而,该内在函数目前在 clang-cl 9.0.0 和英特尔 C++ 编译器 2019 中均不可用,即使这些编译器的设置_MSC_VER=1920与 MSVC 2019 一样。
由于这个问题,下面的代码不能同时使用 clang-cl 和 icl 编译:
#include <immintrin.h>
#if _MSC_VER >= 1920
uint64_t res = _udiv128(a, b, c, &d);
#endif
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以使用预处理器检测 MSVC,而不检测 clang-cl、icl、...我想避免检查_MSC_VER然后排除所有其他 C/C++ Windows 编译器。
理想情况下,我想使用 Microsoft 特定的宏来检测 MSVC,该宏仅针对 MSVC 而不是针对 clang-cl、icl...
我使用SysV共享内存让两个进程相互通信。我不希望代码变得复杂,所以我想知道是否真的需要使用信号量来同步对共享内存的访问。在我的C / C ++程序中,父进程从共享内存中读取,子进程写入共享内存中。我编写了两个测试应用程序,以查看是否会产生诸如分段错误之类的错误,但我无法(Ubuntu 10.04 64bit)。即使两个进程在while循环中不停地写入同一共享内存也不会产生任何错误。
我希望有人对此事有经验,可以告诉我是否真的必须使用信号量来同步访问,或者我是否可以不进行同步。
谢谢
我在我的C++ GUI应用程序中使用QTextEdit,我使用textEdit-> append(byteArray); 添加一些文本,不幸的是append()在每次调用append()后在最后添加一个新行字符.我知道我可以使用insertPlainText(),它不会添加新行字符,但在处理大文档时会占用更多内存.
谢谢你的帮助!