1

我有一个使用垂直 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);
    }
}

我用错了吗?无论我对分离器做什么,该插槽目前什么都不做。有没有更好的方法来解决这个问题?

4

2 回答 2

2

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

尝试:

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

更新:另一点是pos当子小部件#1折叠时它不是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);
    }
于 2013-06-12T00:48:24.927 回答
1

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

QWidget::visibleRegion().isEmpty()

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

于 2018-11-26T17:38:35.503 回答