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

时间:2016-05-23 14:49:52

标签: c++ qt qthread

我的问题分为两部分:

  1. mainWindow是否在运行main()?
  2. 之外的线程中生成
  3. 当main()返回时,#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } 如何不会立即超出范围?
  4. 在下面的示例中,创建一个窗口,显示,并且main几乎立即返回。

    的main.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;
    }
    

    mainwindow.cpp

    #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
    

    mainwindow.h

    #-------------------------------------------------
    #
    # 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
    

    MainWindowExample.pro

    static void Main(string[] args)
    {
        foreach (var results in BruteForce())
        {
            Console.WriteLine(results);
        }
    }
    
    public static IEnumerable<String> BruteForce()
    {
        const int firstLetter = 'A';
        const int lastLetter = 'Z';
        for (var firstPos = firstLetter; firstPos <= lastLetter; firstPos++)
        {
            for (var secondPos = firstLetter; secondPos <= lastLetter; secondPos++)
            {
                for (var thirdPos = 0; thirdPos <= 9; thirdPos++)
                {
                    for (var fourthPos = firstLetter; fourthPos <= lastLetter; fourthPos++)
                    {
                        for (var fifthPos = firstLetter; fifthPos <= lastLetter; fifthPos++)
                        {
                            for (var sixthPos = 0; sixthPos <= 9; sixthPos++)
                            {
                                for (var sevethPos = firstLetter; sevethPos <= lastLetter; sevethPos++)
                                {
                                    for (var eighthPos = 0; eighthPos <= 9; eighthPos++)
                                    {
                                        yield return
                                            String.Join(string.Empty, 
                                                (char) firstPos,
                                                (char) secondPos,
                                                thirdPos,
                                                (char) fourthPos,
                                                (char) fifthPos,
                                                sixthPos,
                                                (char) sevethPos,
                                                eighthPos);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    

2 个答案:

答案 0 :(得分:5)

  1. 没有为debutpos = contentu.find(debut) # ... finpos = contenu.find(fin, debutpos)
  2. 创建新主题
  3. mainWindow事件循环在mainWindow范围内执行 - 它会一直阻塞,直到应用程序退出(例如 - 上一个顶级窗口关闭)。
  4. 所以a.exec()不会超出范围,因为mainWindow执行所有内容。

    使用以下代码检查:

    main

    来自QApplication doc:

      

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

答案 1 :(得分:1)

mainWindow是否在运行main()的线程以外的线程中生成?

没有。事实上,这样做是不明确的行为。您只能在主线程中构造QWidget个后代。

Threads and Objects文档主题涵盖了:

  
    

虽然QObject是可重入的,但GUI类,尤其是QWidget及其所有子类,都不是可重入的。它们只能在主线程中使用。如前所述,还必须从该线程调用QCoreApplication :: exec()。*

  

main()返回时,mainWindow如何不会立即超出范围?

但确实如此!

main()返回时返回

a.exec(),只有当您退出应用程序时才会发生这种情况。默认情况下,当最后一个可见窗口关闭时,您的应用程序会自动退出。