[QT] Wieso funktioniert es nur mit dem Dialog und nicht mit dem pixmapLabel ?
-
hi
Habe gerade erst mit QT angefangen habe aber folgendes Verständnis Problem wieso funktioniert das:
#include <qevent.h> #include <qpainter.h> #include <qpixmap.h> void dialog::mouseMoveEvent( QMouseEvent *mouse) { QPainter paint(this); QPoint pos = mouse->pos(); if ((mouse->state()&LeftButton)) { paint.drawPoint(pos.x(), pos.y()); } }
aber das nicht:
#include <qevent.h> #include <qpainter.h> #include <qpixmap.h> void pixmapLabel::mouseMoveEvent( QMouseEvent *mouse) { QPainter paint(this); QPoint pos = mouse->pos(); if ((mouse->state()&LeftButton)) { paint.drawPoint(pos.x(), pos.y()); } }
Wie erreiche ich denn das ich auf ein pixmap Label malen kann mittels mouseMoveEvent ?
Als Fehler escheint immer error: Syntaxfehler before `::' tokenMFG
basic
-
du hast die klasse pixmapLabel nicht definiert, die musst du vorher selber definieren und über eine include einbinden, ansonsten ist der code ok... das setzt beim ersten aber auch vorraus, dasss du die klasse dialog definiert hast...
-
hmm.. hab dialog auch nicht definiert mind. nicht das ich das wüsste.
jetzt hab ich mal zwei dateien einmal die datei frm_main.h mit folgenden Inhalt:class drawbox : public QWidget { public: drawbox( QWidget *parent=0, const char *name=0 ); void mouseMoveEvent(QMouseEvent* event); };
und eine Datei frm_main.ui.h
#include <qevent.h> #include <qpainter.h> #include <qpixmap.h> #include "frm_main.h" void drawbox::mouseMoveEvent( QMouseEvent *mouse) { QPainter paint(this); QPoint pos = mouse->pos(); if ((mouse->state()&LeftButton)) { paint.drawPoint(pos.x(), pos.y()); } }
jetzt erscheint folgender Fehler:
*.obj/moc_frm_main.o(.gnu.linkonce.r._ZTV8frm_main+0x128): undefined reference to `frm_main::mouseMoveEvent(QMouseEvent)'
collect2: ld returned 1 exit status
**
Falls es vielleicht wichtig ist ich erstelle die Widgets mittels QT Designer.MFG
basic
-
ist wohl ein linker-fehler, die MOC wird auf alle Fälle erstellt, das ist schon mal gut... Wie linkst du dann dein Programm?? Hast du ein qmake-Projekt geschrieben, wenn ja, zeig die File mal... Ansonsten zeig mal, die du ld/g++ aufrufst... Hier liegt es wohl daran, dass die Datei, in der du mouseMoveEvent implementiert hast, nicht mit gelinkt wird...
-
also erstellen tue ich es mit qmake und dann make.
hier mal die project file:unix { UI_DIR = .ui MOC_DIR = .moc OBJECTS_DIR = .obj } TEMPLATE = app LANGUAGE = C++ CONFIG += qt warn_on release SOURCES += main.cpp FORMS = src/qt-ui/frm_main.ui
und hier noch die erstellte Makefile
############################################################################# # Makefile for building: lcd # Generated by qmake (1.07a) (Qt 3.3.0) on: Tue May 11 09:42:05 2004 # Project: lcd.pro # Template: app # Command: $(QMAKE) -o Makefile lcd.pro ############################################################################# ####### Compiler, tools and options CC = gcc CXX = g++ LEX = flex YACC = yacc CFLAGS = -pipe -Wall -W -O2 -DQT_NO_DEBUG CXXFLAGS = -pipe -Wall -W -O2 -DQT_NO_DEBUG LEXFLAGS = YACCFLAGS= -d INCPATH = -I/usr/qt/3/mkspecs/linux-g++ -I. -I$(QTDIR)/include -I.ui/ -Isrc/qt-ui -I.moc/ LINK = g++ LFLAGS = -Wl,-rpath,$(QTDIR)/lib LIBS = $(SUBLIBS) -L$(QTDIR)/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm AR = ar cqs RANLIB = MOC = $(QTDIR)/bin/moc UIC = $(QTDIR)/bin/uic QMAKE = qmake TAR = tar -cf GZIP = gzip -9f COPY = cp -f COPY_FILE= $(COPY) COPY_DIR = $(COPY) -r DEL_FILE = rm -f SYMLINK = ln -sf DEL_DIR = rmdir MOVE = mv -f CHK_DIR_EXISTS= test -d MKDIR = mkdir -p ####### Output directory OBJECTS_DIR = .obj/ ####### Files HEADERS = SOURCES = main.cpp OBJECTS = .obj/main.o \ .obj/frm_main.o FORMS = src/qt-ui/frm_main.ui UICDECLS = .ui/frm_main.h UICIMPLS = .ui/frm_main.cpp SRCMOC = .moc/moc_frm_main.cpp OBJMOC = .obj/moc_frm_main.o DIST = lcd.pro QMAKE_TARGET = lcd DESTDIR = TARGET = lcd first: all ####### Implicit rules .SUFFIXES: .c .o .cpp .cc .cxx .C .cpp.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .cc.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .cxx.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .C.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .c.o: $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< ####### Build rules all: Makefile $(TARGET) $(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) $(OBJCOMP) mocables: $(SRCMOC) uicables: $(UICDECLS) $(UICIMPLS) $(MOC): ( cd $(QTDIR)/src/moc && $(MAKE) ) Makefile: lcd.pro /usr/qt/3/mkspecs/linux-g++/qmake.conf $(QMAKE) -o Makefile lcd.pro qmake: @$(QMAKE) -o Makefile lcd.pro dist: @mkdir -p .obj/lcd && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .obj/lcd/ && $(COPY_FILE) --parents src/qt-ui/frm_main.ui.h .obj/lcd/ && ( cd `dirname .obj/lcd` && $(TAR) lcd.tar lcd && $(GZIP) lcd.tar ) && $(MOVE) `dirname .obj/lcd`/lcd.tar.gz . && $(DEL_FILE) -r .obj/lcd mocclean: -$(DEL_FILE) $(OBJMOC) -$(DEL_FILE) $(SRCMOC) uiclean: -$(DEL_FILE) $(UICIMPLS) $(UICDECLS) yaccclean: lexclean: clean: mocclean uiclean -$(DEL_FILE) $(OBJECTS) -$(DEL_FILE) *~ core *.core ####### Sub-libraries distclean: clean -$(DEL_FILE) $(TARGET) $(TARGET) FORCE: ####### Compile .obj/main.o: main.cpp .ui/frm_main.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/main.o main.cpp .ui/frm_main.h: src/qt-ui/frm_main.ui $(UIC) src/qt-ui/frm_main.ui -o .ui/frm_main.h .ui/frm_main.cpp: .ui/frm_main.h src/qt-ui/frm_main.ui $(UIC) src/qt-ui/frm_main.ui -i frm_main.h -o .ui/frm_main.cpp .obj/frm_main.o: .ui/frm_main.cpp src/qt-ui/frm_main.ui.h \ .ui/frm_main.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/frm_main.o .ui/frm_main.cpp .obj/moc_frm_main.o: .moc/moc_frm_main.cpp .ui/frm_main.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/moc_frm_main.o .moc/moc_frm_main.cpp .moc/moc_frm_main.cpp: $(MOC) .ui/frm_main.h $(MOC) .ui/frm_main.h -o .moc/moc_frm_main.cpp ####### Install install: uninstall:
Die Datei frm_main.h habe ich übrigends per Hand angelegt. Vielleicht liegt es ja daran ?
MFG
basic
-
ich sehe gerade, dass du pixmapLabel::mouseMoveEvent in der include frm_main.ui.h implementiert hast, kann nicht gehen... diese funktion muss in eine cpp-file rein, erstmal kannst du die in die main.cpp stecken, später in eine extra file wie z.b. pixmaplabel.cpp (mit in die projekt-datei eintragen!!)
arbeitest du mit dem Qt Designer?
-
also jetzt sieht es folgender Masse aus:
die Datei main.cpp mit folgenden Inhalt:#include <qapplication.h> #include "frm_main.h" #include "src/qt-ui/frm_main.ui.h" #include <qevent.h> #include <qpainter.h> #include <qpixmap.h> int main( int argc, char ** argv ) { QApplication a( argc, argv ); frm_main w; w.show(); a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); return a.exec(); } void pixmapLabel::mouseMoveEvent( QMouseEvent *mouse) { QPainter paint(this); QPoint pos = mouse->pos(); if ((mouse->state()&LeftButton)) { paint.drawPoint(pos.x(), pos.y()); } }
und die Datei src/qt-ui/frm_main.ui.h
class pixmapLabel : public QWidget { public: pixmapLabel( QWidget *parent=0, const char *name=0 ); void mouseMoveEvent(QMouseEvent* event); };
Jetzt erscheint zwar kein Fehler aber auf die Funktion reagiert er überhaupt nicht mehr !
Irgendwie verstehe ich da was Grundlegendes nicht
Und ich arbeite mit dem QT Designer zusammen. Habe ich oben aber schonmal erwähnt.
Aber vielleicht kennt du ja noch ein gutes QT Buch was nicht veraltet ist und schlecht geschrieben ist. Die ich bei amazon gefunden habe waren entweder zu alt oder haben sehr miserable Bewertungen bekommen.MFG
basic
-
jetzt check ich wieder mal was nicht, wieso hast du überhaupt mouseMoveEvent in pixmapLabel drinne?? erzeugt deine main-form ein pixmapLabel?? das muss es natürlich, ansonsten wird mouseMoveEvent nie aufgerufen... wenn du in deiner main-form klasse die funktion einbaust, dann geht das, weil in deiner main-form ja das event auftritt, dass die maus bewegt wird... die funktion wird aber nur aufgerufen, wenn die maus über dem widget bewegt wurde.
wenn nun pixmapLabel nicht erzeugt wird oder nicht mit resize() eine bestimmte größe hat, wo man die maus drüber bewegen kann, dann wird dort logischerweise mouseMoveEvent nie aufgerufen...
-
Also das pixmapLabel habe ich mittels QT Designer erstellt vorhanden ist es sehen kann ich es ja auch.
Das einzige was ich machen will das ich wenn ich über das pixmapLabel rüberfahre mit der Maus und linke Taste drücke das was gezeichnet wird so wie ein Pinsel.
Wenn ich das mit der Main Fenster mache dann funktioniert das ja. Aber nicht mit dem pixmapLabel. Hoffe jetzt ist es mehr verständicher.MFG
basic