Qt:按下按钮时显示多个 windows

Qt: Multiple windows showing on button press

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

// Slot
void Window1::showWindow2()
{
    Window2*cal = new Window2();
    cal->show();
}

有 2 个 Window2 实例显示在 Window1 之上。我相信它正在感应电容式触摸屏上的双击并触发两次按下信号。我无法找到合适的解决方案。我在按下一次后尝试了延迟,如果延迟尚未到期,则仅从插槽中 return 。但我不认为这是一个好的解决方案。有人知道怎么做吗?

尝试使用另一个 QPushButton 信号(即 clicked):

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

正如您提到的,"I believe it is sensing a double tap on the capacitive touch screen" 表明您的代码可能会泄漏! 主要问题是你正在创建一个松散的 Window2 object,它只在你的 SLOT 内部可见(这就是你的代码的显示方式),意思是:你将如何管理这个 window2 object (cal)在您的其余代码中..您将如何关闭它?这是不可能的 - 至少对于您共享的代码。

解决方法: 在你的 window1 class header.

中创建一个 class 成员 Window2 *cal

然后,将您的插槽修改为:

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

据我所知,您可以通过两种方式解决这个问题。

QPushButton中有两个信号class、pressed()clicked()pressed() 指的是当您实际按下按钮时的事件,并且在您触摸 QPushButton 时立即触发它。 当你触摸QPushButton时,pressed()会持续发射,直到你松开它。这就是您的应用中出现多个 windows 的原因。 您的触摸屏很可能检测到双击。

第二个信号 clicked() 当您从按钮上移开手指时(当它从 ON 回到 OFF 状态时)发出。这很可能只会在一次人为触摸中触发一次。因此,您可以改用 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();
}

如果您采用第二种方法,请不要忘记在销毁 Window2 对象后将 pressed() 信号连接到 showWindow2() 插槽。

无论我是否使用这两种方法(pressed()clicked()),我都会断开连接,以确保插槽不会被调用两次。

正如 Mohammad 提到的,将 *cal 移动到 class 范围是个好主意。由于您是动态分配的,因此您需要确保稍后销毁它。当然,这可能会在您的设计中发生变化。