我希望能够阻止用户在运行时移动QSplitter。调用setEnabled(false)
会这样做,但它也会禁用所有子窗口小部件 - 这不是我想要的。有没有办法实现这个目标?我是否必须禁用拆分器,然后手动重新启用所有子窗口小部件?这似乎相当麻烦,对于一些必须是相当普遍的做法。
有人可以提出任何建议吗?
答案 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
,第二个拆分器句柄正常工作。