c++ 主窗口关闭时停止qt应用程序的无限循环

ny6fqffe  于 2023-02-26  发布在  其他
关注(0)|答案(3)|浏览(168)

我的主要应用程序类是USB_Packet_Analyzer,它处理一些文件,但也支持从一个文件中阅读,有人仍然写入。在这种情况下,我有一个无限循环,检查是否有新的东西写入这个文件,如果是,我继续处理。在循环的每次迭代中,我调用QCoreApplication::processEvents();。问题是,当我关闭应用程序的主窗口时,它不会停止应用程序。如果我检查QApplication::topLevelWidgets().size()它仍然是1,QApplication::topLevelWidgets().at(0)->isVisible()是假的。为什么它不关闭我的窗口?我可以连接一些信号来检测窗口上的红色十字是否被点击?我知道当进入这种循环时,我可能会使用QThread,但我不想牵扯进来有什么办法能解决我的问题吗

e3bfsja2

e3bfsja21#

看一下QFileSystemWatcher类及其fileChanged信号。

#include <QFileSystemWatcher>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);

private:
    QFileSystemWatcher* fileWatcher;
    Ui::MainWindow*ui;
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    createUi();
            
    fileWatcher = new QFileSystemWatcher(this);
    connect(fileWatcher, SIGNAL(fileChanged(QString)), this, SLOT(fileChangedSlot(QString)));
            
    QFileInfo file("file_to_watch.txt");
        
    if (file.exists())
    {
        fileWatcher->addPath(file.absoluteFilePath());
    }
}
        
void MainWindow::fileChangedSlot(const QString &path)
{
    if (fileWatcher->files().contains(path))
    {
        qDebug() << "File changed" << path;
    }
}
chhkpiq4

chhkpiq42#

你可以使用系统中断信号来管理一个布尔值来中断你的无限循环或者退出应用程序。
例如:

#include <iostream>
#include <csignal>

using namespace std;

void InterruptSignalHandler(int signal_number) {
    cout<< "Signal Number is "<<signal_number<<endl;
    exit(signal_number);
}

int main()
{
    signal(SIGINT, InterruptSignalHandler);
    string a;
    while(true)
    {
        cout<<">";
        cin >> a;
    }

    return 0;
}
baubqpgj

baubqpgj3#

在我的主循环中,我检查窗口是否打开。2如果窗口关闭,我就终止程序。

if (my_windows.isActiveWindow()) == False:
        sys.exit(my_app.exec())
        break

我在任务管理器中的所有应用程序都被终止了。我现在没有问题,但我愿意接受更好的建议。

相关问题