[gelöst] Dialoge starten

Alles rund um die Programmierung mit Qt
Antworten
eule3
Beiträge: 56
Registriert: 30. Juni 2005 23:13

[gelöst] Dialoge starten

Beitrag von eule3 »

hallo

Mit QT3 habe ich mir ein paar Dialoge gebastelt.
Da aber bald QT4 kommt bin ich nun dabei diese Dialoge
in KDevelop Projekte einzubauen. Mittlerweile schaffe ich es
meine Dialoge als Hauptfenster anzuzeigen.
Jetzt arbeite ich gerade mit einen vorgefertigten KDevelop-Projekt
das eine fertige Anwendung erzeugt. Über einen Menüpunkt
soll nun mein alter QT-Dialog angezeigt werden.
Und hier komme ich nicht weiter.
[Irgendwie ist da alles anders als in meinen Büchern :D ]
Vielleicht findet jemand die Zeit mir zu helfen.







PS
Falls der Moderator mitliest :)
In einen anderen Forum steht ein Hinweis das Du
Lehrgänge anbietest. Stimmt das noch?
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Es kommt ja immer darauf an, was du genau von einem Dialog verlangst.

Handelt es sich um einen Setup Dialog, der Werte in einer Config speichert, oder brauchst du Rückgabewerte wie bei einem FileDialog? (Rhetorische Frage)

Ach ja, Qt4 ist bereits in 4.0.1 da.

Also ich mache jetzt keine speziellen, professionell vertriebene Kurse, immer nur ab und an, wenn einer einen speziellen Qt-Kurs haben möchte. Hauptsächlich mache ich das für meine eigenen Leute. Aber so etwas wäre für mich ziemlich unproblematisch auszumachen.
eule3
Beiträge: 56
Registriert: 30. Juni 2005 23:13

Beitrag von eule3 »

Hallo

Danke für die Antwort

>Es kommt ja immer darauf an, was du genau von einem Dialog verlangst.

>Handelt es sich um einen Setup Dialog, der Werte in einer Config >speichert, oder brauchst du Rückgabewerte wie bei einem FileDialog? >(Rhetorische Frage)

Ich glaube bei rhetorischen Fragen erwartet man keine Antwort.
Mein Chef gibt mir aber bei der "sozialen Kompetenz" immer
Punktabzug und somit antworte ich trotzdem:

Der erste Dialog soll Werte vom Benutzer abfragen und diese
in Variablen speichern, so das sie von nachfolgenden Funktionen
und Dialogen verarbeitet werden können.

Mit QT3 hat das so funktioniert:

show
//neu = new neu_base(this);
//neu->show();
//neu->setActiveWindow();

exec
//neu_base neu(this);
//neu.exec();

>Ach ja, Qt4 ist bereits in 4.0.1 da.
ja, leider



>Also ich mache jetzt keine speziellen, professionell vertriebene Kurse, >immer nur ab und an, wenn einer einen speziellen Qt-Kurs haben möchte. >Hauptsächlich mache ich das für meine eigenen Leute. Aber so etwas wäre >für mich ziemlich unproblematisch auszumachen.
Also ich hätte Interesse.
Wo ist denn der Lehrgangsort?
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Ja, also zu der Dialogproblematik, hier einmal ein kurzes Beispiel, für die meist gebräuchliche Art eines Dialoges:

Code: Alles auswählen

MyDialog::MyDialog( QWidget *parent ) : QDialog( parent ) {

  // fill with data;
}

bool MyDialog::getResult( QWidget *parent ) {

  MyDialog *dlg = new MyDialog( parent );
  return dlg -> exec();
}
Definiert ist dabei getResult als public static

Jetzt kann man das natürlich beliebig fortsetzen, indem man den Dialog Wert in einem int result speichert und dann danach handelt.

Der Wert wird mit dem public slots accept() und reject() aus der QDialog Klasse gesteuert.

Mein Büro ist in Amberg.
eule3
Beiträge: 56
Registriert: 30. Juni 2005 23:13

Beitrag von eule3 »

Hallo

Ja, also zu der Dialogproblematik, hier einmal ein kurzes Beispiel, für die meist gebräuchliche Art eines Dialoges:

Code: Alles auswählen

