2009-10-20 56 views
5

我希望能夠阻止用戶在運行時移動QSplitter。調用setEnabled(false)這樣做,但它也禁用所有子窗口小部件 - 這不是我想要的。有沒有辦法做到這一點?我必須禁用拆分器,然後手動重新啓用所有子部件嗎?這看起來相當麻煩,對於某些必須是合理常見的做法。Qt分離器禁用

任何人都可以提出任何建議嗎?

回答

1

實際上,我從來沒有見過任何人禁用分離器:他們在那裏,所以用戶可以根據需要佈置UI,那麼爲什麼有人想禁用它?無論您需要分配器還是您可以使用其中一種普通佈局(用戶無法調整大小)。

如果你仍然想嘗試,我想你應該看看closestLegalPosition()getRange()。如果你只是返回小部件的寬度,那麼調整大小應該停止工作。

+1

我想這將是最簡單的方法 - 使用情況是這樣的:我有一個用戶界面,它可以投入一定的模式,其中分離器的孩子之一小部件消失。在這種情況下,我不希望用戶能夠移動分離器,因爲一側只有一個小部件 - 這是否合理? – Thomi 2009-10-20 14:55:03

+0

奇數。我猜想,當它只有一個孩子時,分離器不會提供一個拖動元素。你能檢查確實只有一個孩子嗎? – 2009-10-20 14:59:53

+0

那麼,你實際上不能從分離器中移除一個小部件--QSplitter公共API不提供這樣做的方法。你能做到的最好的就是隱藏孩子。有任何想法嗎? – Thomi 2009-10-21 07:54:16

0

你必須做兩件事。將分離器內部的小部件(不應調整大小)設置爲FixedSize,並將對應分離器手柄的光標更改爲Qt::ArrowCursor。手柄開始零(左和未使用),所以兩個小部件之間的第一把手是指數1

下面是一個示例(將代碼放在main.cpp中):

#include <QtGui> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QWidget window; 
    window.resize(800, 300); 
    window.setWindowTitle("Splitter Test"); 
    window.show(); 

    QSplitter *splitter = new QSplitter(&window); 
    QListView *listview = new QListView; 
    QTreeView *treeview = new QTreeView; 
    QTextEdit *textedit = new QTextEdit; 

    splitter->addWidget(listview); 
    splitter->addWidget(treeview); 
    splitter->addWidget(textedit); 
    splitter->setChildrenCollapsible(false); 

    splitter->show(); 
    listview->show(); 
    treeview->show(); 
    textedit->show(); 

    //make the lisview 'fix' 
    listview->setFixedSize(listview->width(), listview->height()); 
    //change the cursor over the splitter handle between listview and 
    //treeview to ArrowCursor 
    splitter->handle(1)->setCursor(Qt::ArrowCursor);; 

    return app.exec(); 
} 

現在第一個分光手柄是disabled,第二個作品。

10

這樣做:

for (int i = 0; i < splitter->count(); i++) 
{ 
    QSplitterHandle *hndl = splitter->handle(i); 
    hndl->setEnabled(false); 
}