Seite 1 von 1

Problem mit Namespace?

Verfasst: 2. Juni 2007 15:26
von qtNiko
schon hab' ich ein neues Problem:

In meinem Qt4-Programm möchte ich diverse Textdateien einfach nur ansehen können. Dazu erstellte ich mit QtDesigner4 ein Widget mit einem TextEdit, einer CheckBox zur Auswahl Zeilenumbruch oder nicht und einem PushButton zum Beenden. Mein Qt-Buch empfiehlt QTextEdit, wenn man reinen ASCII-Text darstellen möchte.
Das so erstellte Widget heißt TextView.

Irgendetwas habe ich aber noch nicht kapiert, denn der Compiler/Linker meldet mir leider unverständliche Fehler.

Zuerst der Code für textview.h:
(ich habe nachträglich Zeilennr. eingefügt als Bezug zu den Fehlermeldungen später)

Code: Alles auswählen

#ifndef TEXTVIEW_H_
#define TEXTVIEW_H_

#include "ui_textview.h"	/* enthaelt alle noetigen includes, hoffentlich */

class TextViewer : public QWidget, private Ui::TextView
7:{
	Q_OBJECT
	
	public:
	TextViewer(QWidget *parent=0);
	
	private slots:
	void on_pButtonOK_clicked()		/* autoconnect,inline */
	{   close();	};
	void on_chBoxZeilenumbr_toggled(bool zustand)	/* autoconnect, inline */
17:	{ if (zustand) setLineWrapMode (QTextEdit::WidgetWidth);  //* public function of QTextEdit *//
18:		else setLineWrapMode (QTextEdit::NoWrap);	};
};

#endif /*TEXTVIEW_H_*/
Hier noch ein Auszug aus der Datei ipcsimu.cpp, meiner Hauptanwendung (wieder mit Zeilennr.):

Code: Alles auswählen

#include <QtGui>
#include <iostream>
#include <QFile>
#include "ipcsimu.h"
#include "textview.h"

ipcSimuDesign::ipcSimuDesign(QMainWindow *parent) : QMainWindow(parent)
{		/* Constructor von ipcSimuDesign, meiner Hauptanwendung */
	setupUi(this);
	...
}

TextViewer::TextViewer(QWidget *parent) : QWidget(parent) {  /* Constructor von TextViewer */
	setupUi(this);
	
	setAttribute(Qt::WA_DeleteOnClose);
} 
...
void ipcSimuDesign::viewDateien(int buttNr)
{  /* das ist ein Slot, der von einem SignalMapper aufgerufen wird */
	... hier wird u.a. fName mit Inhalt belegt

	QFile inFile(fName);
	QString readText;
 	if (inFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
 		QTextStream inText(&inFile);
170 		TextViewer viewFile = new TextViewer(this);	/* neuer TextEditor */
171 		viewFile->show();
 		if (buttNr==1 | buttNr==2) {  /* alles auf einmal lesen und ausgeben */
 			readText = inText.readAll();
174 			viewFile->insertPlainText(readText);
 		}
 		else while (!inText.atEnd()) { /* zeilenweise lesen und ausgeben */
 			readText = inText.readLine();
178 			viewFile->insertPlainText(readText);
 		}
 	}
}
Und jetzt die Fehlermeldungen:

Code: Alles auswählen

textview.h: In member function 'void TextViewer::on_chBoxZeilenumbr_toggled(bool)':
textview.h:17: error: 'setLineWrapMode' was not declared in this scope
textview.h:18: error: 'setLineWrapMode' was not declared in this scope
/usr/local/Trolltech/Qt-4.2.3/include/QtGui/qwidget.h: In copy constructor 'TextViewer::TextViewer(const TextViewer&)':
/usr/local/Trolltech/Qt-4.2.3/include/QtGui/qwidget.h:670: error: 'QWidget::QWidget(const QWidget&)' is private
textview.h:7: error: within this context
ipcsimu.cpp: In member function 'void ipcSimuDesign::viewDateien(int)':
ipcsimu.cpp:170: note: synthesized method 'TextViewer::TextViewer(const TextViewer&)' first required here 
ipcsimu.cpp:170: error:   initializing temporary from result of 'TextViewer::TextViewer(QWidget*)'
ipcsimu.cpp:171: error: base operand of '->' has non-pointer type 'TextViewer'
ipcsimu.cpp:174: error: base operand of '->' has non-pointer type 'TextViewer'
ipcsimu.cpp:178: error: base operand of '->' has non-pointer type 'TextViewer'
ipcsimu.cpp: At global scope:
make: *** [ipcsimu.o] Fehler 1
Die Fehlermeldungen zu ipcsimu.cpp halte ich für Folgefehler, weil der Compiler die Klasse nicht übersetzen konnte, oder?

Ich verstehe nicht, warum der Compiler im File textview.h eine Deklaration von setLineWrapMode() erwartet. Das ist definitiv eine public function von QTextEdit.
Und die Fehlermeldung zu Zeile 7 verstehe ich auch nicht. Heißt dies, dass ich den Konstruktor mit falschem Parameter aufrufe?
Aber laut QtAssistant und allen Beispielen ist das richtig so?

Der Versuch, die Zeile 17 von textview.h so zu schreiben:

Code: Alles auswählen

{ if (zustand) QTextEdit::setLineWrapMode (QTextEdit::WidgetWidth);
endet allerdings im Fehler
textview.h:17: error: cannot call member function 'void QTextEdit::setLineWrapMode(QTextEdit::LineWrapMode)' without object

Kann mir jemand meinen Knoten lösen helfen?

Verfasst: 3. Juni 2007 00:42
von Christian81
Die Klasse ist von QWidget und nicht von QTextEdit abgeleitet