Inputstring 1: "acegi"
Inputstring 2: "bdfhj"
Outputstring: "abcdefghij"
Window1上有2个Window2实例。我相信它正在感应电容式触摸屏上的双击,并且两次触发按下的信号。我无法找到适当的解决方案。按下一次后我尝试了延迟,如果延迟尚未到期,则从插槽返回。但我不相信这是一个很好的解决方案。有谁知道怎么回事?
答案 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
移到班级范围是个好主意。由于您是动态分配的,因此您需要确保以后销毁它。当然,这可能会改变您的设计。