PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [QT] Problem mit QTable::currEditRow() weil protected



fraggo01
20-08-2004, 14:12
Hallo,

ich hab ein kleines Problem mit QTable::currEditRow.
Damit möchte ich die aktuelle zeile in der tabelle herausfinden.
Nur sagt mir der kompiler, das diese methode protected sei.

aufrufen tu ich sie mit "int selectedRow = table -> currEditRow()"
Muss ich die irgendwie anders aufrufen?

Hatte ves auch schon mit currentRow() probiert.
Das hat auch eigentlich gut funktioniert.
Bloss das nimmt den wert der letzten zeile, obwohl ich nix in der tabelle selektiert habe und ist somit leider unbrauchbar für mich.

Vielen dank im vorraus für eure hilfe und geduld mit mir.

axeljaeger
20-08-2004, 14:31
Ich denke die einzige Möglichkeit wird sein, von QTable zu erben und die Funktionalität entweder in einer neuen Memberfunktion unterzubringen oder die Methode nach außen forwarden.

fraggo01
20-08-2004, 15:11
so ungefähr?



class Table : public QTable
{
public:
Table();
~Table();
};

Die currEditRow() methode müsste doch jetzt verfügbar sein?
Bin noch ziemlich der noob, was vererbung, kunstruktor, pointer usw. angeht. :(

Muss ich dann nicht die komplette Tabelle mit dieser Klasse erstellen?

fraggo01
20-08-2004, 15:53
Hab schon nen relativ guten erfolg gehabt.
Nur funktionierts nicht wie es soll.
So wird immer die erste zeile gelöscht:



class Table : public QTable
{
public:
Table(){QTable::QTable();}
int currEditRow();
};



int Table::currEditRow()
{
QTable::currEditRow();
return 0;
}

undefined
20-08-2004, 16:52
Die klasse muss von QWidget abgeleitet sein ;)
zu dem macht es wenig sin ein Table Klasse so einzubinden.

//HEADER
class QTable;

class Table : public QWidget
{
Q_OBJECT
public:
Table(QWidget *parent = 0, const char *name = 0);
QTable* Tabelle;
~Table();
int currEditRow();
};


#include <qtable.h>

Table::Table(QWidget *parent, const char *name)
{
Tabelle = new QTable( this, "Tabelle" );
}
Hoffe es stimmt was ich da jetzt schnell hingeschrieben habe ;)

fraggo01
20-08-2004, 18:45
Hab es jetzt so:

header datei:

class QTable;

class Table : public QWidget
{
Q_OBJECT
public:
Table(QWidget *parent = 0, const char *name = 0)
{
tabelle = new QTable( this, "tabelle" );
}
QTable* tabelle;
~Table();
int currEditRow();
};

So rufe ich es auf:

Table tabelle(table);
int selectedRow = tabelle.currEditRow();

Fehler:

g++ -o tool .obj/main.o .obj/settings.o .obj/tvtool.o .obj/moc_settings.o .obj/moc_tvtool.o -L/usr/lib/qt3//lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
.obj/tvtool.o(.text+0x2a8c): In function `mainform::del_clicked()':
: undefined reference to `Table::currEditRow()'
.obj/tvtool.o(.text+0x2b1c): In function `mainform::del_clicked()':
: undefined reference to `Table::~Table [in-charge]()'
.obj/tvtool.o(.text+0x2b67): In function `mainform::del_clicked()':
: undefined reference to `Table::~Table [in-charge]()'
.obj/moc_settings.o(.gnu.linkonce.r._ZTV5Table+0x20): undefined reference to `Table::~Table [in-charge]()'
.obj/moc_settings.o(.gnu.linkonce.r._ZTV5Table+0x24): undefined reference to `Table::~Table [in-charge deleting]()'
.obj/moc_settings.o(.gnu.linkonce.r._ZTV5Table+0x1c8): undefined reference to `non-virtual thunk [nv:-40] to Table::~Table [in-charge]()'
.obj/moc_settings.o(.gnu.linkonce.r._ZTV5Table+0x1cc): undefined reference to `non-virtual thunk [nv:-40] to Table::~Table [in-charge deleting]()'
collect2: ld returned 1 exit status
make: *** [tool] Fehler 1

