我想访问整个程序中桌面宽度和高度的常量/变量。
这就是我的做法 - 将此代码添加到我的程序的每个 .h 文件中,然后正常使用它。
#include <QDesktopWidget>
QDesktopWidget desktop;
int desktopHeight = desktop.geometry().height();
int desktopWidth = desktop.geometry().width();
我知道这不是一个好方法。我试图制作一个特殊的desktopSize.h
,然后包含在我的程序的必需部分。但我没有成功。
我需要的像这样的头文件中应该有什么?
您确实不想使用这种特定方法并将该代码包含在所有翻译单元中。如果这样做,每个变量都将包含两个名为 desktopWidth
和 desktopHeight
的变量,导致链接期间出现重复符号错误。如果在应用程序启动后桌面的大小发生变化,这也会使管理更新它们变得困难。如果您确实想提供保存桌面大小的全局变量,则应将它们放在单个.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
}
我认为最好在一个类中有一些插槽来返回所需的值,并使用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
中,您只需调用信号并使用返回的值即可访问从desktopInformation
getWidth
槽返回的值。
请注意,这两个对象应位于同一线程中才能正常工作。如果它们在不同的线程中,则连接类型应为 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();
};
您可以从someClass
访问desktopInformation
的静态成员函数,如下所示:
void someClass::do_something()
{
int width = A::getWidth();
...
};