如何从任何地方完成Qt编程?

阿伦多夫

我的例子:

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()(但未显示“ this”,并且当然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();
}


主窗口

#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


主窗口

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

没有人

看起来问题出在不允许您调用QApplication::quit()QApplication::exit()直到QApplication事件循环实际开始之前。事件循环由开始QApplication::exec(),因此您调用quit()/exit()为时过早,以致于没有效果。

您可以通过移动quit()/exit()调用使其在事件循环中(例如,通过将MainWindow::start()代码移至QMainWindow::showEvent()插槽)来解决此问题,或者通过更改MainWindow::start()以返回值,在中检查该值main并退出(而不调用QApplication :: exec()`)(如果该值指示您的进程应提前退出)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从任何地方关闭Angular UI Modal

来自分类Dev

如何从任何地方启动Clojure REPL?

来自分类Dev

如何从任何地方运行Cassandra(cqlsh)

来自分类Dev

如何使批处理脚本从任何地方执行?

来自分类Dev

如何从任何地方访问OneNote笔记本?

来自分类Dev

如何从任何地方启动Clojure REPL?

来自分类Dev

如何使AlertDialog显示在android应用中的任何地方?

来自分类Dev

如何从任何地方访问Zoo组件数据

来自分类Dev

如何从任何地方访问Kubernetes上安装的服务?

来自分类Dev

如何在任何地方运行Appimage?

来自分类Dev

如何加载图像并从任何地方访问它?

来自分类Dev

从任何地方滚动Div

来自分类Dev

任何地方的“ if”开关列表?

来自分类Dev

单击框内任何地方,关闭

来自分类Dev

拖放图像到任何地方

来自分类Dev

单击任何地方回家?

来自分类Dev

任何地方的“ if”开关列表?

来自分类Dev

从任何地方滚动Div

来自分类Dev

从任何地方运行Python脚本

来自分类Dev

从任何地方进行谷歌查询

来自分类Dev

Libgdx点击(触摸)任何地方

来自分类Dev

Context API 从任何地方消费

来自分类Dev

关闭任何地方 sldenav 覆盖

来自分类Dev

如何允许任何地方的任何人运行脚本

来自分类Dev

如何使用javascript / jquery从任何地方禁用mouseover事件?

来自分类Dev

如何检测到USB,但未在任何地方显示?

来自分类Dev

如何使CMake在任何地方自动添加MagickWand库链接

来自分类常见问题

SwiftUI:如何使NavigationLink不在任何地方并停留在当前视图上

来自分类Dev

如何在Gnome终端或需要等宽字体的任何地方使用Fixedsys