2012-09-24 45 views
4

我正在使用配置QDialog。它有幾個類別(常規,外觀等),當用戶點擊它們時會加載。每個類別都有自己的頁面。這些頁面是各自獨立的類(每個類都有自己的ui,cpp和h)。當Preferences窗口加載時,頁面被實例化並加載到QStackedWidget中。然後將Stackedwidget放置到QScrollArea中,以便可以根據需要進行滾動。擺脫QScrollArea中不必要的滾動條

但是,有一個問題。自從我加入QStackedWidget中,QScrollArea 總是具有即使在當前頁面足夠短並不需要一個垂直滾動條:(圖爲最短頁)

Config scrollbar problem

的ScrollArea垂直滾動政策被設置爲Qt :: ScrollBarAsNeeded,因此如果頁面大於可視區域,它應該只顯示一個條。

這是我已經嘗試過解決這個問題:

  1. 設置的滾動策略Qt的:: ScrollBarAlwaysOff。雖然這擺脫了滾動條,但它不能讓人接受,因爲它不讓用戶知道他們需要在長頁面上滾動。

  2. 設置QStackedwidget的最小/最大高度。如果我將它設置爲足夠低的值,這會使滾動條消失,但這是不可接受的,因爲它會導致某些小部件出現擠壓現象。

我知道問題有事情做與QStackedWidget但因爲這是我第一次用QStackedWidget我不知道它是什麼。我也注意到卷軸總是相同的數量;即無論頁面小部件多大/多小,可滾動區域總是相同大小。出於某種原因,它比最長的頁面稍大。起初,我認爲我在每頁底部放置的垂直隔離片會加大布局,導致這種情況,但是將它們取出不能解決問題。

更新:下面是控制Stackedwidget代碼:

void Newconfig::on_Categories_currentItemChanged(QTreeWidgetItem *current) 
{ 

    QModelIndex index=ui->Categories->currentIndex(); 
    int idx=index.row(); 

    QString category=current->text(0); 

    this->setWindowTitle("Preferences -- " + category); 

    if (stack->currentWidget() != 0) { 
     stack->currentWidget()->setSizePolicy(QSizePolicy::Ignored, 
                QSizePolicy::Ignored); 
    } 
    stack->setCurrentIndex(idx); 
    stack->currentWidget()->setSizePolicy(QSizePolicy::Expanding, 
               QSizePolicy::Expanding); 
    adjustSize(); 

} 

回答

5

QStackedWidget需要添加到它的最大窗口小部件的大小。在您的情況下,您的首選項對話框中的最大頁面是什麼影響QStackedWidget的大小,並因此迫使滾動區域顯示其滾動條,即使它看起來不必要。

要解決這個問題,您更改,設置你離開到QSizePolicy::Ignored頁面的大小政策,你對這個頁面的大小政策QStackedWidget當前小部件之前,您可以創建一個正確的觸發插槽展示給你想要的那個頁面 - 例如QSizePolicy::Expanding。這種技術的一個例子詳見this page。有很多的示例代碼,但重要的部分是在這裏:

void changeCurrent(int idx) 
{ 
    if (stackWidget->currentWidget() !=0) { 
     stackWidget->currentWidget()->setSizePolicy(QSizePolicy::Ignored, 
                QSizePolicy::Ignored); 
    } 
    stackWidget->setCurrentIndex(idx); 
    stackWidget->currentWidget()->setSizePolicy(QSizePolicy::Expanding, 
               QSizePolicy::Expanding); 
    adjustSize(); 
} 

調用此函數改變對QStackedWidget當前索引。它會導致剛剛查看的頁面的大小策略對QStackedWidget的整體大小以及即將被視爲具有後果大小策略的頁面沒有影響。

+0

我已經有時間來實現這一點。它的工作原理,但仍然存在問題。通常情況下,只有點擊了幾個不需要滾動條的項目,修正纔會啓動。 –

+0

@WillKraft這可能是因爲您可能必須初始化堆疊窗口小部件中的所有窗口小部件,以便在首次放置堆疊窗口小部件時擁有「忽略大小」策略(除了最初可見的窗口)。 –