【问题标题】:Detecting when QSplitter child widget is collapsed检测 QSplitter 子小部件何时折叠
【发布时间】:2013-06-11 22:57:17
【问题描述】:

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

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

【问题讨论】:

  • 我遇到了同样的问题并通过QSplitter::setChildrenCollapsible(false); 解决了它。和一个信号槽机制来调用QSplitter::setSize()子大小的变化。似乎“崩溃”是一种特殊状态,即使在子大小扩展时也会存在。 (我知道,2 年后,但其他重定向到这个问题的人可能会觉得这很有帮助)

标签: qt qsplitter


【解决方案1】:

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

尝试:

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

更新: 还有一点是pos在子widget#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);
    }

【讨论】:

  • @Will:该插槽适用于我,但不适用于pos==0。查看我的编辑。
【解决方案2】:

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

QWidget::visibleRegion().isEmpty()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多