2017-04-03 121 views
-2

我正在爲我的學位項目工作,並且我遇到了GUI問題。Qt:setGeometry不在應用程序的調整中調整大小

我已經測試了不同部件在獨立項目上的位置以簡化我嘗試的代碼。

這是我的問題: 我創建了一個超載的resizeEvent來調整我的所有小部件。它工作的很好,除了一件事:

在我的測試程序啓動後,窗口小部件尺寸不是很大,我需要手動調整窗口大小來強制重新調整窗口大小,即使setGeometry調用位於構造函數就像下面的代碼一樣。

.H

MainWindow.h 
------------- 
#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QPushButton> 
#include <QGridLayout> 
#include <QGroupBox> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    void resizeEvent (QResizeEvent * event); 

private: 
    Ui::MainWindow *ui; 

    QGroupBox *g1; 
    QGroupBox *g2; 
    QPushButton *but2; 
    QGridLayout *lay; 
}; 

#endif // MAINWINDOW_H 

的.cpp

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

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    this->lay = new QGridLayout(); 
    this->g1 = new QGroupBox("g1"); 
    this->g2 = new QGroupBox("g2"); 
    this->but2 = new QPushButton("But2"); 
    this->lay->addWidget(g1, 0, 0, 1, 1); 
    this->lay->addWidget(but2, 0, 1, 1, 1); 
    this->lay->addWidget(g2, 1, 0, 1, 2); 
    this->g1->setBaseSize(60, 60); 
    this->g2->setBaseSize(60, 60); 

    this->ui->centralWidget->setLayout(lay); 
    this->ui->centralWidget->setMinimumSize(100, 100); 

    this->but1->setHidden(true); 

    this->g1->setGeometry(5, 1, (this->ui->centralWidget->width())55, (this->ui->centralWidget->height())-83); 
    this->but2->setGeometry(this->g1->width()+10 , 6, 40, (this->ui->centralWidget->height())-88); 
    this->g2->setGeometry(5, this->g1->height()+5, (this->ui->centralWidget->width())-10, 70); 
} 

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

void MainWindow::resizeEvent (QResizeEvent * event) 
{ 
    this->g1->setGeometry(5, 1, (this->ui->centralWidget->width())-55, (this->ui->centralWidget->height())-89); 
    this->but2->setGeometry(this->g1->width()+10 , 6, 40, (this->ui->centralWidget->height())-88); 
    this->g2->setGeometry(5, this->g1->height()+5, (this->ui->centralWidget->width())-10, 70); 
} 

我試圖找到一個解決方案,以使窗口小部件以及從一開始就大小

UPDATE這裏有兩張圖片:

之前調整

before resize

調整後

after resize

的問題是,當裏面有什麼,該QGroupBox只取按鈕的大小,在它旁邊,我希望它從一開始就更大

+1

我強烈建議不要覆蓋'resizeEvent',在整個大型項目中看到這一點,並導致各種問題。相反,嘗試通過佈局和間隔條來完成所需的外觀,這通常是可能的,並且最終更平滑。如果您將包含初始和期望外觀的屏幕截圖,那麼也可以有人幫助您。 – Bowdzone

+0

我同意,但我不認爲這裏的問題是resizeevent,因爲它調整我的窗口時,它工作得很好。我已經覆蓋了它,因爲我的不同佈局的大小取決於它們中哪些隱藏或可見。我在這裏遇到的問題是,在啓動應用程序時,即使它是構造函數的結尾,setGeometry也不會執行。我試圖在窗口中爲QCoreApplication :: processEvent或widget.update添加一些行,但沒有任何反應。 –

+0

是的,但它仍然是一個XY問題。小部件的幾何形狀取決於其他小部件,這意味着在我可以想到調整大小之前,所有東西都必須繪製一次。所以我會找到另一種解決方法,讓你不必頭疼。 – Bowdzone

回答

0

而不是setGeometry你應該對於其他部件時添加小部件佈局(也許在resizeEvent()也行),喜歡...

int col = 0, row = 0; 
int stretch = 100 * (this->ui->centralWidget->width()-55.0)/this->ui->centralWidget->width(); 
this->lay->setColumnStretch(col, stretch); 
stretch = 100 * (this->ui->centralWidget->height())-89.0)/this->ui->centralWidget->height(); 
this->lay->setRowStretch(row, stretch); 

同樣的方式LD使用拉伸因素。

相關問題