2013-06-11 127 views
1

我有一个使用垂直了QSplitter分离两种重要的构件的一类(箭头指针是在分离器的位置):当检测了QSplitter子插件已折叠

enter image description here

上部子构件是一QTextEdit,而较低的孩子是一个自定义小部件,与我的应用程序的标记系统进行交互。较低的孩子默认会崩溃;它仅在用户单击标签工具栏按钮或向上拖动分离器时才会显示。当按钮打开时,显示较低的孩子,否则它将保持隐藏状态。

工具栏按钮可以很好地工作,但是现在我无法检测用户何时通过将分隔栏一直向下拖动来折叠较低的孩子。这会导致工具栏按钮在用户手动折叠下面的孩子时保持切换。反过来也是如此;当用户拖动分离器时,按钮保持关闭状态。

我已经尝试将QSplitter:splitterMoved(int pos,int index)信号连接到插槽,该插槽可在手动折叠较低子项(索引1)时折叠按钮(位置0),但由于某些原因信号永远不会发射。

我的代码(拆分对象被称为鸿沟)连接该信号...

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

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

尝试:

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

UPDATE: 另一点是,pos不为0时,子部件#1处于折叠状态,反之则达到最大值,因为它是从距离最佳。测试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); 
    } 
+0

我只是去尝试...它仍然打破。 –

+0

@Will:该插槽适用于我,但不适用于'pos == 0'。看我的编辑。 –

+0

现在有效。谢谢! –