2012-10-12 76 views
0

父控件不先点击鼠标响应,QDialog的是通过调用()在mousemoveevent()关闭,这将导致鼠标按键依旧在对话框关闭后按下,第二次点击将会正常工作。Qt的问题 - 一个模态了QDialog后释放鼠标按键关闭后莫代尔QDialog的关闭

我发现至今:

  1. 如果done(int)被称为MouseReleaseeEvent(),一切正常

  2. 这似乎是QDialog缺乏MouseButtonRelease事件(其中它的后一个期待MouseButtonPress触发的事件)由于QDialogMouseMoveEvent已关闭,这打乱了父窗口部件的鼠标事件。

我的目的是制造一种QDialog其可通过滑动被关闭,当它检测到鼠标按下并移动到一定位置时,其将被关闭。

这是很感激,如果大家谁遇到它之前或谁拥有任何想法发生了什么事给我一些建议。

千恩万谢。

此外,这是我第一次在这里发表一个问题,如果我错过了,我想提供的任何信息,请让我知道...

+0

你调用父mousemoveevent? – fonZ

+0

也许你可以在closeevent中手动调用mouserelease事件。这可能是一个黑客,但如果其他失败将工作。 – fonZ

+0

谢谢乔恩!我试图手动调用mouserelease事件,但没有运气。看起来QDialog坚持要有一个完整的例程(mousepress + mouserelease),然后才能将控件正确释放回父级。我目前的解决方法是仅在用户释放鼠标/触摸并且一切正常后才调用close事件。我的好奇是有没有人在Qt中实现了“像滑动解锁的iPhone”界面,它是如何完成的? –

回答

0

这工作完全,没有任何动画,但这些可添加。基本上它是在鼠标开始移动时寻找x坐标的差异,如果它高于或低于2(向左或向右滑动),它将关闭对话框。

int x; 

void MyDialog::mousePressEvent(QMouseEvent * event) { 
    x = event->globalPos().x(); 
} 

void MyDialog::mouseReleaseEvent(QMouseEvent * event) { 
    int diff = x - event->globalPos().x(); 
    qDebug(tr("released").arg(diff).toUtf8().constData()); 
    if (diff > 2 || diff < -2) QDialog::close(); 
} 

我没有看到任何问题。

+0

再次感谢您花时间在此。正如我所说的,在mouseReleaseEvent中调用close()完全没有问题。你介意在mouseMoveEvent中调用close(),可能你可以模拟相同的问题。 –

+0

我不认为你想触发接近上点击,但我测试了它,我调用close时mousePressEvent被触发,一切工作正常。该对话框按预期结束。 – fonZ