我想在整个程序中访问桌面宽度和高度的常量/变量。
我是这样做的 - 将此代码添加到我程序的每个.h文件中,然后正常使用。
#include <QDesktopWidget>
QDesktopWidget desktop;
int desktopHeight = desktop.geometry().height();
int desktopWidth = desktop.geometry().width();
我知道这不是一个好方法。我尝试制作一个特殊的desktopSize.h
,然后包括我的程序的必需部分。但我没有成功。
头文件应该是什么,就像我需要的那样?
答案 0 :(得分:1)
您真的不想使用该特定方法并在所有翻译单元中包含该代码。如果你做了,每个人都会包含两个名为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
}
答案 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
中,您只需调用信号并使用返回的值,即可访问getWidth
中desktopInformation
位置返回的值。
请注意,这两个对象应该在同一个线程中才能使用。如果它们位于不同的线程中,则连接类型应为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();
...
};