我将QApplication::quit();添加到两个if语句中,这样当用户单击' cancel‘或'x’时,程序就会结束;然而,一旦单击cancel或x,程序就会崩溃,程序会出现问题。我不知道它为什么总是崩溃。我在main.cpp文件中添加了这段代码。
头文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QString>
class SentenceProcessor {
public:
int getWordNumber(QString sentence);
int getVowelNumber(QString sentence);
bool isReversible(QString sentence);
QString wordsReversed(QString sentence);
QString formatSentence(QString sentence);
};
#endif // MAINWINDOW_H实施文件:
#include "mainwindow.h"
#include <QString>
#include <QStringList>
int SentenceProcessor::getWordNumber(QString sentence) {
QStringList list = sentence.split(" ");
int len = 0;
foreach(QString str, list) {
len++;
}
return len;
}
int SentenceProcessor::getVowelNumber(QString sentence) {
int count = 0;
int len = sentence.size();
for (int i = 0; i < len; i++) {
if (sentence.data()[i] == 'a' || sentence.data()[i] == 'A' || sentence.data()[i] == 'e' || sentence.data()[i] == 'E' || sentence.data()[i] == 'i' ||
sentence.data()[i] == 'I' || sentence.data()[i] == 'o' || sentence.data()[i] == 'O' || sentence.data()[i] == 'u' || sentence.data()[i] == 'U') {
count++;
}
}
return count;
}
bool SentenceProcessor::isReversible(QString sentence) {
QStringList list1 = sentence.split(" ");
QStringList list2;
int count = 0;
bool reversible;
foreach(QString str, list1) {
list2.prepend(str);
}
for (int i = 0; i < list1.size(); i++) {
if (QString::compare(list1[i], list2[i], Qt::CaseInsensitive) == 0) {
count++;
}
}
if (count == list1.size()) {
reversible = true;
} else {
reversible = false;
}
return reversible;
}
QString SentenceProcessor::wordsReversed(QString sentence) {
QStringList list1 = sentence.split(" ");
QStringList list2;
foreach(QString str, list1) {
list2.prepend(str);
}
QString reversed = list2.join(" ");
return reversed;
}
QString SentenceProcessor::formatSentence(QString sentence) {
sentence.data()[0] = sentence.data()[0].toUpper();
int len = sentence.length();
if (sentence.data()[len - 1] != '.') {
sentence.append('.');
}
return sentence;
}用于测试的Main.cpp文件:在这个文件中,我添加了QApplication::quit();
#include "mainwindow.h"
#include <QApplication>
#include <QString>
#include <QStringList>
#include <QTextStream>
#include <QInputDialog>
#include <QMessageBox>
int main(int argc, char * argv[]) {
QApplication app(argc, argv);
QMessageBox::StandardButton response;
response = QMessageBox::question(0, "Ready for input", "Are you ready to enter a sentence?", QMessageBox::Yes | QMessageBox::No);
while (response == QMessageBox::Yes) {
SentenceProcessor s1;
bool ok;
QString text = QInputDialog::getText(0, "Sentence Processor", "Enter sentence", QLineEdit::Normal, 0, &ok);
QStringList list = text.split(" ");
if (ok) {
while (list.size() < 2) {
QMessageBox::information(0, "Error", "You need to enter at least two words");
text = QInputDialog::getText(0, "Sentence Processor", "Enter sentence", QLineEdit::Normal, 0, &ok);
if (!ok) {
QApplication::quit();
}else{
list = text.split(" ");
}
}
QString numWords = QString::number(s1.getWordNumber(text));
QString numVowels = QString::number(s1.getVowelNumber(text));
bool reversible = s1.isReversible(text);
QString wordsReverse = s1.wordsReversed(text);
QString senFormat = s1.formatSentence(text);
QString reversibleText;
if (reversible == false) {
reversibleText = "Your sentence is not reversible";
} else {
reversibleText = "Your sentence is reversible";
}
QMessageBox::information(0, "Sentence Processing", "Your sentence: " + text + "\n" +
"The number of words in your sentence is: " + numWords + "\n The number of vowels in your sentence: " +
numVowels + "\n" + reversibleText + "\n" + "Your sentence reversed is: " + wordsReverse + "\n" +
"Your sentence formatted is: " + senFormat);
response = QMessageBox::question(0, "Another Input", "Would you like to enter another sentence?", QMessageBox::Yes | QMessageBox::No);
}else{
QApplication::quit();
}
}
return app.exec();
}发布于 2022-05-02 06:37:52
造成崩溃的原因可能是在代码中使用QApplication::quit();,甚至在调用应用程序exec()之前。看起来,您假设quit()是函数的出口点。事实并非如此。只有return或作用域结束是任何函数(包括main() )的退出点。您应该使用return (并返回0或一些错误代码,如1或-1,这取决于您自己),而不是所有的QApplication::quit()调用,然后它可能会像您预期的那样工作。
由于您实际上没有使用应用程序事件循环,所以很可能应该删除app.exec();。只需使用return 0;即可。使用app.exec(),您的应用程序将永远不会完成。
顺便说一句,这种设计Qt代码的方法是错误的。理想情况下,应该在应用程序的事件循环运行时执行代码。从调用exec()开始。但是,考虑到消息框有自己的事件循环,您的代码最终可能会正常工作。但这绝对是一种错误的Qt应用程序方式。总的来说,您应该研究Qt应用程序中的事件循环是什么以及它是如何工作的。你的代码看上去好像毫无头绪。
https://stackoverflow.com/questions/72081405
复制相似问题