创建没有父级的新Qt窗口是否也会创建新线程?

Dan*_*ett 3 c++ qt qthread

我的问题是两部分:

  1. mainWindow在运行main()的线程之外的线程中生成的?
  2. mainWindow当main()返回时,如何不立即超出范围?

在下面的示例中,创建一个窗口,显示,并且main几乎立即返回.

main.cpp中

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}
Run Code Online (Sandbox Code Playgroud)

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
Run Code Online (Sandbox Code Playgroud)

MainWindowExample.pro

#-------------------------------------------------
#
# Project created by QtCreator 2016-05-23T10:55:03
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = MainWindowExample
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui
Run Code Online (Sandbox Code Playgroud)

Hco*_*org 5

  1. 没有创建新的线程 mainWindow
  2. mainWindow事件循环中的范围中执行a.exec()它的块,直到应用程序退出- (例如-最后顶层窗口关闭时).

所以mainWindow不会超出范围,因为它是main执行一切.

使用以下代码检查:

std::cout << "starting application event loop" << std::endl;
const int ret = a.exec();
std::cout << "after exec" << std::endl; // or any other code here
return ret;
Run Code Online (Sandbox Code Playgroud)

来自QApplication doc:

进入主事件循环并等待直到调用exit(),然后返回设置为exit()的值(如果通过quit()调用exit(),则返回0).

  • OP必须立即误认为main返回,因为这会破坏MainWindow并关闭整个应用程序或导致一些崩溃.QApplication :: exec是阻塞方法,有很好的文档记录...... (2认同)