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

时间:2016-06-16 12:54:21

标签: c++ qt

我有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并再次按下热键后这个崩溃了。 我曾尝试过(!pd-&gt; isVisible())关于Hotkey事件,但也没有做任何事情。 全球&#34; dp&#34; QDialog关闭时被删除? BTW即时使用setAttribute(Qt :: WA_DeleteOnClose);在那个QDialog上,如果这会影响任何事情。

编辑:我正在考虑一种只创建QDialog的方法,只需显示它并在调用Hotkey时隐藏它,但我无法看到它是如何完成的,我仍然会崩溃。

由于

1 个答案:

答案 0 :(得分:0)

我刚刚使用了Show / Hide方法,它对我有用...我认为我的问题是围绕使用一个全局对象并多次使用它,知道在QDialog关闭时它将被删除,以便@Mike说!dp仅适用于第一次。

由于我的QDialog是无框架的,因为它也被热键关闭,所以我使用了隐藏而不是关闭它。

if(!dp->isVisible())
{
    dp->show();
}
else
{
    dp->hide();
}

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

感谢您的所有答案!