Beenden Sie die Anwendung in Qt
Ich gebaut habe, eine app in Qt enthält zwei Schaltflächen: eine exit-Taste und eine Schaltfläche "importieren". Wenn die Schaltfläche "importieren" gedrückt wird, wird eine Liste von Schaltflächen, die angezeigt wird, in eine scrollarea auf dem Bildschirm (die Datei Logger.csv Daten enthält 1;2;3;4;5;).
Es funktioniert alles gut, aber wenn ich drücken Sie die exit-Taste (die natürlich Sie sollte in der Nähe alles), die app ist nicht richtig gestoppt (stop-Taste der Qt ist immer noch aktiv und die play-Taste nicht). Wenn ich den debugger starten, und drücken Sie die exit-Taste gibt es einen Fehler: Ungültige Adresse angegeben, um RtlFreeHeap( 0ADF0000, 0028FE40 ). Kann mir keiner helfen?
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
#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);
}
}
logger.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);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht ganz sicher, was Sie versuchen zu erreichen... aber dein problem liegt mit diesen beiden Zeilen:
In der Dokumentation für die QWidget-Klasse heißt es, dass:
Dies ist, wo Ihr problem liegt. Glauben Sie mir nicht, fügen Sie diese überprüfen, bevor Sie die zwei Zeilen code.
Quelle: QVBoxLayout Klasse Referenz
Den QVBoxLayout Klasse Linien widgets vertikal.
Diese Klasse wird verwendet, um zu konstruieren vertical-box-layout-Objekte. Sehen QBoxLayout für details.
Die einfachste Verwendung der Klasse ist wie folgt:
Erstes erstellen wir die widgets wollen wir in das layout. Dann erstellen wir die QVBoxLayout-Objekt und fügen Sie die widgets in das layout. Schließlich rufen wir QWidget::setLayout (), um die Installation QVBoxLayout-Objekt auf das widget. An diesem Punkt werden die widgets in das layout reparented zum Fenster haben, wie Ihre Eltern.
Wichtige Quelle der Fehler in Ihrem Projekt:
Widgets gebaut werden sollte auf dem heap, da Sie automatisch gelöscht werden, wenn Ihre Eltern gelöscht. Sie haben eine benutzerdefinierte widget-Klasse, die Sie instanziieren, die auf dem heap. Die Mitglieder sollten auch auf dem heap. Außerdem sollten Sie mithilfe der parent /child-Hierarchie in der GUI-code, um sicherzustellen, die richtige Speicher-management und die ordnungsgemäße Löschung.
viewport.layout()
stattlayout()
es doenst man die qDebug Teil das erste mal, dass ich klicken Sie auf die Schaltfläche "importieren".QLabel num
, die in das layout vonbutton
, um einen Zeiger, der die Probleme waren Weg!In meiner Erfahrung, wenn Sie Ihr Programm nicht in
RtlFreeHeap
es ist ein gutes Zeichen von Speicher Korruption.Beim Aufruf
centralWidget
nimmt Besitz vonimport_btn
. Das bedeutet, dass, wenncentralWidget
gelöscht wird (das geschieht als Teil derdelete ui;
in IhremMainWindow
's destructor), wird aufgerufendelete
auf Ihre member-variable!Dies führt zu den gemeldeten Speicher Korruption.
Müssen Sie reservieren Ihre
QPushButton
's dynamisch, nicht wie ein normaler member-Variablen. So machen SieQPushButton*
.import_btn
war nicht das problem, aber die Tasten, die importiert wurden, indem Sie diese Taste. In derlogger.h
ich erklärtbutton*
mit einem layout auf es, und in dieser Anordnung eineQLabel num
. Wenn ich dies geändert, um einen Zeiger, der auf die Probleme Weg waren. Von nun an geht nur Im Pointer in layouts. Thx an alle für die Hilfe!Hier ist, wie ich es von mainwindow.cpp Dank und Frage: So erstellen Sie eine richtige exit-Taste in qt
Funktioniert einwandfrei 😀