2012-03-18 38 views
6

私はCentralWidgetを一定のサイズにしたいと思っています。 mainWindowを中央のウィジェットに合わせてサイズを変更するには、どうすればよいですか?ここで動作しないコード:Qt:centralwidgetのサイズを変更するとmainWindowのサイズを自動的に変更する方法は?

int main (int argc, char **argv) { 
    QApplication app(argc, argv); 

    QGLFormat glFormat; 
    glFormat.setVersion(4,2); 
    glFormat.setProfile(QGLFormat::CompatibilityProfile); 

    QGLWidget* render_qglwidget = new MyWidget(glFormat); 

    QGLContext* glContext = (QGLContext *) render_qglwidget->context(); 
    glContext->makeCurrent(); 


    QMainWindow* mainWindow = new MyMainWindow(); 
    render_qglwidget->resize(720, 486); 
    mainWindow->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding)); 
    mainWindow->setCentralWidget(render_qglwidget); 

    render_qglwidget->resize(720, 486); 

    mainWindow->show(); 

    return app.exec(); 
} 

開いているウィンドウは非常に小さくなります。

は、私もそれのサイズを変更します

mainWindow->resize(720, 486); 

とcentralwidgetを使用してメインウィンドウのサイズを設定することができます。 mainWindowのツールバーも486ピクセル内にあるので、中央のウィジェットはわずかに押しつぶされます。

mainWindowのサイズを自動的に変更する方法はありますか?

答えて

0

セントラルウィジェットのサイズを設定します。次にメインウィンドウのサイズヒントを取得し、それをサイズに設定します。

(sizeHint()、setFixedSize())。

+0

ありがとうございました。 mainWindow-> setFixedSize(hint.width()、hint.height())を追加すると、何らかの理由でウィンドウが開かない – Mat

+0

@Mats 'setCentralWidget'の後に' mainWindow-> setFixedSize(ヒント) 'を設定しましたか? – alexisdm

+0

はい - 1. mainWindow-> setCentralWidget、2. centralWidget-> resize()、3. mainwindow-> setFixedSize(ヒント)、4.mainWindow-> show()。 3.ステップは、ウィンドウが表示されないようにします(ステップ3をコメントアウトすると表示されます) – Mat

0

セントラルウィジェットに基づいてQMainWindowのサイズを設定することはできません。それはいつも別の方法です。

あなたが言ったように、QMainWindow::resize()を使用し、ツールバーとステータスバーの高さを中央のウィジェットに追加して最終結果を得ます。

ツールバーとステータスバーの高さが正確になるように、「遅延初期化」(つまり、QTimerのタイムアウトが0の場合)にもサイズを変更してください。

ユーザーがメインウィンドウを開けないようにするには、QMainWindow::setWindowFlags(Qt::FramelessWindowHint)を使用してマウスをドラッグしてサイズ変更を無効にします。

+0

thx。 setWindowFlags(Qt :: FramelessWindowHint)を置くと、マウスでサイズを変更できませんが、ウィンドウのarroundも移動できません。私はマウスによるサイズ変更を禁止したいが、ウィンドウのarroundを動かすことができる。どうやってするか? – Mat

1

あなたは中央のウィジェットのサイズが変更されるたびに自動的にウィンドウのサイズを変更するQMainWindow::event()を再実装することができます

bool MyMainWindow::event(QEvent *ev) { 
    if(ev->type() == QEvent::LayoutRequest) { 
     setFixedSize(sizeHint()); 
    } 
    return result = QMainWindow::event(ev); 
} 

あなたはまた、代わりにちょうどresize()の中心ウィジェットのsetFixedSize()を使用する必要があります。後者は、ウィジェットがレイアウト内に配置されている場合(ここではQMainWindowLayout)、ほとんど役に立ちません。

+0

これにより、メインウィンドウが少し瞬時にポップアップして即座に閉じるようになります。 – Mat

+0

@Mat私はsetFixedSizeを使って自分の答えを編集しました。 – alexisdm

0

同様の問題を解決するために、次のコードを使用しました。私は明示的に私のメインウィンドウのサイズを変更して中央のウィジェットが一定の大きさになるようにしたかったのです。

def centralWidgetResize(self, x, y): 
    # If the window is not visible, it doesn't keep its layout up to date, so force it. 
    if not self.isVisible(): 
     self.layout().update() 
    # Does nothing if the layout is already up to date (and the window is visible). 
    self.layout().activate() 
    size = self.size() 
    childsize = self.centralWidget().size() 
    dx = size.width() - childsize.width() 
    dy = size.height() - childsize.height() 
    self.resize(x + dx, y + dy) 

これはPythonですが、C++コードは簡単な翻訳である必要があります。奇妙なツールバーの配置や複数のツールバーでも機能します。実際にサイズを更新するのは、ウィンドウが表示されているときにのみ発生し、直ちにウィンドウが必要な場合には別のウィンドウが表示されます。layout().update(); layout().activate()

関連する問題