MyDialog::MyDialog( QWidget *parent ) : QDialog( parent ) {

  // fill with data;
}

bool MyDialog::getResult( QWidget *parent ) {

  MyDialog *dlg = new MyDialog( parent );
  return dlg -> exec();
}
Danke. Eigentlich habe ich es so geschrieben.
Trotzdem bekomme ich vom Compiler die meldung das er
die Methode exec nicht kennt.

Es muss doch irgendwo eine idiotensichere Anleitung geben
wie man ein *.ui -File zu Leben erweckt ?
:cry:
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Natürlich gibt es die.
http://doc.trolltech.com/4.0/designer-u ... t-approach

Er kennt Exec nicht, weil du nicht von QDialog ableitest.
eule3
Beiträge: 56
Registriert: 30. Juni 2005 23:13

Dialoge starten

Beitrag von eule3 »

Nun funktioniert es [Hurra]
Bei mir war MyDialog.ui schon auf QWidget aufgebaut.

Code: Alles auswählen

MyDialog::MyDialog( QWidget *parent ) : QDialog( parent ) 

{
  // fill with data;
}

bool MyDialog::getResult( QWidget *parent ) 
{
  MyDialog *dlg = new MyDialog( parent );
  return dlg -> exec();
}
Noch eine kleine Frage:
Wie "zerstört" man dlg nach Gebrauch?
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Das macht Qt selbst.
eule3
Beiträge: 56
Registriert: 30. Juni 2005 23:13

Dialoge starten

Beitrag von eule3 »

Hallo

FlorianBecker hat geschrieben:Das macht Qt selbst.
Ja, das habe ich befürchtet. :D
Ich bekomme nun immer einen "Segmentions Fehler" oder
irgendwas mit ähnlich schlimmen Begriffen wenn ich den
Dialog mehrmals starte. Und das war meine letzte Hoffnug
das es vieleicht eine einfache Lösung geben würde.

Gibt es Vorschläge wie man sowas in den griff bekommt?

mfg
dani
Beiträge: 28
Registriert: 11. August 2005 22:22

Re: Dialoge starten

Beitrag von dani »

eule3 hat geschrieben:Hallo

Ja, das habe ich befürchtet. :D
Ich bekomme nun immer einen "Segmentions Fehler" oder
irgendwas mit ähnlich schlimmen Begriffen wenn ich den
Dialog mehrmals starte. Und das war meine letzte Hoffnug
das es vieleicht eine einfache Lösung geben würde.

Gibt es Vorschläge wie man sowas in den griff bekommt?

mfg
Ich kann dir nur helfen, wenn du unter Linux arbeitest. Wenn du einen segmentation fault hast, kannst du das als debug-Version kompilieren ("OPTIONS += debug" in der .pro) und dann über "gdb ./meinprogramm" starten. (Eventuell musst du gdb installieren.)

Dann startest du dein Programm mit "run", bringst es zum Absturz und gibtst "where" ein. Dann siehtst du, wo der Fehler lag.

Du kannst auch ein kleines Programm mit dem Fehler hochladen, dann schau ich es mir an.
eule3
Beiträge: 56
Registriert: 30. Juni 2005 23:13

Re: Dialoge starten

Beitrag von eule3 »

Hallo

Ich kann dir nur helfen, wenn du unter Linux arbeitest.

Suuuuuuper ! Ich arbeite unter Suse Linux 9.3


Wenn du einen segmentation fault hast, kannst du das als debug-Version kompilieren ("OPTIONS += debug" in der .pro) und dann über "gdb ./meinprogramm" starten. (Eventuell musst du gdb installieren.)

Besteht die Möglichkeit das auch mit KDevelop zu machen?

Du kannst auch ein kleines Programm mit dem Fehler hochladen, dann schau ich es mir an.[/quote]

Was ist klein?



mfg
eule3
Beiträge: 56
Registriert: 30. Juni 2005 23:13

Dialoge starten (Jetzt Segmentation fault)

Beitrag von eule3 »

Hallo

Ich habe in KDevelop einfach mal auf Debuggen|Start geklickt.
Mein Programm wurde ausgeführt. Im Fehlerfall gab es eine Meldung
mit folgenden Text:
===============================================
Program received signal SIGSEGV, Segmentation fault.
===============================================


