【问题标题】:In Qt, how to determine the size of the screen?在Qt中,如何确定屏幕的大小?
【发布时间】:2016-05-01 04:43:59
【问题描述】:

我希望我的应用程序以最大化的方式启动,因为整个计算机将专用于该任务,因此我找到了满足该要求的 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()
{
}

我也愿意采用不那么鲁布戈德堡的方式来做这件事。这对我来说看起来有点乱,但它是我认为以我目前的知识可以得到的一样紧凑。

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

【问题讨论】:

  • @skypjack:应该如何使用?官方文档(doc.qt.io/qt-5/qscreen.html)没有列出构造函数,只列出了析构函数,Qt Creator 说我需要一个实例并且构造函数是私有的。我也没有看到任何迹象表明它是单身人士。
  • 你见过QGuiApplication::screens成员方法吗? QGuiApplication::primaryScreen 听起来也很有趣。
  • @skypjack:直到现在我才知道。这样可行。 DesktopWidget 的文档描述了一种类似的获取方法,使用 QApplication 类,但 QScreen 的文档没有。一旦正确使用,两条路径似乎都会给出相同的结果,但对于这个特定项目,我更喜欢 DesktopWidget 的参数。不管怎么说,还是要谢谢你。 +1 了

标签: c++ qt fullscreen


【解决方案1】:

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

【讨论】:

  • 太棒了!现在我可以摆脱在这个应用程序中完全没有其他功能的 ResizeFilter。这将减少一些混乱! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
相关资源
最近更新 更多