Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt中的Exit应用程序_Qt_Exit_Exit Code - Fatal编程技术网

Qt中的Exit应用程序

Qt中的Exit应用程序,qt,exit,exit-code,Qt,Exit,Exit Code,我在Qt中构建了一个应用程序,它包含两个按钮:一个退出按钮和一个导入按钮。按下导入按钮时,屏幕上的滚动区域中将显示按钮列表(文件loggers.csv包含数据1;2;3;4;5;) 这一切都很好,但当我按下退出按钮(当然应该关闭所有内容)时,应用程序没有正确停止(Qt的停止按钮仍然处于活动状态,而播放按钮没有)。当我运行调试器并按下退出按钮时,它会给出一个错误:为RtlFreeHeap指定的地址无效(0ADF0000,0028FE40)。有人能帮我吗 main #include <QtGu

我在Qt中构建了一个应用程序,它包含两个按钮:一个退出按钮和一个导入按钮。按下导入按钮时,屏幕上的滚动区域中将显示按钮列表(文件loggers.csv包含数据1;2;3;4;5;)

这一切都很好,但当我按下退出按钮(当然应该关闭所有内容)时,应用程序没有正确停止(Qt的停止按钮仍然处于活动状态,而播放按钮没有)。当我运行调试器并按下退出按钮时,它会给出一个错误:为RtlFreeHeap指定的地址无效(0ADF0000,0028FE40)。有人能帮我吗

main

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;

    w.showFullScreen();

    return a.exec();
}
#包括
#包括“mainwindow.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 全屏显示();
返回a.exec();
}
main window.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>
#include "logger.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    QPushButton exit_btn;
    QPushButton import_btn;

private slots:

    void createMenus();
    void exit();
    void import();

private:

    int window_width;
    int window_height;

    int numLoggers;
    int numSelected;

    QVector<Logger*> loggers;

    QScrollArea * scroll_area;

    QVBoxLayout scrollLayout;

    QWidget viewport;

    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
#ifndef LOGGER_H
#define LOGGER_H

#include <QtGui>

class Logger : public QWidget
{
    Q_OBJECT
public:
    explicit Logger(QWidget *parent = 0);

    ~Logger();
    int number;
    QLabel num;
    QToolButton * button;
    bool checked;

signals:

public slots:

    void setNumber(int number);
    void createButtons();
};

#endif // LOGGER_H
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括“logger.h”
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
QPushButton exit_btn;
QPushButton导入\u btn;
专用插槽:
void createMenus();
无效退出();
无效导入();
私人:
窗口宽度;
内窗高度;
国际数学家;
int numSelected;
矢量记录器;
QScrollArea*滚动区域;
QVBoxLayout滚动布局;
QWidget视口;
Ui::MainWindow*Ui;
};
#endif//main窗口
Mainwindow.cpp:

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

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

    window_width = QApplication::desktop()->width();
    window_height = QApplication::desktop()->height();

    createMenus();

    connect(&exit_btn,SIGNAL(clicked()),this,SLOT(exit()));
    connect(&import_btn,SIGNAL(clicked()),this,SLOT(import()));
}

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

void MainWindow::createMenus()
{
    import_btn.setParent(ui->centralWidget);
    import_btn.setGeometry(400,300,100,100);
    import_btn.setText("IMPORT");

    exit_btn.setText("EXIT");
    exit_btn.setParent(ui->centralWidget);
    exit_btn.setGeometry(window_width-50,12,32,32);

    viewport.setLayout(&scrollLayout);
    viewport.resize(0,0);

    scroll_area = new QScrollArea(ui->centralWidget);
    scroll_area->setGeometry(0,66,317,window_height-116);
    scroll_area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    scroll_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    scroll_area->setWidget(&viewport);
    scroll_area->setGeometry(0,97,317,window_height-228);

    scrollLayout.setMargin(0);
    scrollLayout.setSpacing(0);
}

void MainWindow::exit()
{
    close();
    qApp->quit();
}

