2017-02-17 13 views
2

QMdiAreaのサブウィンドウを垂直に配置しようとしています。私はオンラインでたくさんの例を見て、私はここでやっているのと同じことをしていました。QMdiAreaが間違った高さと幅を返す

私は2つのテキストエディットを持っています。これは、画面の半分を覆うように縦に並べる必要があります。したがって、MainWindowのコンストラクタでは、2つのtextEditsをsubWindowとしてqMdiAreaに追加し、qMdiAreaの高さと幅を求め、高さを2で割り、サブウィンドウのサイズを変更します。以下のコードをご覧ください。

マイmainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    this->showMaximized(); 
    qMdiArea = new QMdiArea(); 
    qTextEdit1 = new QTextEdit(); 
    qTextEdit2 = new QTextEdit(); 
    setCentralWidget(qMdiArea); 

    qMdiArea->adjustSize(); 
    qMdiArea->addSubWindow(qTextEdit1); 
    qMdiArea->addSubWindow(qTextEdit2); 

    QPoint position(0, 0); 
    foreach (QMdiSubWindow *window, qMdiArea->subWindowList()) 
    { 
     QRect rect(0, 0, qMdiArea->width(), qMdiArea->height()/qMdiArea->subWindowList().count()); 
     window->setGeometry(rect); 
     window->move(position); 
     position.setY(position.y() + window->height()); 
    } 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

マイwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QMdiArea> 
#include <QTextEdit> 
#include <QPoint> 
#include <QMdiSubWindow> 
#include <QRect> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    Ui::MainWindow *ui; 
    QMdiArea *qMdiArea; 
    QTextEdit *qTextEdit1; 
    QTextEdit *qTextEdit2; 
}; 

#endif // MAINWINDOW_H 

と私のメインファイル:

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

しかし、期待通りのが起きていません。ウィンドウは、垂直にタイル表示されていますが、画面の一部を占めるだけです。私の画面解像度が1920×1200のmdiArea

enter image description here

答えて

2

height()width()あるウィジェットはまだ示さ/さらされていないので、その段階では無効です。 show()を呼び出すと、ウィジェットの表示がスケジュールされるだけです。そのウィジェットをサイズ変更して画面に表示する動作は、コントロールがイベントループに戻ったときに後で発生します。

解決策として、resizeEventハンドラを上書きすることができます。あなたがしたら、あなたのプロジェクトが再び動作します:mainwindow.hで

定義:

virtual void resizeEvent(QResizeEvent *ev) override; 

をmainwindow.cppでの実装:

void MainWindow::resizeEvent(QResizeEvent *ev) 
{ 
    Q_UNUSED(ev) 

    QPoint position(0, 0); 
    foreach (QMdiSubWindow *window, qMdiArea->subWindowList()) 
    { 
     QRect rect(0, 0, qMdiArea->contentsRect().width(), qMdiArea->contentsRect().height()/qMdiArea->subWindowList().count()); 
     window->setGeometry(rect); 
     window->move(position); 
     position.setY(position.y() + window->height()); 
    } 
} 

また、あなたが本当に必要としないようですMainWindowのコンストラクタ内でthis->showMaximized();を呼び出します。たとえば、main.cppから呼び出すことができます。

+0

ありがとうございます。私はなぜ高さと幅を得ることができないのか、本当に苦労していました。 –

関連する問題