Qt 检测QSplitter子窗口小部件何时折叠

Qt 检测QSplitter子窗口小部件何时折叠,qt,qsplitter,Qt,Qsplitter,我有一个类,它使用垂直QSplitter来分隔两个重要的小部件(箭头指针位于拆分器位置): 上面的子部件是QTextEdit,而下面的子部件是与我的应用程序的标记系统交互的自定义部件。默认情况下,较低的子对象被折叠;它仅在用户单击标记工具栏按钮或向上拖动拆分器时显示。当按钮处于打开状态时,将显示较低的子项,否则它将保持隐藏状态 工具栏按钮工作得很好,但现在我无法通过一直向下拖动分割条来检测用户何时折叠较低的子对象。这会导致当用户用手折叠较低的子对象时,工具栏按钮保持打开状态。反之亦然;当用户向

我有一个类,它使用垂直QSplitter来分隔两个重要的小部件(箭头指针位于拆分器位置):

上面的子部件是QTextEdit,而下面的子部件是与我的应用程序的标记系统交互的自定义部件。默认情况下,较低的子对象被折叠;它仅在用户单击标记工具栏按钮或向上拖动拆分器时显示。当按钮处于打开状态时,将显示较低的子项,否则它将保持隐藏状态

工具栏按钮工作得很好,但现在我无法通过一直向下拖动分割条来检测用户何时折叠较低的子对象。这会导致当用户用手折叠较低的子对象时,工具栏按钮保持打开状态。反之亦然;当用户向上拖动拆分器时,按钮保持关闭状态

我已经尝试将QSplitter:splitterMoved(int-pos,int-index)信号连接到一个插槽,当较低的子级(索引1)手动折叠(位置0)时,该插槽将取消按钮切换,但由于某些原因,该信号从未发出

我的代码(拆分器对象称为divide)连接此信号

connect(divide, SIGNAL(splitterMoved(int,int)), this, SLOT(splitterMoved(int pos, int index)));
。。。到该插槽:

void Editor::splitterMoved(int pos, int index){

    using namespace std;

    if((index==1) && (pos==0)){
      ui->TagButton->setChecked(false);
    }
    else{
      ui->TagButton->setChecked(true);
    }
}

我用错了吗?无论我对拆分器做了什么,插槽当前都不会执行任何操作。是否有更好的方法来解决此问题?

是否确定
插槽中允许使用参数名?一个快速的测试表明他们不是

尝试:

connect(divide, SIGNAL(splitterMoved(int,int)),
        this, SLOT(splitterMoved(int,int)));
更新: 另一点是,当子窗口小部件#1折叠时,
pos
不是0,相反,它达到其最大值,因为它是从顶部的距离。测试
QSplitter:size()
会更容易

例如,假设
divide
是类成员:

void Editor::splitterMoved(int pos, int index){
    if(divide->sizes().at(1)==0) {
      ui->TagButton->setChecked(false);
    }
    else{
      ui->TagButton->setChecked(true);
    }

qspliter
s的情况下,您可以使用以下方法检查子小部件的不可见性:

QWidget::visibleRegion().isEmpty()


与检查手柄是否为零不同,这对两个极端都有效。

@Will:slot对我有效,但对
pos==0
无效。查看我的编辑。我遇到了相同的问题,并使用
qspliter::setChildrenCollapsible(false)解决了它。以及一种信号槽机制,用于在子级大小更改时调用
qspliter::setSize()
。“崩溃”似乎是一种特殊的状态,甚至在子级扩展上也会出现。(我知道,2年后,但其他人转向这个问题可能会发现这很有帮助)