我有一个应用程序,其目的是获取一个按键值并将其放入QList中。但是,每次调用处理QList修改的类成员函数时,成员变量QList
都会被重置。我相信我有一个范围问题,但我无法弄清楚在哪里。这是我的代码:
myClass.h
class myClass
{
private:
int var1;
QList<int> list1;
QList<int> list2;
public:
myClass();
//~MyClass(); //do I even need this?
bool add(int i);
};
myClass.cpp
myClass::myClass()
{
var1 = 50;
QList<int> list1;
QList<int> list2 ({0,10,20,30,40,50});
}
bool myClass::add(int i){
qDebug() << "list1 before:";
list1.append(i);
qDebug() << "list1 after:";
qDebug() << list1;
qDebug() << "number of elements in list1:";
qDebug() << list1.count();
qDebug() << "print all list2 elements";
qDebug() << list2;
qDebug() << "var1 value:";
qDebug() << var1;
if (list1.count() < 2){
return false;
} else {
return true;
}
}
MyApp.cpp中
<....snip....>
void myApp::keyPressEvent(QKeyEvent* e)
{
myClass keystroke;
if (!keystroke.add(e->key())){
qDebug() << "FALSE!!!";
} else {
qDebug() << "TRUE!!!";
}
<....snip....>
基本上,这里发生的是myApp.cpp
,我正在创建一个类型myClass
的新对象,它监听任何键盘事件,然后获取该键的数值并将其传递给myClass
成员函数add
。
一旦值在myClass::add
中,它就会附加到QList
构造函数中初始化的成员变量myClass::myClass
。我在其中有一些qDebug()
行,在点击a
键时打印以下内容:
list1 before:
()
list1 after:
(65)
number of elements in list1:
1
print all list2 elements
()
var1 value:
50
FALSE!!!
这是第一个问题。 a
的按键值似乎恢复正常,并且在打印附加到{(65)
的{{1}}的元素时显示为QList
。我们还可以看到list
的大小现在为QList
。大。由于大小不大于2,因此返回false。
理想情况下,当我点击另一个键(例如1
键)时,b
的键按值将附加到b
。因此,如果我再次打印QList
的元素,则应该返回list1
。但事实并非如此。这是打印的内容:
(65, 66)
就像list1 before:
()
list1 after:
(66)
number of elements in list1:
1
print all list2 elements
()
var1 value:
50
FALSE!!!
list1
重置自身并且不会保留第一次按键。这是为什么?我没有正确传递变量吗?
我通过初始化名为QList
的常量QList
来进一步测试。我尝试打印list2
的所有元素,但正如您在上面看到的那样,它只返回QList
,这意味着它是一个空列表。我认为我应该看到它与()
这让我相信我没有正确传递变量。我读到了通过引用传递变量,因此没有制作变量的副本(我认为这可能发生在这里),但我该如何正确地做到这一点?
另外,另一个奇怪的事情是,如果我打印(0, 10, 20, 30, 40, 50)
变量,它会回复var1
就好了。
任何帮助将不胜感激。
答案 0 :(得分:1)
标记的代码
void myApp::keyPressEvent(QKeyEvent* e)
{
myClass keystroke; // <<=============== HERE
if (!keystroke.add(e->key())){
表示您在每次按键时都会创建一个新的myClass
实例。
您应该将类实例存储为窗口小部件的成员,以便它可以在击键之间保持活动状态。
另请注意,正如评论中所述,您的构造函数
myClass::myClass()
{
var1 = 50;
QList<int> list1;
QList<int> list2 ({0,10,20,30,40,50});
}
没有初始化成员,只是声明了两个名为list1
和list2
的局部变量。要初始化成员,语法为:
myClass::myClass()
: var1(50), list2({0,10,20,30,40,50})
{
}