Seite 1 von 1

mein QMainWindow verursacht absturz der Anwendung

Verfasst: 11. Mai 2007 23:20
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

Verfasst: 12. Mai 2007 11:08
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..)

Verfasst: 12. Mai 2007 13:32
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?

Verfasst: 12. Mai 2007 13:34
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

Verfasst: 12. Mai 2007 15:50
von upsala
Und jetzt? Wie sollen wir das testen? Was sagt der Debugger?

Verfasst: 14. Mai 2007 15:38
von defenderLQ
hi

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

kann man da überhaupt was sehen?

Verfasst: 14. Mai 2007 15:46
von macman
defenderLQ hat geschrieben:ich habe doch kein debugger?
Den brauchst Du aber. Ohne kannst Du das programmieren gleich sein lassen.

Verfasst: 14. Mai 2007 19:47
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...

Verfasst: 15. Mai 2007 07:12
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.

Verfasst: 31. März 2009 09:39
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();

  }
}