mein QMainWindow verursacht absturz der Anwendung

Alles rund um die Programmierung mit Qt
Antworten
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

mein QMainWindow verursacht absturz der Anwendung

Beitrag von defenderLQ »

hi

ich habe was implementiert nun passiert beim ausführen der function ein crash.

also hier mein ChatWindow.cpp

Code: Alles auswählen

#include <QtGui>

#include "rshare.h"
#include "ChatWindow.h"
#include "config/gconfig.h"
#include "QtChatAvatarFrame.h"

#include <QTextCodec>
#include <QTextEdit>
#include <QToolBar>
#include <QTextCursor>
#include <QTextList>


/* Define the format used for displaying the date and time */
#define DATETIME_FMT  "MMM dd hh:mm:ss"

#include <sstream>


/** Default constructor */
ChatWindow::ChatWindow(QWidget *parent, Qt::WFlags flags)
  : QMainWindow(parent, flags)

{
  /* Invoke Qt Designer generated QObject setup routine */
  ui.setupUi(this);

  GConfig config;
  config.loadWidgetInformation(this);
  
  _isAvatarFrameOpened = true;
  
  	//creates sub widgets
	_avatarFrame = new QtChatAvatarFrame(this);
	////


  connect(ui.lineEdit, SIGNAL(returnPressed( ) ), this, SLOT(sendChat( ) ));

  connect(ui.colorButton, SIGNAL(clicked()), this, SLOT(setColor()));
  
  connect(ui.textboldButton, SIGNAL(clicked()), this, SLOT(textBold()));
  
  connect(ui.textunderlineButton, SIGNAL(clicked()), this, SLOT(textUnderline()));
  
  connect(ui.textitalicButton, SIGNAL(clicked()), this, SLOT(textItalic()));
  
  connect(ui.avatarFrameButton, SIGNAL(clicked()), SLOT(avatarFrameButtonClicked()));


  addAvatarFrame();




}



/** 
 Overloads the default show() slot so we can set opacity*/

void
ChatWindow::show()
{
  //loadSettings();
  if(!this->isVisible()) {
    QMainWindow::show();

  }
}

void ChatWindow::closeEvent (QCloseEvent * event)
{


 QMainWindow::closeEvent(event);
}

void ChatWindow::setColor()
{
    QColor col = QColorDialog::getColor(Qt::green, this);
    if (col.isValid()) {

        ui.colorButton->setPalette(QPalette(col));
        QTextCharFormat fmt;
        fmt.setForeground(col);
        mergeFormatOnWordOrSelection(fmt);
        colorChanged(col);
    }
}

void ChatWindow::textBold()
{
    QTextCharFormat fmt;
    fmt.setFontWeight(ui.textboldButton->isChecked() ? QFont::Bold : QFont::Normal);
    mergeFormatOnWordOrSelection(fmt);
}

void ChatWindow::textUnderline()
{
    QTextCharFormat fmt;
    fmt.setFontUnderline(ui.textunderlineButton->isChecked());
    mergeFormatOnWordOrSelection(fmt);
}

void ChatWindow::textItalic()
{
    QTextCharFormat fmt;
    fmt.setFontItalic(ui.textitalicButton->isChecked());
    mergeFormatOnWordOrSelection(fmt);
}

void ChatWindow::currentCharFormatChanged(const QTextCharFormat &format)
{
    fontChanged(format.font());
    colorChanged(format.foreground().color());
}
   
void ChatWindow::mergeFormatOnWordOrSelection(const QTextCharFormat &format)
{
    QTextCursor cursor = ui.textBrowser->textCursor();
    if (!cursor.hasSelection())
        cursor.select(QTextCursor::WordUnderCursor);
    cursor.mergeCharFormat(format);
    ui.textBrowser->mergeCurrentCharFormat(format);
}

void ChatWindow::fontChanged(const QFont &f)
{
    //comboFont->setCurrentIndex(comboFont->findText(QFontInfo(f).family()));
    //comboSize->setCurrentIndex(comboSize->findText(QString::number(f.pointSize())));
    ui.textboldButton->setChecked(f.bold());
    ui.textunderlineButton->setChecked(f.italic());
    ui.textitalicButton->setChecked(f.underline());
}



void ChatWindow::colorChanged(const QColor &c)
{
    QPixmap pix(16, 16);
    pix.fill(c);
    ui.colorButton->setIcon(pix);
}


void ChatWindow::updateChat()
{
	/* get chat off queue */

	/* write it out */

}



void ChatWindow::addChatMsg()
{
        
}


void ChatWindow::sendChat()
{

}


void ChatWindow::avatarFrameButtonClicked() {
	if (_isAvatarFrameOpened) {
		removeAvatarFrame();
	} else {
		addAvatarFrame();
	}
}


