按下热键时显示一个对话框实例
Posted
技术标签:
【中文标题】按下热键时显示一个对话框实例【英文标题】:Show one Dialog Instance when Hotkey is pressed 【发布时间】: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 不,我真的需要一个系统范围的快捷方式
【参考方案1】:
我刚刚使用了 Show / Hide 方法,它对我有用......我认为我的问题在于使用一个全局对象并多次使用它,知道当 QDialog 关闭时它将被删除,正如@Mike 所说!dp 仅在第一次时有效。
由于我的 QDialog 是无框的,而且它也被热键关闭,所以我使用了隐藏而不是关闭它。
if(!dp->isVisible())
dp->show();
else
dp->hide();
这就是我需要的(相同的热键显示和隐藏)。
感谢您的所有回答!
【讨论】:
以上是关于按下热键时显示一个对话框实例的主要内容,如果未能解决你的问题,请参考以下文章