我在QTableView中有一些嵌入式QComboBox.为了使它们默认显示,我将这些索引设为"持久编辑器".但是现在每当我在它们上面滚动鼠标时它们会破坏我当前的表格选择.
所以基本上如何禁用QComboBox的鼠标滚动?
我发现了一个关于stl地图的非常偏见的事实.出于某种原因,我无法将对象插入到地图中以仅构造/销毁一次.
例:
struct MyObject{
MyObject(){
cout << "constructor" << endl;
}
~MyObject(){
cout << "destructor" << endl;
}
};
int main() {
std::map<int, MyObject> myObjectsMap;
myObjectsMap[0] = MyObject();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
收益:
constructor
destructor
destructor
constructor
destructor
Run Code Online (Sandbox Code Playgroud)
如果我做:
typedef std::pair<int, MyObject> MyObjectPair;
myObjectsMap.insert( MyObjectPair(0,MyObject()));
Run Code Online (Sandbox Code Playgroud)
收益:
constructor
destructor
destructor
destructor
Run Code Online (Sandbox Code Playgroud)
我正在插入对自己的内存分配负责的对象,所以当它们被破坏时它们会自我清理,多次被破坏会给我带来一些麻烦.
我已经阅读了几天关于如何使用Qt creator或qmake将外部资源,插件或框架复制/更新到我的应用程序的Mac Bundle.
现在我找到了两个主要的解决方案.一种是在".pro"文件中使用qmake和一些命令.另一个是执行"自定义部署步骤"脚本.
我希望使用第二个选项,因为我已经有一个小的make脚本,它做了我想要的.问题在于Qt Creator提供的变量很少,因此脚本失去了它的用处.例如,我的脚本使用"目标应用程序路径"作为参数,因此它可以从那里完成所有工作.但请纠正我,如果我错了,Qt Creator只提供%{buildDir}和%{sourceDir}变量......
另一种选择是使用qmake.这些是我迄今为止在".pro"文件中尝试过的内容:
1)使用INSTALL命令.我做了一个小测试,我尝试以这种方式复制一些文件:
MediaFiles.path = test/media
MediaFiles.files = media/*
INSTALL += MediaFiles
Run Code Online (Sandbox Code Playgroud)
基本上什么也没发生.我正在跳"在"test"文件夹中找到相同的"media"文件夹,但什么都没有.不知道我做错了什么.
请注意,"media"文件夹位于"test"文件夹和".pro"文件旁边.(它们都具有相同的层次结构位置.)
2)然后我尝试了QMAKE_BUNDLE_DATA:
MediaFiles.path = Contents/MacOS
MediaFiles.files = media/*
QMAKE_BUNDLE_DATA += MediaFiles
Run Code Online (Sandbox Code Playgroud)
但这给了我以下错误:
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory
make: *** [PathToApp] Error 64
Run Code Online (Sandbox Code Playgroud)
到目前为止,似乎没有任何解决方案令人满意.如果我想做一个好的自定义make脚本,我需要分别对每个目标路径进行硬编码.在我的情况下,我有8个不同的目标路径,取决于一些"CONFIG"变量.
我确信qmake解决方案是这样做的官方方式.如果有人能指出我错误64的解决方案会很酷.
还有一个问题:每次我想要更新我的捆绑包时,是否必须进行qmake?我可以用qmake执行make脚本吗?
嗯,我对Valgrind和内存泄漏分析器一般都很新.我必须说当你开始使用它们时有点可怕因为你不能不知道你之前可能还有多少泄漏!
到目前为止,由于我不是c ++程序员的经验,我想检查一下这肯定是内存泄漏还是Valgrind做了误报?
typedef std::vector<int> Vector;
typedef std::vector<Vector> VectorVector;
typedef std::map<std::string, Vector*> MapVector;
typedef std::pair<std::string, Vector*> PairVector;
typedef std::map<std::string, Vector*>::iterator IteratorVector;
VectorVector vv;
MapVector m1;
MapVector m2;
vv.push_back(Vector());
m1.insert(PairVector("one", &vv.back()));
vv.push_back(Vector());
m2.insert(PairVector("two", &vv.back()));
IteratorVector i = m1.find("one");
i->second->push_back(10);
m2.insert(PairVector("one", i->second));
m2.clear();
m1.clear();
vv.clear();
Run Code Online (Sandbox Code Playgroud)
这是为什么?clear命令不应该调用每个对象和每个向量的析构函数吗?
在做了一些测试之后,我发现了泄漏的不同解决方案:
1)删除:
i->second->push_back(10);
Run Code Online (Sandbox Code Playgroud)
2)添加:
delete i->second;
Run Code Online (Sandbox Code Playgroud)
3)删除第二个
vv.push_back(Vector());
m2.insert(PairVector("two", &vv.back()));
Run Code Online (Sandbox Code Playgroud)
使用解决方案2)使Valgring打印:10个分配,11个自由可以吗?
因为我没有使用新的为什么要删除?
谢谢你的帮助!
c++ ×2
qt ×2
bundle ×1
deployment ×1
map ×1
memory ×1
memory-leaks ×1
mouse ×1
qcombobox ×1
qmake ×1
qt-creator ×1
scroll ×1
stl ×1
valgrind ×1