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

Posted

技术标签:

【中文标题】Qt:按下按钮时显示多个窗口【英文标题】:Qt: Multiple windows showing on button press 【发布时间】:2018-01-23 14:10:38 【问题描述】:
connect(ui->button,SIGNAL(pressed()),this,SLOT(showWindow2()));

// Slot
void Window1::showWindow2()

    Window2*cal = new Window2();
    cal->show();

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

【问题讨论】:

您能说明一下您在哪里进行连接的方法吗? 可能是双击吃第二个事件。您需要以某种方式处理双击。 【参考方案1】:

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

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

【讨论】:

我通常不喜欢电容式触摸屏上的 clicked() 信号,因为它并不总是像按下时那样灵敏。但它似乎已经解决了我的问题,所以我现在将使用它。谢谢【参考方案2】:

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

QPushButton 类中有两个信号,pressed()clicked()pressed() 是指您实际按下按钮时的一个事件,它会在您触摸QPushButton 时立即触发。 当你触摸 QPushButton 时,pressed() 会持续发射,直到你释放它。这就是您的应用中有多个窗口的原因。您的触摸屏很有可能检测到双击。

第二个信号 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 移动到类范围是一个好主意。由于您是动态分配的,因此您需要确保稍后将其销毁。当然,这可能会在您的设计中发生变化。

【讨论】:

当您触摸 QPushButton 时,pressed() 会连续发出 ...button->setAutoRepeat(true); 时发生 @MohammadKanan 你是对的。我对设备上的硬件按钮感到困惑。【参考方案3】:

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

解决方案: 在你的 window1 类头中创建一个类成员 Window2 *cal

然后,将您的插槽修改为

void Window1::showWindow2()

    if (cal != nullptr)
     delete cal;
    cal = new Window2();
    cal->show();

【讨论】:

我尝试了你的建议。首先,谢谢。我不知道为什么,但是当我删除指向我的窗口的指针时,我得到了一个段错误。即使我尝试调用 new 然后立即删除,我也会遇到段错误(这样做只是为了确保 if != nullptr 是问题所在)。 @Daniel,只需删除 if () delete .. 并尝试,以确保您的构造函数正常工作 构造函数正在工作。删除时发生设置错误。

以上是关于Qt:按下按钮时显示多个窗口的主要内容,如果未能解决你的问题,请参考以下文章

几个ui显示在一个窗口里

仅在单击某个按钮时显示弹出窗口

如何在 CRM 的子网格形式中单击按钮时显示查找窗口?

在多个窗口上处理视图 - 第二个窗口关闭时 removeFromSuperView 的问题

多边形与 Openlayers 叠加时显示多个弹出窗口

按下按钮时获取 PyQt4 以打开另一个 Qt 窗口