如何在QList中存储全局数据

时间:2014-09-16 07:01:52

标签: qt qlist

您能解释一下存储具有全局访问权限的程序数据的方法吗?

我找到了这些关键字:
- 使用静态类来存储数据
- 按值传递QList - 通过引用传递Qlist
- 使用朋友'关键字

但我找不到存储全局QList的任何真实示例,正如他们所说,使用全局变量是一个糟糕的设计。还有人提到,由于隐式共享(?),使用QList上的指针是一个坏主意。

那么我应该在哪里存储我的Qlist,以便从另一个.cpp的其他类中访问它?所以我有:

mainwindow.h

QList <SceneCard> sceneList;
QString mTitle;

public slots:
QString setValue()
    {
       return mTitle;
    }

mainwindow.cpp

MainWindow::AddScene()
{
    sceneCard = new SceneCard(sNumber);
    sceneList.append(sceneCard);
    mTitle = "Nejat is right!"

}

void MainWindow::showSceneCard()
{
    SceneDialog D;
    connect(D,SIGNAL(getValue()),this,SLOT(setValue()));
    D.exec();
}

scenedialog.h

#ifndef SCENEDIALOG_H
#define SCENEDIALOG_H

#include <QDialog>
#include <QList>

namespace Ui {
class SceneDialog;
}

class SceneDialog : public QDialog
{
    Q_OBJECT

public:
    SceneDialog(QWidget *parent = 0);
    ~SceneDialog();

signals:
    QString getValue();

private:
    Ui::SceneDialog *ui;
    QString myText;
};

scenedialog.cpp

#include "scenedialog.h"
#include "ui_scenedialog.h"
#include <QDebug>

SceneDialog::SceneDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::SceneDialog)
{
    ui->setupUi(this);

    myText = getValue();
    qDebug() << myText; // myText is empty!!

}

1 个答案:

答案 0 :(得分:1)

您可以将列表作为类成员,并使用Qt的Signal / slot机制从其他类访问列表。只需在目标类中发出一个信号,将其连接到包含列表的类中的插槽,并在类的两个对象之间建立连接。这样,您可以通过将信号连接到返回该值的插槽并仅发出信号并获取返回值来访问其他类的任何数据成员。

例如,如果你有两个类,如:

class A: public QObject
{
Q_OBJECT
public:
    A(QObject *parent = 0);
    ~A();

signals:
      int getValue();

private:

      void someFunction()
      {
           int val = getValue();
      }
};

class B 
{
Q_OBJECT
public:
    B(QObject *parent = 0);
    ~B();

public slots:

      int getValue()
      {
           return someValue;
      }
};

将来自A对象的信号连接到B对象中的插槽:

connect(a, SIGNAL(getValue()), b, SLOT(getValue()));

在课程A中,您只需调用信号并使用返回的值,即可访问getValueB位置返回的值。

请注意,这两个对象应该在同一个线程中才能使用。如果它们位于不同的线程中,则连接类型应为Qt::BlockingQueuedConnection类型:

connect(a, SIGNAL(getValue()), b, SLOT(getValue()), Qt::BlockingQueuedConnection);

另一种方法是两个使用静态类成员但不推荐使用它,除非你有充分的理由这样做。如果您有两个类,如:

class A {
   public:
      static QList<int> list;
};

class B {
   public:
      void do_something();
};

您可以从B访问A的静态数据成员:

void B::do_something()
{
     int val = A::list[0];
     ...
};