c++ - 通过引用成员函数传递成员变量(QList)?

标签 c++ qt

我有一个应用程序,其目的是获取按键值并将其放入 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 中,它就会附加到在 myClass::myClass 中初始化的成员变量 QList > 构造函数。我有一些 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 重置自己并且不保留第一次按键。这是为什么?我没有正确传递变量吗?

我通过初始化名为 list2 的常量 QList 进一步测试了这一点。我尝试打印 QList 的所有元素,但正如您在上面看到的,它只是返回 (),这意味着它是一个空列表。我想我应该看到它返回 (0, 10, 20, 30, 40, 50)

这让我相信我没有正确传递变量。我阅读了有关通过引用传递变量的内容,这样就不会创建变量的拷贝(我认为这可能会发生在这里),但我该如何正确地做到这一点?

此外,另一个奇怪的事情是,如果我打印 var1 变量,它会返回 50 就好了。

如有任何帮助,我们将不胜感激。

最佳答案

标记的代码

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});
}

不是初始化成员,而是简单地声明两个名为 list1list2 的局部变量。初始化成员的语法是:

myClass::myClass()
  : var1(50), list2({0,10,20,30,40,50})
{
}

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

相关文章:

c++ - 如何使这个 C++ 对象不可复制?

c++ - 如何将过程/函数值获取到最终程序中?

c++ - 哪个更好 : A unique_ptr to a 2D array or a 2D array of unique_ptrs?

c++ - Borland C++ 版本 0.7 是否仍然可用?

multithreading - 为什么信号/槽不适用于多线程?

c++ - 如何在 QGraphicsItem 上接收手势事件?

c++ - C++ 中的动态绑定(bind)示例

qt - 去除 QComboBox listView 阴影效果

c++ - 使用 QToolBox,哪个设置可以让页面只有它的内容大小?

windows - 在 QT 程序中全局强制 QFileDialog::DontUseNativeDialog