Qt:按下按钮时显示多个窗口

时间:2018-01-23 14:10:38

标签: c++ qt signals-slots

Inputstring 1: "acegi"

Inputstring 2: "bdfhj"

Outputstring: "abcdefghij"

Window1上有2个Window2实例。我相信它正在感应电容式触摸屏上的双击,并且两次触发按下的信号。我无法找到适当的解决方案。按下一次后我尝试了延迟,如果延迟尚未到期,则从插槽返回。但我不相信这是一个很好的解决方案。有谁知道怎么回事?

3 个答案:

答案 0 :(得分:1)

尝试使用其他QPushButton信号(即clicked):

connect(ui->button,SIGNAL(clicked(bool)),this,SLOT(showWindow2()));

答案 1 :(得分:1)

正如您所提到的 “我相信它正在感应电容式触摸屏上的双击” 表示您的代码可能会泄漏! 主要问题是你正在创建一个松散的Window2对象,它只在你的SLOT中可见(这就是你的代码出现的方式),这意味着:你将如何在你的其余代码中管理这个window2对象(cal)。你会关闭吗?这是不可能的 - 至少使用您共享的代码。

<强>解决方案: 在window1类标题中创建一个类成员Window2 *cal

然后,将您的广告位修改为

void Window1::showWindow2()
{
    if (cal != nullptr)
     delete cal;
    cal = new Window2();
    cal->show();
}

答案 2 :(得分:1)

在我看来,你可以通过两种方式来解决这个问题。

QPushButton类中有两个信号pressed()clicked()pressed()是指实际按下按钮时的事件,只要您触摸QPushButton,就会触发该事件。 当您触摸QPushButton时,pressed()会持续发出,直到您释放它为止。这就是您的应用程序中有多个窗口的原因。您的触摸屏很可能检测到双击。

当您从按钮上移开手指时(从ON状态变为OFF状态时),会发出第二个信号clicked()。这很可能只在一次人体触摸中触发一次。因此,您可以改为使用clicked()

connect(ui->button,SIGNAL(clicked()),this,SLOT(showWindow2()));

另一种方法是,如果您仍然希望它使用pressed()。您可以在调用插槽后立即断开信号和插槽:

// Slot
void Window1::showWindow2()
{
    disconnect(ui->button, SIGNAL(pressed()), this, SLOT(showWindow2()));
    Window2*cal = new Window2();
    cal->show();
}

如果您遵循第二种方法,请不要忘记在销毁pressed()对象后将showWindow2()信号连接到Window2广告位。

无论我是使用这两种方法中的任何一种(pressed()还是clicked()),我都会断开连接以确保插槽没有被调用两次。

正如穆罕默德所说,将*cal移到班级范围是个好主意。由于您是动态分配的,因此您需要确保以后销毁它。当然,这可能会改变您的设计。