在程序启动时选择其他QMainWindow,但面临奇怪的QMessageBox exec()行为

时间:2019-01-16 17:43:04

标签: c++ qt qmessagebox qtwidgets

我正在开发一个简单的Qt Widget应用程序,其中有2个不同的QMainWindow类可以显示给用户(目前仅实现了一个)。

我的想法是显示一个带有自定义按钮的消息框,询问用户要执行哪种程序模式。

我想到了下面的代码,但是我遇到了奇怪的问题。如果您创建了一个简单的qt小部件项目,则可以轻松尝试此代码。

问题是,正在显示消息框,并且正确显示了按钮。当用户选择“调试模式”时,正确的MainWindow将显示一秒钟,然后消失!但是该程序保持打开状态,并且无法获得退货!

对于“操作模式”,显示了关键消息框,但是当用户单击“确定”时,所有消息框都消失了,但再次没有达到返回代码!

“退出”选项也是如此...

#include "mainwindow.h"
#include <QApplication>

#include <QMessageBox>
#include <QAbstractButton>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // At the start of the progam ask user which mode to show
    QMessageBox msgBoxModeSelection;
    msgBoxModeSelection.setIcon(QMessageBox::Question);
    msgBoxModeSelection.setText("Please select the program mode:");

    QAbstractButton* btnModeDebug = msgBoxModeSelection.addButton(
                                    "Debug Mode", QMessageBox::YesRole);
    QAbstractButton* btnModeOperation = msgBoxModeSelection.addButton(
                                    "Operation Mode", QMessageBox::NoRole);
    QAbstractButton* btnModeExit = msgBoxModeSelection.addButton(
                                    "Exit", QMessageBox::RejectRole);

    msgBoxModeSelection.exec();

    // Check which mode is being selected by user and continue accordingly
    if(msgBoxModeSelection.clickedButton() == btnModeDebug) {
        MainWindow w;
        w.show();
    } else if(msgBoxModeSelection.clickedButton() == btnModeOperation){ // Operation Mode
        //TODO implement...for now just inform user that it is not implemented
        QMessageBox::critical(nullptr, "Error", "Operation Mode is not yet implemented");
        return a.exec();
    } else if(msgBoxModeSelection.clickedButton() == btnModeExit){ // Just exit
        // Just exit the program
        QMessageBox::critical(nullptr, "Goodbye!", "Sorry to see you go :(");
        return a.exec();
    }

    return a.exec();
}

因此,该程序基本上消失了,但是它仍然处于打开状态并正在处理...终止该程序的唯一方法是停止调试器或从操作系统中终止其进程。

所以我希望显示正确的表单,因为其中没有消息框,并且返回代码和程序退出再次正常!

1 个答案:

答案 0 :(得分:2)

您的MainWindow仅存在于if语句内。因此,一旦显示并离开范围,它就会被破坏。

将其更改为例如:

ITEM  CATEGORY  LOCATION  1/1/2019  1/2/2019  1/3/2019
21221 SHOES     HYD             46         0         0
21222 TSHIRT    HYD             28        54         0
21223 CAPS      HYD              5         2        36

import numpy as np 
import pandas as pd 
mydata = pd.read_csv("C:/Users/data.csv", delimiter=',' , header='infer',
                    names=None, index_col=None, usecols=None, squeeze=False,
                    engine='python')
mydata.head()
pivot1 = pd.pivot_table(mydata, index=["ITEM NO", "CATEGORY", "LOCATION"])
mydata.groupby(['pivot1','DATE'], as_index = False).sum().pivot('pivot1','DATE').fillna(0)