Quitter l'Application en Qt
J'ai construit une application Qt qui contient deux boutons: un bouton de sortie, et un bouton d'importation. Lorsque l'importation est enfoncé, une liste de boutons est affiché dans une scrollarea sur l'écran (le fichier bûcherons.csv contient les données 1;2;3;4;5;).
Tout cela fonctionne bien, mais quand j'appuie sur le bouton de sortie (qui bien sûr doit fermer tout), l'application n'est pas arrêté correctement (le bouton d'arrêt de l'intervalle Qt est toujours actif, et le bouton de lecture n'est pas). Quand je lance le debugger et appuyez sur le bouton quitter il donne une erreur: adresse non Valide spécifié à RtlFreeHeap( 0ADF0000, 0028FE40 ). Quelqu'un peut-il m'aider?
principal
#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
#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
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);
}
}
enregistreur.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
logger.cpp
#include "logger.h"
#include <QtGui>
Logger::Logger(QWidget *parent) :
QWidget(parent)
{
button = new QToolButton;
button->setCheckable(true);
button->setMinimumSize(317,60);
button->setStyleSheet("QToolButton{background-image: url(images/btn_bg); border:none}");
}
Logger::~Logger()
{
}
void Logger::setNumber(int logNumber)
{
number=logNumber;
}
void Logger::createButtons()
{
QLayout * layout = new QHBoxLayout;
QSpacerItem *spacer = new QSpacerItem(120, 31, QSizePolicy::Maximum, SizePolicy::Maximum);
num.setStyleSheet("color: white; font: bold 16px");
num.setText(QString::number(number));
layout->addWidget(&num);
layout->addItem(spacer);
button->setLayout(layout);
}
OriginalL'auteur Frank | 2012-10-01
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas entièrement certain de ce que vous essayez d'atteindre... mais que votre problème se trouve avec ces deux lignes:
Dans la documentation de la classe QWidget elle affirme que:
C'est là votre problème. Ne me croyez pas, ajouter cette vérification avant de ces deux lignes de code.
Source: QVBoxLayout De Référence De Classe
La QVBoxLayout classe de lignes de widgets à la verticale.
Cette classe est utilisée pour construire la boîte verticale objets de mise en page. Voir QBoxLayout pour plus de détails.
L'utilisation la plus simple de la classe est comme ceci:
Tout d'abord, nous créons les widgets que nous voulons dans la mise en page. Ensuite, nous créons un QVBoxLayout objet et ajouter des widgets dans la mise en page. Enfin, nous appelons QWidget::setLayout() pour installer le QVBoxLayout objet sur le widget. À ce stade, les widgets dans la mise en page sont à nouveau apparentés à avoir la fenêtre de leur parent.
Critique source d'erreur dans votre projet:
Widgets devrait être construit sur le tas, car ils seront supprimés automatiquement lorsque leurs parents sont supprimées. Vous avez un widget personnalisé de classe que vous instanciez sur le tas. Les membres devraient aussi aller sur le tas. Aussi, vous devriez envisager d'utiliser le parent /enfant, la hiérarchie de votre code de GUI pour assurer une bonne gestion de la mémoire et de la bonne suppression.
Le morceau de code que vous ajoutez retourne la mise en page de la Mainwindow, non? Si j'utilise
viewport.layout()
au lieu delayout()
, il doenst obtenir le qDebug partie de la première fois que je clique sur le bouton importer.Lire mes modifications. En particulier la dernière section sur les widgets et des tas/pile d'allocation de mémoire. Espère que vous aide.
Thx! En effet, quand j'ai changé le
QLabel num
, qui est à la disposition desbutton
, à un pointeur, les problèmes ont disparu!OriginalL'auteur stackunderflow
Dans mon expérience, si votre programme s'arrête en
RtlFreeHeap
c'est un bon signe de corruption de la mémoire.Lors de l'appel de
centralWidget
prend possession deimport_btn
. Cela signifie que, lorsquecentralWidget
est supprimé (ce qui arrive dans le cadre dedelete ui;
dans votreMainWindow
's destructeur), il va appelerdelete
sur votre variable de membre de!Ce qui conduit à la corruption de la mémoire.
Vous devez répartir votre
QPushButton
's dynamiquement, non pas comme une simple variable membre. Afin de les rendreQPushButton*
.import_btn
n'était pas le problème, mais les boutons qui ont été importés par ce bouton. Dans lelogger.h
j'ai déclaré unbutton*
avec une mise en page sur elle, et cette mise en page d'unQLabel num
. Quand j'ai changé de ce pointeur, les problèmes ont disparu. Donc à partir de maintenant je suis seulement d'utiliser des pointeurs dans les mises en page. Merci tout le monde pour l'aide!OriginalL'auteur Johannes S.
Voici comment je l'ai fait à partir de mainwindow.cpp, grâce à vous et à cette question: Comment créer un bon de sortie bouton dans qt
Fonctionne parfaitement 😀
OriginalL'auteur thewisenerd