undefined
21-08-2004, 00:31
Jetzt nicht böse gemeint aber du machst gravierende Anfänger Fehler. Das sieht man daran das du nicht weist wie man eine Klasse anspricht. So etwas jetzt hier im Forum breitschlagen wäre einfach zu viel - Tip - Buch Kaufen und erst mal Lesen ;) Das zweite was mir auffällt ist das deine Projekte anscheinend nicht richtig erstellt werden. Du hast Linker Fehler. Ich habe hier ein Faulenzer Script das ich immer bei kleineren QT Testanwendungen nehme. Erstelle damit erst einmal ein Paar kleiner Anwendungen und sehe dir den Code an.

#!/bin/bash
#
################################################## ##########################
# License: GPL 2
# Version: 0.1.0
# Requires: gnu(gcc), make, qmake, progen, uic, sed, grep
# SriptName: qtgen.sh
# Author: undefined <undefined@flashbattle.de>
# Kurz-Beschreibung: Erstellt aus einer UI-Komponente eine
# Projektdatei und Makefile. Generiert eine
# QT-Standard main.cpp zum Testen der Anwendung
#
# Beschreibung: Dieses Script ist nur dafuer gedacht dem Programmierer beim
# Testen kleinerer Anwendungen zu Helfen die nur aus einer
# einzelnen UI-Komponente bestehen.
################################################## ##########################
# @author undefined
# @since 18.08.2004
# @short Suche nach Klassenname in *.ui und Pruefe ob ein Projektname
# angegeben wurde.
if [ -n "$2" ];then
if [ -r "$2.ui" ];then
cat $2.ui| grep '<class>[0-9a-zA-Z]*</class>' |
sed -e 's;.*<class>\([0-9a-zA-Z]*\).*;\1;' > .tmp
fi
CLASSNAME="`cat .tmp | grep '[0-9a-zA-Z]*'`"
PROJEKT=$2
else
echo " Bitte setze den Projektnamen als zweiten Parameter!"
echo " Beispiel: $0 help ProjektName"
exit 1;
fi

# @author undefined
# @since 18.08.2004
# @short Ausfuehrliche Ausgabe der Hilfe
hilfe()
{
echo "Ausfuehrliche Beschreibung der Parameter.."
echo " gen ( Erstelle main.cpp $PROJEKT.pro Projekt Datei und Makefile. )"
echo " autogen ( Wie \"gen\" zusaetzlich mit \"make\" und Programm ausfuehren. )"
echo " make_start ( Neu Compilieren und Programm ausfuehren. )"
echo " clean ( Projekt Normal aufraeumen *.pro und Makefile bleiben erhalten. )"
echo " clean_full ( Alles entfernen Inklusive (*.pro *.cpp *.h und Makefile) entfernen )"
echo " convert ( Generiere aus der *.ui Datei eine *.h und *.cpp Datei )"
echo " start ( Programm Ausfuehren)"
echo "Beispiel:"
echo "$0 gen ProjektName"
}

# @author undefined
# @since 18.08.2004
# @short Suche nach QMake von QT3
# checkQMake=`qmake -v | grep 'Qmake'`
# if [ ! -n "$checkQMake" ]; then
# echo "Kann das Programm \"qmake\" nicht finden!"
# exit 1;
# fi

# @author undefined
# @since 18.08.2004
# @short Suche nach uic Anwendung von QT3
# checkUic=`uic -version`
# if [ ! -n "$checkUic" ]; then
# echo "Kann das Programm \"uic\" nicht finden!"
# exit 1;
# fi

# @author undefined
# @since 18.08.2004
# @short Wenn kein "progen" vorhanden dann Handmade
template()
{
echo "TEMPLATE = app
CONFIG = qt warn_on release debug
HEADERS = `ls -f $1.ui.h`
SOURCES = main.cpp
INTERFACES = `ls -f $1.ui`
TARGET = $1
" > $1.pro
}

# @author undefined
# @since 18.08.2004
# @short Projekt erstellen mit progen
makepro()
{
checkProgen=`progen -n`
if [ -n "$checkProgen" ]; then
progen -d . -lower -n $PROJEKT -o $PROJEKT.pro
else
template $PROJEKT
fi
}

# @author undefined
# @since 18.08.2004
# @short
aufraeumen()
{
make clean
rm -f $PROJEKT.pro Makefile *.cpp $PROJEKT.h .tmp
if [ -x "$PROJEKT" ]; then
rm $PROJEKT
fi
}

# @author undefined
# @since 18.08.2004
# @short
convertui()
{
if [ -r "$PROJEKT.ui" ]; then
uic -o $PROJEKT.h $PROJEKT.ui
uic -o $PROJEKT.cpp -i $PROJEKT.h $PROJEKT.ui
else
echo "Keine $PROJEKT.ui vorhanden!"
exit 1;
fi
}

