Seite 1 von 5

[solved] SLOTS anderer Klassen nutzen

Verfasst: 15. Mai 2006 19:10
von daniel_23
Erstmal an alle hier Moin!

Ich hab erst vor einiger Zeit angefangen mit dem C#/Qt Programmieren,
und hab daher noch einige generelle Probleme. Es waere Klasse wenn mir hier jemand weiterhelfen koennte!

Mein Problem lautet wie folgt:
Ich habe 2 verschiedene Klassen in 2 verschiedenen Headern definiert (kscan.h und kscanwidget.h),
in der kscanWidget Klasse ist ein SLOT definiert (button_clicked()), diesen moechte ich nun in ein PopupMenu einbinden.
Das Menu ist jedoch in der kscan.cpp Datei definiert, also hab ich dort einen Slot erstellt (push_button()), und in diesem versuche ich den SLOT aus kscanWidget aufzurufen:

Code: Alles auswählen

void kscan::push_button()
{
	KStatusBar *status = statusBar();
	status->message("Scan hat begonnen",50000);

	kscanWidget widget1;
	widget1.button_clicked();
}
Klappt bloz leider so nich, obwohl der SLOT button_clicked() gefunden wird.

Das ist lediglich der momentane Stand, das Aufrufen des SLOTS push-button() durch das Menu funktioniert, das Problem besteht lediglich in dem SLOT aus der anderen Klasse.
Ich habe schon soo viel ausprobiert, und nie kommt das gewollte Resultat :-(
Ich waere echtmal mega dankbar wenn mir einer von euch weiter helfen koennte!

Verfasst: 15. Mai 2006 20:13
von patrik08
mit emit ... kannst du ein signal aus-senden bei class a und bei b aufnehmen...

http://doc.trolltech.com/4.1/signalsandslots.html



beispiel.....

Code: Alles auswählen

/* oefne ein dialog um file zu downloaden ... */
void  GuiMain::Wget_File(int pos , QString u , QString f , QString user , QString pass )
{
    get_file = new Gui_Wget(this);
    get_file->show();
    get_file->OrderGetUrl(u,f,user,pass);
    connect( get_file, SIGNAL( ready_action() ), this, SLOT( incomming_next() ) ); 
}



/*  das dialog wen den download fertig ist  kommt emit ready_action(); */
void Gui_Wget::httpRequestFinished(int requestId, bool error)
{
    if (httpRequestAborted) {
        if (file) {
            file->close();
            file->remove();
            delete file;
            file = 0;
        }

        progressDialog->setValue(1);
        return;
    }

    if (requestId != httpGetId)
        return;
    
    file->close();

    if (error) {
        file->remove();
        QMessageBox::information(this, tr("HTTP"),tr("Download failed: %1.").arg(http->errorString()));
    } else {
        progressDialog->setMaximum(100);
        progressDialog->setMinimum(0);
        progressDialog->setValue(100);
        statusLabel->setText(tr("Downloaded %1 success.").arg(currentfile));
        emit ready_action();
        
    }
    
    downloadButton->setEnabled(true);
    stopButton->setEnabled(false);
    delete file;
    file = 0;
}

/* bei der untere class geht es dann weiter mit  dem naechsten file oder die nachste action wenn alle file da sind */

void  GuiMain::incomming_next()
{
    get_file->accept();
    if (current_position_wget > 0 && current_position_wget < total_db_file_import + 1) {
    current_position_wget++;
    Setup_File(current_position_wget);
    }
    if (current_position_wget == total_db_file_import + 1) {
    msgb->information( this , tr("Download Message:"),tr( "Download Sucessfull %1 File.." ).arg( int2char(total_db_file_import) ) );
    QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
    ExecSQLInsert_File(TABLE_CITY_ONE);
    PaintTable("citta",0);   
    QApplication::restoreOverrideCursor(); 
    }  
}


so downloaden 2 dialogen x file classe a gibt den file classe b holt es und geht zu naechsten..... 2 class mit einem emit dazwischen....

Verfasst: 15. Mai 2006 20:29
von daniel_23
Besten Dank fuer deine schnelle Hilfe!

Ich hab jetz meine kscanwidged.cpp so geaendert:

Code: Alles auswählen

kscanWidget::kscanWidget(QWidget* parent, 
					 const char* name,
					 WFlags fl)
        : kscanWidgetBase(parent,name,fl)
{
	kscan main1 = new kscan(this);
	QObject::connect(&main1, SIGNAL(pushed()),this, SLOT(button_clicked()));
}
und in der kscan.cpp:

Code: Alles auswählen

void kscan::push_button()
{
	KStatusBar *status = statusBar();
	status->message("Who is this bastard?",50000);

	emit pushed();
}
Nur leider krieg ich ein:

Code: Alles auswählen

kscanWidget::kscanWidget(QWidget*, const char*, unsigned int)':
/daten/skripte/kdevelop/kscan/kscan/src/kscanwidget.cpp:33: error: `kscan' undeclared (first use this function)
/daten/skripte/kdevelop/kscan/kscan/src/kscanwidget.cpp:33: error: (Each undeclared identifier is reported only once for each function it appears in.)
/daten/skripte/kdevelop/kscan/kscan/src/kscanwidget.cpp:33: error: Syntaxfehler before `=' token
/daten/skripte/kdevelop/kscan/kscan/src/kscanwidget.cpp:35: error: `main1' undeclared (first use this function)
gmake[2]: *** [kscanwidget.o] Fehler 1
gmake[2]: Das Target »all« wurde wegen Fehlern nicht aktualisiert.
gmake[1]: *** [all-recursive] Fehler 1
gmake: *** [all] Fehler 2
*** Exited with status: 2 ***
Kscan ist anscheinend aus kscanWidget nicht erreichbar.

Sry das ich euch mit solch trivialen Problemen langweile, aber aller Anfang ist schwer, und die deutschsprachigen Dokus rar!

Verfasst: 15. Mai 2006 21:07
von patrik08
wenn du bereits... Q_OBJECT im header hast dann weg mit "QObject::"

connect(main1, SIGNAL(pushed()),this, SLOT(button_clicked()));

wenn es ein QPushButton ist (main1) dan clicked() nicht pushed ..

oder wenn du auf dem ganzen widged ein signal willst (rechstclick..)

main1->setContextMenuPolicy(Qt::CustomContextMenu);
connect(main1, SIGNAL(customContextMenuRequested(QPoint)),this, SLOT(button_clicked()) );

aber eben ich kann nicht erraten was main1 ist oder kscan? was fuer objekt...

ich mache die dialoge so auf
void Gui_Front::OpenAbout()
{
Gui_About::self( this )->exec();
}

mit der class template von http://qt4ds-monkey.sourceforge.net/


was hast debian linux?

poste doch das resultat...
terminal ...
uname -a
qmake -v

Verfasst: 15. Mai 2006 21:21
von patrik08
ich nehme an das du dein kscanwidgetbase.ui auf qt4 portieren moechtest?
von deine homepage....

poste die neue kscanwidgetbase.ui mit qt 4 gemacht ... und ich mache dir das gerippe .. wo du nur die funktionen reinschreiben kannst ...
so ein port scanner ist Interessant.... auch fuer meinen mac ....

Heute ist mac Ja auch Linux!

uname -a
Darwin mac-ppk-go.local 8.6.0 Darwin Kernel Version 8.6.0: Tue Mar 7 16:58:48 PST 2006; root:xnu-792.6.70.obj~1/RELEASE_PPC Power Macintosh powerpc

obwohl er tiger heisst...

Verfasst: 15. Mai 2006 21:45
von daniel_23
main1 soll der click von dem QPushbutton fuer den whois Befehl sein, halt im menu.
Allerdings konnte ich das Signal clicked() nicht connecten, das muss irgendwo in der vom Designer generierten .ui Datei sein. Und ist nicht in der kscanWidget Klasse definiert.
Da hab ich auch keine Ahnung wie ich da rankommen kann...

in der .ui Datei scheinen auch nur die SLOTS definiert zu sein:

Code: Alles auswählen

$ uic3 src/kscanwidgetbase.ui | grep clicked
    virtual void button_clicked();
    virtual void button_clicked2();

Code: Alles auswählen

$ uname -a 
Linux graveyard 2.6.16-gentoo-r6 #1 PREEMPT Sun May 7 11:48:14 Local time zone must be set--see z i686 AMD Athlon(tm) 64 Processor 3000+ GNU/Linux

Code: Alles auswählen

$ qmake -v
QMake version: 2.00a
Using Qt version 4.1.2 in /usr/lib/qt4

Verfasst: 15. Mai 2006 22:04
von patrik08
uic3 du uebersetz ein qt4 ui zu qt3...

du must die Ui nicht uebersetzen! das macht das ****.pro file...

uic -o ui_gui_main.h gui_main.ui (mit qt4!)

wichtig ist die form ui im ***..pro file zu haben

FORMS += ui/gui_main.ui ui/gui_about.ui ui/gui_contex.ui
und bei qmake && make macht qt4 so....
uic -o ui_gui_main.h gui_main.ui

somit musst du dich nur noch auf die class konzentrieren...

class GuiMain : public QMainWindow, public Ui::GuiMain
die Ui::GuiMain kommt dann vom ui file....



beim ui namen kommt ein ui_ zufor....
poste deine neue ui die du mit qt4 gemacht hast... vom portscanner....

Verfasst: 15. Mai 2006 22:16
von daniel_23
Wie die neue .ui Datei?
Die wurd wie gesagt von dem Designer erstellt.

Code: Alles auswählen

$ uic -o ui_kscanwidgetbase.h kscanwidgetbase.ui
uic: File generated with too old version of Qt Designer
File 'kscanwidgetbase.ui' is not valid
nur dieser uic3 befehl spuckt einen Code aus

Verfasst: 15. Mai 2006 22:35
von patrik08
Ja das sage ich doch die ganze zeit ....!!!
du machst ein qt4 e qt3 salat....

ich mache dir die basis file der structur..... in 5-10 minuten... vom qt3 file...

bereite subversion ein....

falls es nicht kenst das versionierung software ....

auf genttoo...

emerge -av subversion
http://gentoo-wiki.com/HOWTO_Subversion
ist einfach.....

Verfasst: 15. Mai 2006 22:37
von daniel_23
Ich benutz subversion schon fuer Compiz, mal schaun obs leicht geht sich nen eigenen zu erstellen .....

Also ne schnellere Aktion scheint das auf keinen fall zu sein, du kannst dir ja auch nen Archiv von meiner seite ziehen, das geht bestimmt fixer...

Ich hab zwar jetz ne Reposity im Hoimedir, aber was nun?

Verfasst: 15. Mai 2006 23:11
von patrik08
also nun hast du eine stabile basis....

terminal:

source dateien holen...

cd /ordnerdev
svn co http://ciz.ch/svnciz/xls2sql/kscaner/ kscaner
cd kscaner && qmake && make

an einen anderen subversion server geben...

cd ..
svn export kscaner new_kscaner
svn add new_kscaner/*
svn commit -m "notiz commit" new_kscaner

e voila....

Verfasst: 15. Mai 2006 23:27
von daniel_23
Danke!
Allerdings weiz ich noch nich ob mir das weitrerhelfen wird, ich versuch mal meinen code in das gerüst einzubauen oder mir was abzugucken.

Oder muss ich nur die .ui datei uebernehmen?

Und das ursprüngliche problem ist für mich ja net gelöst. Hat ja sonst alles wunderbar geklappt mit kdevelop, ob dieser error jetz an nem versionenproblem liegt?
an einen anderen subversion server geben...

cd ..
svn export kscaner new_kscaner
svn add new_kscaner/*
svn commit -m "notiz commit" new_kscaner
wofuer das?
"svn add new_kscaner/*" spuckt auch nen error aus

Verfasst: 15. Mai 2006 23:39
von patrik08
nun musst du nur noch ein sauberes whois oder nmap machen mit qprocess...

Code: Alles auswählen


/* slot hinzufuegen....  */

void KscanMain::Whois_IP()
{
    /*  die ip aus dem feld holen ....  */
   Qstring ip = ip_from_user->text()
   /* deine regular expression von qt3 testen ob ip ist? */
    if (ip.size() > 0) {
    
    QProcess process;
    process.setReadChannelMode(QProcess::MergedChannels);
    process.start("whois" ,  QStringList() << ip);
   
    if (!process.waitForFinished()) {
       QMessageBox::information( this , "QT4 function test", process.errorString() );
    } else {
      QMessageBox::information( this , "QT4 function test", process.readAll() ); 
    }

   /*  oder process.readAll() zum text fenster senden.... */


 }
     
} 



Verfasst: 15. Mai 2006 23:46
von daniel_23
Wie hast du denn die .ui Datei erstellt?
Ich mag tags nich so gern, kann ich die .h datei bearbeiten und wieder in eine .ui datei umwandeln?

Verfasst: 15. Mai 2006 23:47
von patrik08
wie geht den nmap?
port scan?

nmap servername ... richtig?

bei firewall geht das ne ewig keit....
gibt es ne bessere methode?