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:按下按钮时显示多个窗口的主要内容,如果未能解决你的问题,请参考以下文章