处置QMessageBox实例的正确方法是什么?

时间:2018-12-18 19:42:04

标签: qt

给出此代码:

void FooBar::ProcessExitHandler(QProcess* someProcess, QString logsPath)
{
    if (clientProcess->exitCode() != 0)
    {
        QMessageBox* dialog = new QMessageBox();
        dialog->setText("bye bye");
        dialog->setStandardButtons(0);

        QObject::connect(dialog, &QMessageBox::finished, [this](int) { 
            if (mMainWindow->AutoCloseCheckBoxChecked())
            {
                delete dialog; //TODO: need to confirm what is the correct way 
                this->quit();
            }
        });

        dialog->show();
        dialog->activateWindow();
    }
    else
    {
        if (mMainWindow->AutoCloseCheckBoxChecked())
        {
            delete dialog; //TODO: need to confirm what is the correct way 
            this->quit();
        }
    }
}

像这样正确地呼叫delete dialog吗?有没有更多的QT惯用方式呢?

另外,令我感到困惑的是(来自文档)我应该将parent传递给消息框的构造函数的想法。然后我将获得自动内存管理,对吗?那是我应该追求的QT风格吗?

我知道由于应用程序仍在退出,因此泄漏“无关紧要”,但是我想做正确的事。

1 个答案:

答案 0 :(得分:0)

正确的方法是使用setAttribute

<div id="sidebar">
    <ul class="nav-main-ul">
        <li class="nav-item"><a href="#"><i class="fa fa-home" style="padding-right: 13px"></i>Home</a></li>
        <li class="nav-title">Airports</li>
        <li class="nav-item">
            <a href="javascript:void(0)"><i class="far fa-paper-plane" style="padding-right: 13px"></i>North Airports</a>
            <ul class="nav-dropdown">
                <li><a href="">LLBG | Tel-Aviv</a></li>
                <li><a href="">LLSD | Sde Dov</a></li>
                <li><a href="">LLHZ | Herzliya</a></li>
                <li><a href="">LLHA | Haifa</a></li>
                <li><a href="">LLIB | Rosh Pina</a></li>
            </ul>
        </li>
        <li class="nav-item">
            <a href="#"><i class="far fa-paper-plane" style="padding-right: 13px"></i>South Airports</a>
            <ul class="nav-dropdown">
                <li><a href="">LLOV | Ovda</a></li>
                <li><a href="">LLET | Eilat</a></li>
            </ul>
        </li>
        <li class="nav-title">Airstrips</li>
        <li class="nav-item">
            <a href="#"><i class="far fa-paper-plane" style="padding-right: 13px"></i>North Airstrips</a>
            <ul class="nav-dropdown">
                <li><a href="">LLKS | Kiryat Shmona</a></li>
                <li><a href="">LLBO | Habonim</a></li>
                <li><a href="">LLMG | Megido</a></li>
            </ul>                
        </li>
        <li class="nav-item">
            <a href="#"><i class="far fa-paper-plane" style="padding-right: 13px"></i>South Airstrips</a>
            <ul class="nav-dropdown">
                <li><a href="">LLBS | Beer Sheva</a></li>
                <li><a href="">LLMZ | Masada</a></li>
                <li><a href="">LLEY | Ein Yahav</a></li>
                <li><a href="">LLYO | Yotvata</a></li>
            </ul>
        </li>
        <li class="nav-title">Miscellaneous</li>
        <li class="nav-item"><a href="#"><i class="fa fa-headphones-alt" style="padding-right: 13px"></i>ATC Tools</a></li>
    </ul>
</div>
<button onclick="toggleSidebar()">Toggle Sidebar</button>

通过设置属性 QMessageBox* dialog = new QMessageBox(); dialog->setAttribute(Qt::WA_DeleteOnClose); ,将在适当的时候调用析构函数。

当您手动调用WA_DeleteOnClose时,指针将保留其值(地址),尽管它不再有效。如果由于某种原因再次使用该指针,则该应用程序将崩溃。

  

\ warning在等待事件发生时删除QObject   交付可能导致崩溃。您不得直接删除QObject   如果它与当前正在执行的线程不在同一线程中。   使用deleteLater()代替,这将导致事件循环删除   在所有未决事件都已传递给该对象之后。   https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qobject.cpp.html#881