如何在整个程序中使常量或变量可访问

时间:2014-12-29 22:21:46

标签: c++ qt global-variables

我想在整个程序中访问桌面宽度和高度的常量/变量。

我是这样做的 - 将此代码添加到我程序的每个.h文件中,然后正常使用。

#include <QDesktopWidget>  
QDesktopWidget desktop;
int desktopHeight = desktop.geometry().height();
int desktopWidth = desktop.geometry().width();

我知道这不是一个好方法。我尝试制作一个特殊的desktopSize.h,然后包括我的程序的必需部分。但我没有成功。

头文件应该是什么,就像我需要的那样?

2 个答案:

答案 0 :(得分:1)

您真的不想使用该特定方法并在所有翻译单元中包含该代码。如果你做了,每个人都会包含两个名为desktopWidthdesktopHeight的变量,在链接时会导致重复的符号错误。如果在应用程序启动后桌面大小发生变化,它也会很难管理更新它们。如果您确实想要提供包含桌面大小的全局变量,则应将它们放在单个.cpp文件中,并将extern声明放在需要时包含的单个头文件中。

标头文件(GlobalDesktopInfo.h

#ifndef GLOBALDESKTOPINFO_H
#define GLOBALDESKTOPINFO_H

extern int desktopHeight;
extern int desktopWidth;

#endif GLOBALDESKTOPINFO_H

源文件(GlobalDesktopInfo.cpp

#include "GlobalDesktopInfo.h"
int desktopHeight = 0;
int desktopWidth = 0;

您还需要在合理可能的早期点对其进行初始化。我建议你在main()函数中执行此操作。

#include "GlobalDesktopInfo.h"
// other includes

int main()
{
    QApplication app;

    QDesktopWidget desktop;
    desktopHeight = desktop.geometry().height();
    desktopWidth = desktop.geometry().width();

    // other code and initialization
}

答案 1 :(得分:1)

我认为在类中有一些返回所需值的插槽并使用Qt的信号/插槽机制从其他类访问它们会更好。

只需在目标类中发出信号,将其连接到包含插槽的类中的插槽,并在类的两个对象之间建立连接。通过这种方式,您可以通过将信号连接到返回该值的插槽并仅发出信号并获取返回值来访问您喜欢的每个类。

例如,你可以拥有一个类:

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

    QDesktopWidget desktop;

public slots:

      int getWidth()
      {
           return desktop.geometry().width();
      }
      int getHeight()
      {
           return desktop.geometry().height();
      }
};

从以下任何其他类访问桌面信息:

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

signals:
      int getWidth();
      int getHeight();

private:

      void someFunction()
      {
           int width = getWidth();
           int heigth = getHeight();
           ...
      }
};

将来自SomeClass对象的信号连接到DesktopInformation对象中的插槽:

connect(someClass, SIGNAL(getWidth()), desktopInformation, SLOT(getWidth()));

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

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

connect(someClass, SIGNAL(getWidth()), desktopInformation, SLOT(getWidth()), Qt::BlockingQueuedConnection);

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

class desktopInformation {
   public:
      static QDesktopWidget desktop;

      static int getWidth()
      {
           return desktop.geometry().width();
      }
      static int getHeight()
      {
           return desktop.geometry().height();
      }
};

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

您可以从desktopInformation访问someClass的静态成员函数,如下所示:

void someClass::do_something()
{
     int width = A::getWidth();
     ...
};