在Qt中,如何确定屏幕的大小



我希望我的应用程序开始最大化,因为整个计算机都将专用于该任务,所以我找到了满足该要求的showMaximized()函数,而不是标准的show()。问题是,我希望我的小部件与应用程序窗口的有用大小成比例,这样我们就可以在未来的某个时候更改硬件或窗口管理器,而不必接触应用程序。

我自己找到的最好的方法如下,但它依赖于一种通常有效的竞赛条件,但有时会导致整个UI被挤在左上角。重新启动应用程序可以修复它,但我不想告诉非技术用户这样做。

main.h:

#ifndef MAIN_H
#define MAIN_H
#include <QtWidgets>

class ResizeFilter : public QObject
{
    Q_OBJECT
public:
    ResizeFilter();
protected:
    bool eventFilter(QObject* obj, QEvent* event);
signals:
    void ResizeEvent(QSize size);
};

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    static MainWindow* GetInstance();
private:
    static MainWindow* singleton;
    MainWindow();
    ~MainWindow();
    ResizeFilter* filter;
private slots:
    void FinishInit(QSize size);
};

#endif // MAIN_H

main.cpp:

#include "main.h"
#include <QApplication>
int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    MainWindow::GetInstance();
    return app.exec();
}

ResizeFilter::ResizeFilter()
    : QObject()
{
}
bool ResizeFilter::eventFilter(QObject* obj, QEvent* event)
{
    if(event->type() == QEvent::Resize)
    {
        QResizeEvent* resizeEv = static_cast<QResizeEvent*>(event);
        emit ResizeEvent(resizeEv->size());
    }
    return QObject::eventFilter(obj, event);
}

MainWindow* MainWindow::singleton = 0;
MainWindow* MainWindow::GetInstance()
{
    if(singleton == 0)
    {
        singleton = new MainWindow();
    }
    return singleton;
}
MainWindow::MainWindow()
    : QMainWindow(0)
{
    filter = new ResizeFilter();
    installEventFilter(filter);
    showMaximized();    //do this before connecting so we miss the first resize event (wrong size) and catch the second (right size)
    connect(filter, SIGNAL(ResizeEvent(QSize)), this, SLOT(FinishInit(QSize)));
}
void MainWindow::FinishInit(QSize size)
{
    disconnect(filter, SIGNAL(ResizeEvent(QSize)), this, SLOT(FinishInit(QSize)));
    delete filter;
    filter = 0;
    //build widgets based on size argument
}
MainWindow::~MainWindow()
{
}

我也对一种不那么粗鲁的戈德堡方式持开放态度。这在我看来有点乱,但它是我认为用我目前的知识可以做到的最紧凑的方式。

(singleton架构用于项目的另一部分。)

您可以使用DesktopWidget获取屏幕的几何图形和大小。

最新更新