1

私の例:

main.cpp:
    QApplication a(argc, argv);
    MainWindow w;
    w.start();
    return a.exec();


w.start():
    if (cf.exec()){
        this->show();
    } else {
        qDebug()<<"Need exit";
        //here should be exit
    }

コメントの場所で、私はやろうとしました: qApp->exit() と qApp->quit() と this->close() (ただし、「これ」は表示されておらず、もちろん close() は機能していません)。コードの任意の場所からアプリを終了するにはどうすればよいですか?


コード全体:
main.cpp

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

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

    return a.exec();
}


メインウィンドウ.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "CadrForm.h"
#include "TeacherForm.h"
#include "DepartmentForm.h"
#include "CategoriesForm.h"
#include "PostForm.h"
#include "RanksAndDegreesForm.h"
#include "TeachersRankAndDegreeForm.h"
#include "ConnectionForm.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    void start();
    ~MainWindow();
signals:
    void widgetChanged(QWidget*);
private slots:
    void on_actionCadr_triggered();
    void resetMainLayout(QWidget* w);
    void on_actionTeacher_triggered();

    void on_actionDepartment_triggered();

    void on_actionPost_triggered();

    void on_actionCategories_triggered();

    void on_actionRanksAndDegrees_triggered();

    void on_actionTeachersRD_triggered();

private:
    ConnectionForm cf;
    CadrForm *cadrForm;
    TeacherForm *teacherForm;
    DepartmentForm *departmentForm;
    CategoriesForm *categoriesForm;
    PostForm *postForm;
    RanksAndDegreesForm *ranksAndDegreesForm;
    TeachersRankAndDegreeForm *teachersRankAndDegreeForm;
    QWidget *current;
    Ui::MainWindow *ui;

    void addWidgetToMainLayout(QWidget *w);
};

#endif // MAINWINDOW_H


メインウィンドウ.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    connect(this, SIGNAL(widgetChanged(QWidget*)), this, SLOT(resetMainLayout(QWidget*)));

    ui->setupUi(this);
    cadrForm = new CadrForm(this);
    teacherForm = new TeacherForm(this);
    departmentForm = new DepartmentForm(this);
    categoriesForm = new CategoriesForm(this);
    postForm = new PostForm(this);
    ranksAndDegreesForm = new RanksAndDegreesForm(this);
    teachersRankAndDegreeForm = new TeachersRankAndDegreeForm(this);

    addWidgetToMainLayout(cadrForm);
    addWidgetToMainLayout(teacherForm);
    addWidgetToMainLayout(departmentForm);
    addWidgetToMainLayout(categoriesForm);
    addWidgetToMainLayout(postForm);
    addWidgetToMainLayout(ranksAndDegreesForm);
    addWidgetToMainLayout(teachersRankAndDegreeForm);
}

void MainWindow::start()
{
    if (cf.exec()){
        this->show();
    } else {
        qDebug()<<"Need exit";
        qApp->quit();
        qDebug()<<"still working";
    }
}

void MainWindow::addWidgetToMainLayout(QWidget *w)
{
    ui->mainLayout->insertWidget(0, w);
    ui->mainLayout->itemAt(0)->widget()->hide();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::resetMainLayout(QWidget *w)
{
    int index;
    if (current)
    {
        index = ui->mainLayout->indexOf(current);
        ui->mainLayout->itemAt(index)->widget()->hide();
    }
    index = ui->mainLayout->indexOf(w);
    if (index != -1) ui->mainLayout->itemAt(index)->widget()->show();
    else {
        addWidgetToMainLayout(w);
        resetMainLayout(w);
    }
    current = w;
    setWindowTitle(current->windowTitle());
}

void MainWindow::on_actionCadr_triggered()
{
    emit widgetChanged(cadrForm);
}

void MainWindow::on_actionTeacher_triggered()
{
    emit widgetChanged(teacherForm);
}

void MainWindow::on_actionDepartment_triggered()
{
    emit widgetChanged(departmentForm);
}

void MainWindow::on_actionPost_triggered()
{
    emit widgetChanged(postForm);
}

void MainWindow::on_actionCategories_triggered()
{
    emit widgetChanged(categoriesForm);
}

void MainWindow::on_actionRanksAndDegrees_triggered()
{
    emit widgetChanged(ranksAndDegreesForm);
}

void MainWindow::on_actionTeachersRD_triggered()
{
    emit widgetChanged(teachersRankAndDegreeForm);
}

ConnectionForm は、GUI を備えた単なる QDialog であり、追加のコードはありません。

4

3 に答える 3

1

イベントループが実行される機会が得られるまでメソッド呼び出しをキューに入れる慣用的な方法は次のとおりです。

QMetaObject::invokeMethod(&w, "start", Qt::QueuedConnection);

したがって、次のようmainになります。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    QMetaObject::invokeMethod(&w, "start", Qt::QueuedConnection);
    return a.exec();
}
于 2014-04-07T13:12:50.347 に答える
1

ダイアログ イベント ループを "早期" に開始するため (ブロックしている)、アプリケーションのイベント ループに到達しません。

これが意図的な設計である場合は、exit(3) を呼び出して、アプリケーション イベント ループを削除することをお勧めします。

アプリケーション イベント ループを実行したい場合は、ダイアログの実行ポイントに到達する前に、それが実行されていることを確認する必要があります。

QTimer簡単な修正は、アプリケーション イベント ループが開始される直前にシングル ショットを開始することです。これにより、「開始」メソッド呼び出しがトリガーされます。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.start();
    QTimer::singleShot(200, w, SLOT(start()));
    return a.exec();
}

それぞれ開始をスロットに変更します。

ただし、長期的には、ダイアログを表示するためのボタンなどを検討することをお勧めします。

于 2014-04-07T01:57:02.980 に答える