während mein Programm lief gab es jede Menge Meldungen.
Die hänge ich hinten an (Ist eine Menge Holz)

Nach Eingabe von where bekam ich folgende
Ausgabe:


===============================================
(gdb) where
#0 0x40e67c74 in my_strcasecmp_8bit () from /usr/lib/libmysqlclient.so.14
#1 0x40e5f226 in get_charset_number () from /usr/lib/libmysqlclient.so.14
#2 0x40e5f93b in get_charset_by_csname () from /usr/lib/libmysqlclient.so.14
#3 0x40e79771 in mysql_real_connect () from /usr/lib/libmysqlclient.so.14
#4 0x40e228d9 in QMYSQLDriver::open () from /usr/lib/qt3/plugins/sqldrivers/libqsqlmysql.so
#5 0x40e22e2a in QMYSQLOpenExtension::open () from /usr/lib/qt3/plugins/sqldrivers/libqsqlmysql.so
#6 0x405321b6 in QSqlDriver::open () from /usr/lib/libqt-mt.so.3
#7 0x4052352e in QSqlDatabase::open () from /usr/lib/libqt-mt.so.3
#8 0x08057354 in eingabe1::createConnections (this=0x815cc18) at eingabe1.cpp:130
#9 0x08057c5f in eingabe1 (this=0x815cc18, parent=0x40e83ba0, name=0x40e83ba0 "\b", modal=false, fl=1088961440) at eingabe1.cpp:9
#10 0x0804f48b in ringdatenbank::eingabe (this=0x80d97c8) at ringdatenbank.cpp:312
#11 0x0805b6c4 in ringdatenbank::qt_invoke (this=0x80d97c8, _id=68, _o=0xbfffe950) at moc_ringdatenbank.cpp:110
#12 0x402b4e7e in QObject::activate_signal () from /usr/lib/libqt-mt.so.3
#13 0x406083f2 in QSignal::signal () from /usr/lib/libqt-mt.so.3
#14 0x402d2353 in QSignal::activate () from /usr/lib/libqt-mt.so.3
#15 0x403c5748 in QPopupMenu::mouseReleaseEvent () from /usr/lib/libqt-mt.so.3
#16 0x402eb3e5 in QWidget::event () from /usr/lib/libqt-mt.so.3
#17 0x40251d5f in QApplication::internalNotify () from /usr/lib/libqt-mt.so.3
#18 0x40254266 in QApplication::notify () from /usr/lib/libqt-mt.so.3
#19 0x401ef50b in QETWidget::translateMouseEvent () from /usr/lib/libqt-mt.so.3
#20 0x401ee146 in QApplication::x11ProcessEvent () from /usr/lib/libqt-mt.so.3
#21 0x401fec38 in QEventLoop::processEvents () from /usr/lib/libqt-mt.so.3
#22 0x40269e51 in QEventLoop::enterLoop () from /usr/lib/libqt-mt.so.3
#23 0x40269c96 in QEventLoop::exec () from /usr/lib/libqt-mt.so.3
#24 0x4025394f in QApplication::exec () from /usr/lib/libqt-mt.so.3
#25 0x080536c7 in main (argc=1, argv=0x40e83ba0) at main.cpp:12

===============================================

Ich kann hier nur erkennen das der Fehler in der main.cpp ist.
Die ist aber noch original wie von Kdevelop automatisch erzeugt.
Hier ist sie:

===============================================
#include <qapplication.h>
#include "ringdatenbank.h"

[06] int main( int argc, char ** argv ) {
[07] QApplication a( argc, argv );
[08] ringdatenbank * mw = new ringdatenbank();
[09] mw->setCaption( "ringdatenbank" );
[10] mw->show();
[11] a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
[12] return a.exec();
[13] }
===============================================


Würde mich freuen wenn mir jemand nun sagen könnte
was nun zu tun ist.
Vielen dank im voraus.






Hier die Ausgabe von gdb als mein Programm lief:
===============================================

