我是Qt的新手,并不太了解Qt Quick Project和Qt Widget Project之间的区别.
我希望创建一个程序,绘制一个六边形的格子,用户可以旋转和剪切,以及平移和放大和缩小.它最终将成为MIDI控制器.哪种类型的项目会更好,为什么?
我希望这可以在桌面和移动平台上工作.
根据Qt文档,它"为几何变化准备项目.在更改项目的边界矩形之前调用此函数以使QGraphicsScene的索引保持最新.如果有必要,prepareGeometryChange()将调用update()."
我不明白的是QGraphicsItem如何知道边界矩形何时发生变化,以及它如何知道何时调用update().您是否应该在调用prepareGeometryChange()然后更改边界矩形后自己调用update()?
我非常感谢对一些看似透视的方法有所了解.
根据QGraphicsItem析构函数文档,"在销毁项目之前从QGraphicsScene中删除项目更有效."
这是为什么?我想不出它会如何产生影响.如果确实有所作为,那么QGraphicsItem析构函数不应该只调用:
if (scene() != NULL)
scene()->removeItem(this);
Run Code Online (Sandbox Code Playgroud)
我检查了源代码,这似乎并非如此,尽管有时我很难理解Qt源代码.编辑:请参阅jdi的答案中的评论.
根据我的理解,如果你有一个std::vector<int>和一个std::vector<float>,编译器会创建两个类,每个类一个.因此,虽然减少了写入的代码量,但是不会减少可执行文件的大小(如果我错了,请纠正我).
即使类型是指针,是否也是如此?例如,是否会实例化std::vector<SomeClass*>并且std::vector<SomeOtherClass*>必然会导致编译器为两个实例中的每一个生成单独的代码?
我对VBA很新.我正在开发一个Excel项目,我一直看到项目中的代码如下所示:
If Me.Columns(i).Hidden = True Then
Me.Columns(i).Hidden = False
End If
Run Code Online (Sandbox Code Playgroud)
还有这个:
If Range("SomeRange").Locked = True Then
Range("SomeRange").Locked = False
End If
Run Code Online (Sandbox Code Playgroud)
特别是在这些情况下,是否有任何理由在设置之前检查属性是否已设置,或者这只是一个无用的检查?当然VBA引擎必须进行内部检查,以便它不会做任何不必要的事情.
我是一个新的Python用户,我确信这是一个非常基本的问题,但我无法在任何地方找到答案.当人们在线发布Python代码时,它的格式通常如下:
In [1]: # some stuff
Out[1]:
# some more stuff
Run Code Online (Sandbox Code Playgroud)
什么是In的,Out's和数字?为什么我的Python控制台不那样?
我知道有关堆栈与堆的问题已被多次询问,但我对选择如何在C++中声明对象的一个小方面感到困惑.
我知道用"new"运算符访问的堆用于动态内存分配.根据Stack Overflow上另一个问题的答案,"堆用于存储数据,其中存储的生命周期无法提前确定".堆栈比堆快,似乎用于本地范围的变量,即,当相关的代码段完成时,变量会自动删除.堆栈还具有相对有限的可用空间量.
在我的例子中,我知道在运行时之前我将需要一个指向特定类的500个对象的指针数组,并且我知道我将需要在整个运行时期间存储指针和对象.堆没有意义,因为我事先知道我需要多长时间才能记忆,而且我确切地知道我将需要多少对象.如果范围有限,堆栈也没有意义; 另外,我不知道它是否能真正保存我的所有对象/指针.
处理这种情况的最佳方法是什么?为什么?谢谢!
我听说你每次使用"new"时都应该"删除",但是当我运行一个简单的测试程序(下面)时,我为arraySize或numLoops添加的数字似乎没什么区别.这会导致内存泄漏吗?
#include <iostream>
int main()
{
double *array;
const int arraySize = 100000;
const int numLoops = 100000;
for (int i = 0; i < numLoops; i++)
{
// do I need to call "delete [] array;" here?
array = new double[arraySize];
}
int x;
std::cin >> x; // pause the program to view memory consumption
delete [] array;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一种虚拟音乐键盘,可以让你按下键盘上的按键并让它弹奏音符.所以在我的MainWindow类中,我重新实现了keyPressEvent.我想忽略修饰符(Control,Alt,Shift等)生成的事件,以及其他非字符键(如Tab,Backspace和Enter)生成的事件.这样的事情是理想的:
void MainWindow::keyPressEvent(QKeyEvent *event)
{
if (!event->key().isCharacter()))
{
event->ignore();
return;
}
// handle the event
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做这样的事情(没有单独测试每个可能的非字符键)?如果不是,如果它是修饰符,至少有一种方法可以轻易忽略该事件吗?
我怀疑这是可能的,但值得一提的是:我想从静态成员函数中调用非静态成员函数.我想为班级的每个当前实例做这件事.可能吗?
当我在测试类中尝试这个时,我收到以下错误:
"无法调用成员函数'void TestClass :: NonStaticMethod()'没有对象"
首先,如果之前有人问过,我道歉.我似乎找不到合适的信息.
以下代码不会打印"300",因为我认为它会:
#include <iostream>
int main()
{
int *array;
int *arrayCopy = array;
array = new int[4];
array[0] = 100;
array[1] = 200;
array[2] = 300;
array[3] = 400;
std::cout << arrayCopy[2];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我移动线路,它确实如此
int *arrayCopy = array;
Run Code Online (Sandbox Code Playgroud)
在上面的代码中它后面的行下面.这是为什么?
(PS:我知道有一个内存泄漏,而且std :: vector更好......我只是好奇).