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

时间:2013-06-11 22:57:17

标签: qt qsplitter

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

enter image description here

上部子窗口小部件是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);
    }
}

我错误地使用了这个吗?无论我对分离器做什么,插槽当前都无能为力。有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

您确定SLOT宏中是否允许使用参数名称?快速测试表明他们不是。

尝试:

connect(divide, SIGNAL(splitterMoved(int,int)),
        this, SLOT(splitterMoved(int,int)));

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

示例,假设divide是类成员:

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

答案 1 :(得分:0)

对于QSplitter,您可以使用以下方法检查子窗口小部件的隐形性:

QWidget::visibleRegion().isEmpty()

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