首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >退出qt5时程序崩溃

退出qt5时程序崩溃
EN

Stack Overflow用户
提问于 2022-05-02 00:42:16
回答 1查看 47关注 0票数 0

我将QApplication::quit();添加到两个if语句中,这样当用户单击' cancel‘或'x’时,程序就会结束;然而,一旦单击cancel或x,程序就会崩溃,程序会出现问题。我不知道它为什么总是崩溃。我在main.cpp文件中添加了这段代码。

头文件:

代码语言:javascript
复制
#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

实施文件:

代码语言:javascript
复制
#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();

代码语言:javascript
复制
#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();
}
EN

回答 1

Stack Overflow用户

发布于 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应用程序中的事件循环是什么以及它是如何工作的。你的代码看上去好像毫无头绪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72081405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档