按下热键时显示一个对话框实例

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();

这就是我需要的(相同的热键显示和隐藏)。

感谢您的所有回答!

【讨论】:

以上是关于按下热键时显示一个对话框实例的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:在启​​动时显示一个对话框

电脑启动时显示windows无法启动怎么解决

在关闭建议名称时显示 xlworkbook 保存对话框

在 Android 中显示对话框时显示 AppBar

下载文件时显示自定义对话框

加载时显示 C# 延迟模式对话框,同时允许继续执行