# @author undefined
# @since 18.08.2004
# @short
makemain()
{
echo "/************************************************** ***************/
/* Generate with \"qtgen.sh\" */
/* License: GPL 2 Version: 0.1.0 */
/* Author: undefined <undefined@flashbattle.de> */
/************************************************** ***************/
// Erstellt am `date +"%d %m %Y %H:%I:%M"`

#include <qapplication.h>
#include \"$1.h\"

int main( int argc, char **argv )
{
QApplication a( argc, argv );

$2 w;
a.setMainWidget( &w );
w.show();
return a.exec();
}
" > main.cpp
}

# @author undefined
# @since 18.08.2004
# @short Erstelle Makefile
makefile()
{
if [ -r "$PROJEKT.pro" ]; then
qmake -unix $PROJEKT.pro -o Makefile
fi
}

# @author undefined
# @since 18.08.2004
# @short Starte Anwendung
startpro()
{
if [ -x "$PROJEKT" ];then
echo "Starte $PROJEKT"
./$PROJEKT
fi
}

# @author undefined
# @since 18.08.2004
case "$1" in
'gen')
echo "Erstelle main.cpp fuer Klasse: $CLASSNAME ..."
makemain $PROJEKT $CLASSNAME
echo "Erstelle Projekt Datei.."
makepro
echo "Erstelle Makfile.."
makefile
;;
'autogen')
if [ -e "Makefile" ];then
aufraeumen
fi
echo "Starte autogen fuer Klasse: $CLASSNAME ..."
if [ -e "main.cpp" ];then
TestMain="`cat main.cpp | grep $PROJEKT.h`"
if [ ! -n "$TestMain" ];then
makemain $PROJEKT $CLASSNAME
fi
else
makemain $PROJEKT $CLASSNAME
fi
makepro && makefile && make && startpro
;;
'make_start')
make && startpro
;;
'clean')
make clean
;;
'clean_full')
aufraeumen
;;
'convert')
convertui
;;
'start')
startpro
;;
'help')
hilfe
;;
*)
echo "Falsche Parameter Angabe. Verwende:"
echo "$0 {gen|autogen|make_start|clean|clean_full|convert|s tart|help} ProjektName"
echo "Beispiel: $0 help ProjektName"
exit 1
;;
esac

exit;
PS:

int selectedRow = tabelle->currEditRow(); :)

anda_skoa
21-08-2004, 06:06
Die klasse muss von QWidget abgeleitet sein ;)

Das ist sie ohnehin wenn sie von QTable ableitet, QTable ist schliesslich ein QWidget.

Bishen aufpassen, wenn du einem Anfänger hilft, der macht dann sowas wie du unten vorgeschlagen hast.

@fraggo01: Irgend ein spezieller Grund, warum du currentSelection() nicht benutzen kannst?

Ciao,
_

fraggo01
21-08-2004, 10:46
Jetzt nicht böse gemeint aber du machst gravierende Anfänger Fehler.
Da bin ich bestimmt nicht böse, bin halt noch der vollnoob. :rolleyes:
Probleme mit ansprechen von "komplizierten" klassen...
Auf jeden fall. Vor allem wenn konstruktoren usw gebraucht werden, da könnt ich graue haare kriegen.

Ein buch kann ich mir leider nicht unbedingt leisten, wollte eigentlich versuchen es mit hilfe des inets zu schaffen.
Habe da, denke ich, auch mehr oder weniger gute quellen.
irgendwie habe ich auch immer alles mit hilfe des inets lösen können.



Irgend ein spezieller Grund, warum du currentSelection() nicht benutzen kannst?

Na ja, wenn ich in der tabelle keine zeile selektiere, dann wird die letzte zeile der tabelle gelöscht.
Das soll aber nicht sein...
Hab schon überlegt wie ich das abfangen könnte, wenn die tabelle nicht fokussiert ist, kann ja eigentlich nichts selektiert sein.
Ansonsten hat currentSelection() einwandfrei funktioniert.

anda_skoa
21-08-2004, 11:20
Na ja, wenn ich in der tabelle keine zeile selektiere, dann wird die letzte zeile der tabelle gelöscht.
Das soll aber nicht sein...


Vielleicht hast du irrtümlich den Rückgabewert von currentSelection() nicht geprüft, ob das -1 ist, also keine Selection vorliegt.

Ciao,
_

fraggo01
21-08-2004, 12:00
Sorry bin wohl durcheinander gekommen mit currentRow() und currentSelection().
Jetzt gehts mit currentSelection(), vielen dank, für eure Hilfe. :)