退出Qt计划的正确方法?

时间:2011-11-06 09:15:37

标签: qt resources exit quit

如何退出Qt程序,例如加载数据文件,发现文件损坏,用户需要退出此应用程序或重新启动数据文件?

我应该:

  1. 致电exit(EXIT_FAILURE)
  2. 致电QApplication::quit()
  3. 致电QCoreApplication::quit()
  4. (2)和(3)之间的区别?

6 个答案:

答案 0 :(得分:125)

QApplication派生自QCoreApplication,因此继承了quit() QCoreApplication的公共广告位,因此QApplication::quit()QCoreApplication::quit()之间没有区别。

正如我们可以在QCoreApplication::quit()的文档中看到的那样,“告诉应用程序退出并返回代码0(成功)。”。如果你想因为发现文件损坏而退出,那么你可能不想退出返回代码为零,这意味着成功,所以你应该调用QCoreApplication::exit()因为你可以提供一个非零的returnCode,按照惯例,它指示一个错误。

重要的是要注意“如果事件循环没有运行,这个函数(QCoreApplication :: exit())什么都不做”,所以在这种情况下你应该调用{{1} }。

答案 1 :(得分:28)

您可以致电qApp.exit();。我总是使用它,从来没有遇到过问题。

如果您的应用程序是命令行应用程序,您可能确实想要返回退出代码。这完全取决于你的代码。

答案 2 :(得分:0)

如果您需要从main()关闭应用程序,则可以使用此代码

# Fetch all user_id values from the Session table where the user ForeignKey has
# no value (thus, it's null)
null_user_ids = Session.objects.filter(user__isnull=True).values_list('user__id', flat=True)

# Count the null users
no_of_users = null_user_ids.count()

如果未安装OpenSSL,程序将终止

答案 3 :(得分:0)

    Dictionary<string, Dictionary<string, string>> Save = new Dictionary<string, Dictionary<string, string>>();
    private void textBox1_Leave(object sender, EventArgs e)
    {
        Savedata(Save, textBox1, tbDm);
    }

    private void textBox2_Leave(object sender, EventArgs e)
    {
        Savedata(Save, textBox2, tbDm);
    }

    private void textBox3_Leave(object sender, EventArgs e)
    {
        Savedata(Save, textBox3, tbDm);
    }

    private void textBox4_Leave(object sender, EventArgs e)
    {
        Savedata(Save, textBox4, tbDm);
    }

    private void textBox5_Leave(object sender, EventArgs e)
    {
        Savedata(Save, textBox5, tbDm);
    }

    private void textBox6_Leave(object sender, EventArgs e)
    {
        Savedata(Save, textBox6, tbDm);
    }

    private void textBox7_Leave(object sender, EventArgs e)
    {
        Savedata(Save, textBox7, tbDm);
    }
   private void textBox8_Leave(object sender, EventArgs e)
    {
        Savedata(Save, textBox8, tbDm);
    }

    public void Savedfile(Dictionary<string, Dictionary<string, string>> save)
    {
        string json = JsonConvert.SerializeObject(save, new KeyValuePairConverter());
        string FilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Send");
        if (!Directory.Exists(FilePath))
        {
            Directory.CreateDirectory(FilePath);
        }
        System.IO.File.WriteAllText(FilePath + "\\" + "output.json", json);
    }
    private void Savedata(Dictionary<string, Dictionary<string, string>> currentDict, TextBox textbox, TabPage tab)
    {

        var thisdata = currentDict.ContainsKey(tab.Text) ? currentDict[tab.Text] : new Dictionary<string, string>();
        thisdata[textbox.Name] = textbox.Text;
        currentDict[tab.Name] =thisdata;
        Savedfile(currentDict);
    }

    public class MetaData
    {
        public string MetaDataList { get; set; }
        public string Id { get; set; }
        public string Createdby { get; set; }
        public DateTime CreatedOn { get; set; }
        public string State { get; set; }
        public string Level { get; set; }

    }


    public class Offlinedta
    {
        public MetaData metadata { get; set; }
        public Dictionary<string, Dictionary<string, string>> currentDict { get; set; }

        public Offlinedta()
        {
            MetaData obj = new MetaData();
            obj.Id = "1";
            obj.Createdby= "Ravi";
            obj.CreatedOn = DateTime.Now;
            obj.State = "Completed";
            obj.Level = "Curator";
        }
    }

example

答案 4 :(得分:0)

在搜索这个问题时,我在documentation中发现了这个示例。

QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);

Mutatis mutandis当然适合您的特定动作。

附带此注释。

始终使用信号源将信号连接到此插槽是一个好习惯 QueuedConnection。如果有一个信号(未排队)连接到此插槽 在控件进入主事件循环之前发出(例如,在“ int main”调用exec()),该插槽无效,并且该应用程序从不 退出。使用排队连接可确保该插槽不会 直到控制进入主事件循环后才调用。

连接QGuiApplication :: lastWindowClosed()信号很常见 退出()

答案 5 :(得分:-1)

如果你正在使用Qt Jambi,这应该有效:

QApplication.closeAllWindows();