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_*/
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);
}
}
}
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
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);
textview.h:17: error: cannot call member function 'void QTextEdit::setLineWrapMode(QTextEdit::LineWrapMode)' without object
Kann mir jemand meinen Knoten lösen helfen?