void ChatWindow::addAvatarFrame() {
	QBoxLayout * glayout = dynamic_cast<QBoxLayout *>(layout());
	_avatarFrame->setVisible(true);
	//_avatarFrame->setMinimumSize(64, 0);
	glayout->insertWidget(1, _avatarFrame);

	_isAvatarFrameOpened = true;
	ui.avatarFrameButton->setIcon(QIcon(":images/show_toolbox_frame.png"));
	update();
}

void ChatWindow::removeAvatarFrame() {
	QBoxLayout * glayout = dynamic_cast<QBoxLayout *>(layout());
	_avatarFrame->setVisible(false);
	_avatarFrame->setMinimumSize(0, 0);
	glayout->removeWidget(_avatarFrame);

	_isAvatarFrameOpened = false;
	ui.avatarFrameButton->setIcon(QIcon(":images/hide_toolbox_frame.png"));
	update();
}


void ChatWindow::updateUserAvatar() {

	QPixmap pixmap;
	//std::string myData = _cChatHandler.getCUserProfile().getUserProfile().getIcon().getData();
	//pixmap.loadFromData((uchar *)myData.c_str(), myData.size());
	_avatarFrame->setUserPixmap(pixmap);
}
chatwindow.h:

Code: Alles auswählen

#ifndef _CHATWINDOW_H
#define _CHATWINDOW_H


#include "ui_ChatWindow.h"

#include "rsiface/rsiface.h"

#include <QDialog>

class QtChatAvatarFrame;
class QAction;
class QTextEdit;
class QTextCharFormat;

class ChatWindow : public QMainWindow
{
  Q_OBJECT

public:
  /** Default constructor */
  ChatWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
  /** Default destructor */

  void updateChat();
  void addChatMsg();

public slots:
  /** Overloaded QWidget.show */
  void show();

protected:
  void closeEvent (QCloseEvent * event);
  
private slots:

  void setColor();
    
  void textBold();
  void textUnderline();
  void textItalic();

  void sendChat();
  
  void currentCharFormatChanged(const QTextCharFormat &format);

  void avatarFrameButtonClicked();
  
private:

  

  void mergeFormatOnWordOrSelection(const QTextCharFormat &format);
  void fontChanged(const QFont &f);
  
  void colorChanged(const QColor &c);
  
  void addAvatarFrame();
  void removeAvatarFrame();
  //void updateAvatarFrame();
  void updateUserAvatar();
  
  bool _isAvatarFrameOpened;
  
  QtChatAvatarFrame * _avatarFrame;
  
   QAction     *actionTextBold;
   QAction     *actionTextUnderline;
   QAction     *actionTextItalic;
   
   //std::string dialogId, dialogName;
   //unsigned int lastChatTime;
   //std::string  lastChatName;
  
  /** Qt Designer generated object */
  Ui::ChatWindow ui;
};

#endif
das ChatWindow.ui is ein reines QMainWindow also
habs nicht umbenant von einer anderen klasse...

beim compilieren kommt kein einziger fehler...

aber beim ausführen von:


Code: Alles auswählen

void MessagesDialog::eventsButtonClicked()
{
    ChatWindow * chatwin = new ChatWindow();
    chatwin->show();
}
schlies sich die anwendung kommt ein error:
Bild
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Dass ist auch ein grund warum es versionieruns programme gibt..
gehe einfach zuruck zur version wo es noch gefunkt hat... mache dir eine diff zur letzte version... und bei den differenzen mit http://doc.trolltech.com/4.2/qtglobal.html#Q_ASSERT oder

http://doc.trolltech.com/4.2/qtglobal.html#Q_ASSERT_X

oder

http://doc.trolltech.com/4.2/qtglobal.html#qWarning


Code: Alles auswählen


bool vorhanden =  is_file(filefullpath);
Q_ASSERT(vorhanden)

wenn was false kommt zeigt dir assert welche line file ecc... fast besser als Exception (zumindest die Exception die ich von PHP kenne in qt sind Exception nur mehr arbeit... wass nicht noetig ist wenn es andere sehr gute tool gibt..)
.........................
speack português italiano deutsch english castellà qt
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Warum verwendest du eigentlich keinen Debugger? Und warum immer den Fehlerdialog als Screenshot? Oder denkst du daß wir die Fehlermeldung nicht verstehen, wenn der Ok-Button nicht da ist?
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

hi

ich hab kein plan wo das problem ist..
hatte gedacht erst sind paar funktionen die es machen...

aber dann habe ein ganz neues gemacht mit diesen neuen AvatarFrame
und AvatarWidget...

das sin sourcen die das ChatWindow auch noch nutzt fürs Avatar frame.

Code: Alles auswählen

#include "QtChatAvatarFrame.h"
#include "QtChatAvatarWidget.h"

#include <QtGui/QtGui>

#include <stdio.h>

QtChatAvatarFrame::QtChatAvatarFrame(QWidget * parent)
	: QWidget(parent) {

	ui.setupUi(this);
	setMinimumWidth(70);
	QGridLayout * glayout = dynamic_cast<QGridLayout *>(ui.remoteAvatarFrame->layout());
	glayout->setSpacing(0);
	glayout->setMargin(0);
}

