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