2016-04-30 13 views
1

コンピュータ全体がそのタスクに専念するため、アプリケーションを最大化したいので、標準show()ではなく、その要件を満たすshowMaximized()関数が見つかりました。問題は、私のウィジェットが結果的に有用なアプリケーションウィンドウのサイズに比例するようにして、将来アプリケーションの一部に触れずにハードウェアやウィンドウマネージャを変更できるようにすることです。Qtでは、画面のサイズを決める方法は?

私が自分で見つけた最良の方法は次のとおりですが、通常は動作する競合状態に依存しますが、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() 
{ 
} 

私もそれをやっての少ないルーブ・ゴールドバーグの道に開いています。これは私にはちょっと面倒ですが、私の現在の知識でそれを得ることができると思うほどコンパクトです。

(シングルトンアーキテクチャは、プロジェクトの別の部分のためです。)

+1

['QScreen'](http://doc.qt.io/qt-5/qscreen.html)? – skypjack

+0

@skypjack:どうやって使うの?公式のドキュメント(http://doc.qt.io/qt-5/qscreen.html)にはコンストラクタはリストアップされておらず、デストラクタのみがリストされています。Qt Creatorは、インスタンスが必要であり、コンストラクタがプライベートであると言います。私はそれがシングルトンであるという兆候も見ていない。 – AaronD

+1

['QGuiApplication :: screens'](http://doc.qt.io/qt-5/qguiapplication.html#screens)メンバーメソッドは見たことがありますか?また、['QGuiApplication :: primaryScreen'](http://doc.qt.io/qt-5/qguiapplication.html#primaryScreen-prop)も興味深いようです。 – skypjack

答えて

2

あなたはDesktopWidgetを使用して、画面の形状とサイズを取得することができます。

+0

素晴らしい!今私はResizeFilterを取り除くことができますが、このアプリではまったく何もしません。それはいくつかの混乱を減らすでしょう! :-) – AaronD

関連する問題