void QtChatAvatarFrame::setUserPixmap(QPixmap pixmap) {

	QPixmap background = QPixmap(":images/avatar_background.png");

	if (!pixmap.isNull()) {
		QPainter painter(&background);
		painter.drawPixmap(5, 5, pixmap.scaled(60, 60, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
		painter.end();
		ui.userAvatar->setPixmap(background);
	} else {
		ui.userAvatar->setPixmap(background);
	}
}

void QtChatAvatarFrame::addRemoteContact(const QString & id, const QString & displayName, const QString & contactId, QPixmap avatar) {

	if (!_contactIdList.indexOf(id)) {
		return;
	} else {
		_contactIdList.append(id);
	}

	QtChatAvatarWidget * avatarWidget = new QtChatAvatarWidget(
		ui.remoteAvatarFrame, id, avatar, displayName, contactId, QtChatAvatarWidget::BIG);
	avatarWidget->setupPixmap(avatar);
	
	_widgetList.append(avatarWidget);
	QGridLayout * glayout = dynamic_cast<QGridLayout *>(ui.remoteAvatarFrame->layout());
	glayout->addWidget(avatarWidget, glayout->count(), 0);

	ui.remoteAvatarFrame->setMinimumSize(0, glayout->count() * 70);
}

void QtChatAvatarFrame::removeRemoteContact(const QString & contactId) {

	for (int i = 0; i < _widgetList.size(); i++) {
		if (_widgetList[i]->getContactId() == contactId) {
			QGridLayout * glayout = dynamic_cast<QGridLayout *>(ui.remoteAvatarFrame->layout());
			glayout->removeWidget(_widgetList[i]);
			glayout->update();
			delete _widgetList[i];
			_widgetList.removeAt(i);
		}
	}
	_contactIdList.removeAll(contactId);
}

void QtChatAvatarFrame::updateContact(const QString & id, QPixmap avatar, const QString & displayName) {
	for(int i = 0; i < _widgetList.size(); i++) {
		QtChatAvatarWidget * chatAvatarWidget = _widgetList[i];
		if (chatAvatarWidget->getContactId() == id) {
			chatAvatarWidget->setupPixmap(avatar);
			chatAvatarWidget->setToolTip(displayName);
		}
	}
}


und .h:

Code: Alles auswählen

#ifndef CHATAVATARFRAME_H
#define CHATAVATARFRAME_H

#include "ui_AvatarFrame.h"

#include <QtGui/QWidget>
#include <QtCore/QList>
#include <QtCore/QStringList>

class QHBoxLayout;
class QtChatAvatarWidget;


class QtChatAvatarFrame : public QWidget {
	Q_OBJECT
public:

	QtChatAvatarFrame(QWidget * parent);

	void setUserPixmap(QPixmap pixmap);

	void addRemoteContact(const QString & id, const QString & displayName, const QString & contactId, QPixmap avatar);

	void removeRemoteContact(const QString & contactId);

	void updateContact(const QString & id, QPixmap avatar, const QString & displayName);

private:

	typedef QList<QtChatAvatarWidget*> WidgetList;

	WidgetList _widgetList;

	QVBoxLayout * _layout;

	Ui::AvatarFrame ui;

	QStringList _contactIdList;
};

#endif	//CHATAVATARFRAME_H
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Und jetzt? Wie sollen wir das testen? Was sagt der Debugger?
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

hi

ich habe doch kein debugger?
du meinst die binary debuggen?

kann man da überhaupt was sehen?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

defenderLQ hat geschrieben:ich habe doch kein debugger?
Den brauchst Du aber. Ohne kannst Du das programmieren gleich sein lassen.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Braucht er nicht, er kann auch den Code so lange auskommentieren, bis kein Fehler mehr kommt. Er ist ja noch jung und hat Zeit...
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Dann weiß er wo der Fehler auftritt, aber immer noch nicht warum. Dann kann man natürlich anfangen und sich alle relevanten Werte ausgeben lassen, sei es per Konsole oder Messagebox. Man muss schon sehr viel Zeit und Geduld haben um sich das an zu tun.
heizer_2
Beiträge: 7
Registriert: 15. September 2008 19:51

Beitrag von heizer_2 »

Hallo, ist zwar lange her, aber ich hatte gestern selber ein ähnliches Problem.
Die Lösung bzw. das Problem liegt im unten angezeigten Code.
Das Überladen des show() slots fürht zu der Schutzverletzung. Ersetzt man QMainWindow::show(); durch QMainWindow::setVisible(true); funktioniert es.
Laut Doku sind show() und setVisible(true); äquivalent.

Code: Alles auswählen

/**
 Overloads the default show() slot so we can set opacity*/

void
ChatWindow::show()
{
  //loadSettings();
  if(!this->isVisible()) {
    QMainWindow::show();

  }
} 
Antworten