【问题标题】:How to store global data in QList如何在 QList 中存储全局数据
【发布时间】:2014-09-16 07:01:52
【问题描述】:

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

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

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

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

主窗口.h

QList <SceneCard> sceneList;
QString mTitle;

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

主窗口.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!!

}

【问题讨论】:

  • 你应该熟悉单例conecpt。创建一个包含 QList 成员的单例类。有关此模式的更多信息,请参阅 en.wikipedia.org/wiki/Singleton_pattern
  • “商店”是什么意思?有一个返回列表的成员函数会达成交易吗?用列表发送信号也不行?
  • 'Store' 意味着我需要从不同的 .cpp 文件中读取/写入此 QList。列表应该可以全局访问。
  • 好吧,也许我应该重新表述:我在主窗口中有可视节点,并调用对话框来编辑它们的属性。然后我应该将所有节点的属性传递给另一个 QWidgetTab
  • 因此将所需的数据传递给您的对话框,当对话框通过接受它关闭时,从对话框中获取新数据。我不明白你为什么需要一个全局的QList

标签: qt qlist


【解决方案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 类中,您可以通过调用信号并使用返回值来访问从B 中的getValue 槽返回的值。

请注意,这两个对象应该在同一个线程中才能工作。如果它们在不同的线程中,则连接类型应为 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];
     ...
};

【讨论】:

  • 呃..谢谢!所以它只是:'class myList:public QList {}'?
  • @DensiTensy 你可能不想继承QList
  • @DensiTensy 你是如何从你应该继承 QList 的答案中得出结论的?!
  • @Nejat 我是菜鸟!所以我把“类成员”误认为是子类化。那么 A 类中的 list 是类成员?
  • 是的。它是一个静态类成员,可以通过类名前缀来全局访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多