我有一个应用程序,其目的是获取按键值并将其放入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)元素(QList)时显示为list。我们还可以看到QList的大小现在是1。大。由于大小不大于2,因此返回false。

理想情况下,当我按下另一个键(例如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变量,它将随50一起返回就好了。

任何帮助,将不胜感激。

最佳答案

标记的代码

void myApp::keyPressEvent(QKeyEvent* e)
{
   myClass keystroke;  // <<=============== HERE
   if (!keystroke.add(e->key())){

表示您在每次按键时都在创建一个新的myClass实例。

相反,您应该将类​​实例存储为小部件的成员,以便在击键之间保持 Activity 状态。

还要注意,正如注释中所告诉的那样,您的构造函数
myClass::myClass()
{
  var1 = 50;
  QList<int> list1;
  QList<int> list2 ({0,10,20,30,40,50});
}

不会初始化成员,而只是声明两个名为list1list2的局部变量。要初始化成员,语法为:
myClass::myClass()
  : var1(50), list2({0,10,20,30,40,50})
{
}

关于c++ - 通过引用成员函数传递成员变量(QList)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35251186/

10-12 16:16