void MainWindow::import()
{
    numSelected=0;

    QFile f("Loggers3.csv");

    if (f.open(QIODevice::ReadOnly))
    {
        numLoggers=0;

        QString data;
        data = f.readAll();
        QStringList vals = data.split(';');

        while(vals.size()>=1)
        {
            Logger * logger = new Logger;

            logger->setNumber(vals[0].toInt());
            vals.removeAt(0);

            loggers<<logger;

            numLoggers++;
        }
        f.close();


        for(int i=0; i<numLoggers;i++)
        {
            loggers[i]->createButtons();
            scrollLayout.addWidget(loggers[i]->button);
        }

        viewport.resize(367,numLoggers*60);
    }
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括“QtGui”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
window_width=QApplication::desktop()->width();
window_height=QApplication::desktop()->height();
创建菜单();
连接(&exit_btn,信号(单击()),此,插槽(exit());
连接(&import_btn,信号(单击()),此,插槽(导入());
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void MainWindow::createMenus()
{
导入\u btn.setParent(ui->centralWidget);
导入设置几何体(400300100100);
import_btn.setText(“导入”);
出口设置文本(“出口”);
退出\u btn.setParent(ui->centralWidget);
出口设置几何(窗口宽度-50,12,32,32);
viewport.setLayout(&scrollLayout);
viewport.resize(0,0);
滚动区域=新的QScrollArea(ui->centralWidget);
滚动区域->设置几何体(0,66317,窗口高度-116);
滚动\u区域->设置垂直滚动条策略(Qt::ScrollBarAlwaysOff);
滚动_区域->设置水平滚动条策略(Qt::ScrollBarAlwaysOff);
滚动_区域->设置小部件(&视口);
滚动_区域->设置几何体(0,97317,窗口高度-228);
scrollLayout.setMargin(0);
scrollLayout.setSpacing(0);
}
void MainWindow::exit()
{
close();
qApp->quit();
}
void主窗口::导入()
{
numSelected=0;
QFile f(“Loggers3.csv”);
if(f.open(QIODevice::ReadOnly))
{
numLoggers=0;
QString数据;
data=f.readAll();
QStringList vals=data.split(“;”);
而(vals.size()>=1)
{
记录器*记录器=新记录器;
记录器->设置编号(VAL[0].toInt());
拆除日期(0);
loggerssetCheckable(真);
按钮->设置最小尺寸(317,60);
按钮->设置样式表(“QToolButton{background image:url(images/btn_-bg);border:none}”);
}
记录器::~Logger()
{
}
无效记录器::setNumber(int logNumber)
{
编号=对数编号;
}
void Logger::createButtons()
{
QLayout*layout=新的QHBoxLayout;
QSpacerItem*间隔=新的QSpacerItem(120,31,QSizePolicy::max,SizePolicy::max);
num.setStyleSheet(“颜色:白色;字体:粗体16px”);
num.setText(QString::number(number));
布局->添加小部件(&num);
布局->附加项(垫片);
按钮->设置布局(布局);
}

我不完全确定您想要实现什么……但您的问题在于以下两行:

viewport.setLayout(&scrollLayout);
viewport.resize(0,0);
在QWidget类的文档中指出:

如果此小部件上已安装布局管理器,则QWidget 不允许您安装其他布局管理器。必须先删除现有布局管理器(由layout()返回),然后才能使用新布局调用setLayout()

这就是你的问题所在。别相信我,在这两行代码之前加上这个检查

 if(layout()){
        qDebug() << "Another layout exists";
    }
首先,我们在布局中创建所需的小部件。然后,我们创建QVBoxLayout对象并将小部件添加到布局中。最后,我们调用QWidget::setLayout()将QVBoxLayout对象安装到小部件上。此时,布局中的小部件将被重新出租,使Windows成为它们的父窗口


项目中的关键错误源:

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

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

    window_width = QApplication::desktop()->width();
    window_height = QApplication::desktop()->height();

    createMenus();

    connect(&exit_btn,SIGNAL(clicked()),this,SLOT(exit()));
    connect(&import_btn,SIGNAL(clicked()),this,SLOT(import()));
}

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

void MainWindow::createMenus()
{
    import_btn.setParent(ui->centralWidget);
    import_btn.setGeometry(400,300,100,100);
    import_btn.setText("IMPORT");

    exit_btn.setText("EXIT");
    exit_btn.setParent(ui->centralWidget);
    exit_btn.setGeometry(window_width-50,12,32,32);

    viewport.setLayout(&scrollLayout);
    viewport.resize(0,0);

    scroll_area = new QScrollArea(ui->centralWidget);
    scroll_area->setGeometry(0,66,317,window_height-116);
    scroll_area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    scroll_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    scroll_area->setWidget(&viewport);
    scroll_area->setGeometry(0,97,317,window_height-228);

    scrollLayout.setMargin(0);
    scrollLayout.setSpacing(0);
}

void MainWindow::exit()
{
    close();
    qApp->quit();
}

void MainWindow::import()
{
    numSelected=0;

    QFile f("Loggers3.csv");

    if (f.open(QIODevice::ReadOnly))
    {
        numLoggers=0;

        QString data;
        data = f.readAll();
        QStringList vals = data.split(';');

        while(vals.size()>=1)
        {
            Logger * logger = new Logger;

            logger->setNumber(vals[0].toInt());
            vals.removeAt(0);

            loggers<<logger;

            numLoggers++;
        }
        f.close();


        for(int i=0; i<numLoggers;i++)
        {
            loggers[i]->createButtons();
            scrollLayout.addWidget(loggers[i]->button);
        }

        viewport.resize(367,numLoggers*60);
    }
}

<强>小部件应该在堆上构建,因为当它们的父母亲被删除时它们会自动删除。<强>你有一个自定义的小部件类在堆上实例化。成员也应该继续堆。此外,你应该考虑使用GUI代码中的父/子层次结构来确保正确的内存管理。删除和正确删除。

根据我的经验,如果您的程序停止在
RtlFreeHeap
中,这是内存损坏的良好迹象

打电话的时候

import_btn.setParent(ui->centralWidget);
centralWidget
拥有
import\u btn
的所有权。这意味着,当
centralWidget
被删除时(这是
delete ui的一部分;
主窗口的
析构函数中发生),它将调用成员变量上的
delete

这会导致报告的内存损坏


您需要动态分配
QPushButton
,而不是作为普通的成员变量。因此,请将它们设置为
QPushButton*

,以下是我如何从mainwindow.cpp执行此操作的,这要感谢和以下问题:


完美无瑕:D

好,但如果是这样,我应该在哪里设置第一个布局?导入按钮只按下一次,所以我看不出这是在哪里
import_btn.setParent(ui->centralWidget);
QPushButton * quit_btn = new QPushButton(this);
quit_btn->setGeometry(540,440,93,27);
quit_btn->setText("Exit");
QObject::connect(quit_btn,SIGNAL(clicked()),qApp,SLOT(quit()));