/usr/bin/gdb /home/user/ringdatenbank/./bin/ringdatenbank -fullname -nx -quiet
(gdb) set edit off
(gdb) set confirm off
Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb)
(gdb)
(gdb) set print static-members off
(gdb) tty /dev/pts/1
(gdb) set width 0
(gdb) set height 0
(gdb) set stop-on 1
(gdb) handle SIG32 pass nostop noprint
(gdb) handle SIG41 pass nostop noprint
(gdb) handle SIG43 pass nostop noprint
(gdb) set print asm-demangle on
(gdb) set output-radix 10
(gdb) cd /home/user/ringdatenbank/./bin
(gdb) run
[Thread debugging using libthread_db enabled]
[New Thread 1085998368 (LWP 7363)]
Stopped due to shared library event
(gdb) continue
[Switching to Thread 1085998368 (LWP 7363)]
Stopped due to shared library event
(gdb) continue


[.........]
Diese Meldung kommt jetzt ca. 30 mal


Stopped due to shared library event
(gdb) continue

Program received signal SIGSEGV, Segmentation fault.
0x40e67c74 in my_strcasecmp_8bit () from /usr/lib/libmysqlclient.so.14
(gdb) info thread
* 1 Thread 1085998368 (LWP 7363) 0x40e67c74 in my_strcasecmp_8bit () from /usr/lib/libmysqlclient.so.14
(gdb) backtrace
#0 0x40e67c74 in my_strcasecmp_8bit () from /usr/lib/libmysqlclient.so.14
#1 0x40e5f226 in get_charset_number () from /usr/lib/libmysqlclient.so.14
#2 0x40e5f93b in get_charset_by_csname () from /usr/lib/libmysqlclient.so.14
#3 0x40e79771 in mysql_real_connect () from /usr/lib/libmysqlclient.so.14
#4 0x40e228d9 in QMYSQLDriver::open () from /usr/lib/qt3/plugins/sqldrivers/libqsqlmysql.so
#5 0x40e22e2a in QMYSQLOpenExtension::open () from /usr/lib/qt3/plugins/sqldrivers/libqsqlmysql.so
#6 0x405321b6 in QSqlDriver::open () from /usr/lib/libqt-mt.so.3
#7 0x4052352e in QSqlDatabase::open () from /usr/lib/libqt-mt.so.3
#8 0x08057354 in eingabe1::createConnections (this=0x815cc18) at eingabe1.cpp:130
#9 0x08057c5f in eingabe1 (this=0x815cc18, parent=0x40e83ba0, name=0x40e83ba0 "\b", modal=false, fl=1088961440) at eingabe1.cpp:9
#10 0x0804f48b in ringdatenbank::eingabe (this=0x80d97c8) at ringdatenbank.cpp:312
#11 0x0805b6c4 in ringdatenbank::qt_invoke (this=0x80d97c8, _id=68, _o=0xbfffe950) at moc_ringdatenbank.cpp:110
#12 0x402b4e7e in QObject::activate_signal () from /usr/lib/libqt-mt.so.3
#13 0x406083f2 in QSignal::signal () from /usr/lib/libqt-mt.so.3
#14 0x402d2353 in QSignal::activate () from /usr/lib/libqt-mt.so.3
#15 0x403c5748 in QPopupMenu::mouseReleaseEvent () from /usr/lib/libqt-mt.so.3
#16 0x402eb3e5 in QWidget::event () from /usr/lib/libqt-mt.so.3
#17 0x40251d5f in QApplication::internalNotify () from /usr/lib/libqt-mt.so.3
#18 0x40254266 in QApplication::notify () from /usr/lib/libqt-mt.so.3
#19 0x401ef50b in QETWidget::translateMouseEvent () from /usr/lib/libqt-mt.so.3
#20 0x401ee146 in QApplication::x11ProcessEvent () from /usr/lib/libqt-mt.so.3
#21 0x401fec38 in QEventLoop::processEvents () from /usr/lib/libqt-mt.so.3
#22 0x40269e51 in QEventLoop::enterLoop () from /usr/lib/libqt-mt.so.3
#23 0x40269c96 in QEventLoop::exec () from /usr/lib/libqt-mt.so.3
#24 0x4025394f in QApplication::exec () from /usr/lib/libqt-mt.so.3
#25 0x080536c7 in main (argc=1, argv=0x40e83ba0) at main.cpp:12
(gdb) frame 0
#0 0x40e67c74 in my_strcasecmp_8bit () from /usr/lib/libmysqlclient.so.14
Antworten