【发布时间】:2016-06-16 12:54:21
【问题描述】:
我有一个 Qt 问题,我试图在按下特定热键时只调用一次 QDialog,但我不断收到多个 QDialog。 我试过了
private:
ProductsDlg * pd;
MainWindow.cpp:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setCentralWidget(ui->MainTabWidget);
setFixedHeight(481);
setFixedWidth(335);
RegisterHotKey(HWND(winId()) , 0 , NULL , VK_F9);
//pd = new ProductsDlg(this); // I USED THIS TO TRY if(pd->isVisible()) Down in the Hotkey press Event.
}
bool MainWindow::nativeEvent(const QByteArray &eventType , void *message , long *result)
{
Q_UNUSED(eventType);
Q_UNUSED(result);
MSG * msg = static_cast<MSG*>(message);
if(msg->message == WM_HOTKEY)
{
if(!pd)
{
pd = new ProductsDlg(this);
pd->show();
}
}
}
我知道我做错了什么,因为在我关闭 QDialog 并再次按下热键后,这个崩溃了。 我已经在 Hotkey 事件上尝试过 if(!pd->isVisible()) 但也没有真正做任何事情。 关闭 QDialog 时是否会删除全局“dp”? 顺便说一句,我正在使用 setAttribute(Qt::WA_DeleteOnClose);如果这会影响任何事情,请在该 QDialog 上。
编辑:我正在考虑一种只创建一次 QDialog 并在调用热键时显示并隐藏它的方法,但我看不到它是如何完成的,我仍然会崩溃。
谢谢
【问题讨论】:
-
pd在关闭时删除旧的QDialog后保留一个悬空指针,if(!pd)仅在第一次为真。 . . -
您可以使用
QShortcut代替WinAPI。 -
@Mike,是的,我一开始就是这么想的,有什么解决方案吗?我尝试使用一个在 QDialog 关闭时设置为 FALSE 的变量(QDialog 的析构函数在调用时将其设置为 false)但没有,而且我不喜欢那种方法。
-
@PavelStrakhov ,但请注意
RegisterHotKey定义了一个系统范围的热键。而QShortcut只能提供 application-wide 快捷键(意味着应用程序的一个窗口必须处于活动状态)。因此,如果 应用程序范围 快捷方式就足够了,那么使用QShortcut会好得多,因为它是跨平台的并且更易于实现。 -
@PavelStrakhov 不,我真的需要一个系统范围的快捷方式