Qt拆分器禁用

时间:2009-10-20 13:33:30

标签: c++ qt

我希望能够阻止用户在运行时移动QSplitter。调用setEnabled(false)会这样做,但它也会禁用所有子窗口小部件 - 这不是我想要的。有没有办法实现这个目标?我是否必须禁用拆分器,然后手动重新启用所有子窗口小部件?这似乎相当麻烦,对于一些必须是相当普遍的做法。

有人可以提出任何建议吗?

3 个答案:

答案 0 :(得分:13)

这样做:

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

答案 1 :(得分:1)

实际上,我从未见过有人曾禁用过分割器:它们在那里,因此用户可以根据需要布局UI,那么为什么有人想要禁用它呢?要么需要拆分器,要么可以使用其中一种常规布局(用户无法调整大小)。

如果您仍想尝试,我认为您应该查看closestLegalPosition()getRange()。如果您只返回窗口小部件的宽度,则调整大小应该停止工作。

答案 2 :(得分: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,第二个拆分器句柄正常工作。