如何退出Qt程序,例如加载数据文件,发现文件损坏,用户需要退出此应用程序或重新启动数据文件?
我应该:
exit(EXIT_FAILURE)
QApplication::quit()
QCoreApplication::quit()
(2)和(3)之间的区别?
答案 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";
}
}
答案 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();