2012-09-24 46 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这可能是因为您可能必须初始化堆叠窗口小部件中的所有窗口小部件,以便在首次放置堆叠窗口小部件时拥有“忽略大小”策略(除了最初可见的窗口)。 –