Its ok becouse you declare baza variable in method Connect_clicked(). After returning from this method you havent access to this variable. For solving you need declare baza as class member
Its ok becouse you declare baza variable in method Connect_clicked(). After returning from this method you havent access to this variable. For solving you need declare baza as class member
a life without programming is like an empty bottle![]()
Lebowski (6th April 2006)
I already have baza declared as class member in povezava.ui.h
It's under povezava.ui.h->members->class variables->public-> QSqlDatabase *baza ;
So why you redeclare it in
Qt Code:
To copy to clipboard, switch view to plain text mode
Right code
Qt Code:
To copy to clipboard, switch view to plain text mode
a life without programming is like an empty bottle![]()
Tried that but still getting segmentation fault in the same way![]()
Compile your application in debug mode and run it from a debugger. When it crashes, print the stack trace and post it here.
I've added "CONFIG += debug" into my project file but the output when my application crashes still says only "Segmentation fault".
This is debug from 'make':
[root@simon dbconn]# make --debug
GNU Make 3.80
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Reading makefiles...
Updating goal targets....
File `first' does not exist.
File `all' does not exist.
Prerequisite `povezava.ui.h' is newer than target `.ui/povezava.cpp'.
Must remake target `.ui/povezava.cpp'.
/usr/lib/qt-3.3/bin/uic povezava.ui -i povezava.h -o .ui/povezava.cpp
Successfully remade target file `.ui/povezava.cpp'.
Prerequisite `.ui/povezava.cpp' is newer than target `.obj/povezava.o'.
Prerequisite `povezava.ui.h' is newer than target `.obj/povezava.o'.
Must remake target `.obj/povezava.o'.
g++ -c -pipe -Wall -W -g -DQT_SHARED -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -I/usr/lib/qt-3.3/mkspecs/default -I. -I/usr/lib/qt-3.3/include -I.ui/ -I. -I.moc/ -o .obj/povezava.o .ui/povezava.cpp
/usr/lib/qt-3.3/include/qsqldatabase.h:63: warning: ‘class QSqlDriverCreatorBase’ has virtual functions but non-virtual destructor
/usr/lib/qt-3.3/include/qtooltip.h:86: warning: ‘class QToolTip’ has virtual functions but non-virtual destructor
Successfully remade target file `.obj/povezava.o'.
Prerequisite `.obj/povezava.o' is newer than target `povezava'.
Must remake target `povezava'.
g++ -o povezava .obj/main.o .obj/glavnoo.o .obj/povezava.o .obj/moc_glavnoo.o .obj/moc_povezava.o -L/usr/lib/qt-3.3/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
Successfully remade target file `povezava'.
Must remake target `all'.
Successfully remade target file `all'.
Must remake target `first'.
Successfully remade target file `first'.
[root@simon dbconn]# ./povezava
Segmentation fault
Just a way to "debug", check everytime before accesing to baza pointer if its null and show a message on screen or on the standard output, for example, in this case.
Last edited by SkripT; 4th April 2006 at 11:27.
Try this:
$ gdb ./povezava
(gdb) run
(some output will go there and eventually the application will segfault)
(gdb) bt
and show us the result of "bt".
Here is what I get with gdb:
(gdb) run
Starting program: /home/simon/projects/dbconn/povezava
Reading symbols from shared object read from target memory...done.
Loaded system supplied DSO at 0xb9e000
[Thread debugging using libthread_db enabled]
[New Thread -1208837664 (LWP 9818)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1208837664 (LWP 9818)]
0x04d45bb5 in QSqlDatabase::isOpen (this=0xffff) at sql/qsqldatabase.cpp:772
772 return d->driver->isOpen();
(gdb) bt
#0 0x04d45bb5 in QSqlDatabase::isOpen (this=0xffff) at sql/qsqldatabase.cpp:772
#1 0x0804bcb0 in GlavnoO::test_clicked (this=0xbff491fc) at .ui/../glavnoo.ui.h:28
#2 0x0804e877 in GlavnoO::qt_invoke (this=0xbff491fc, _id=52, _o=0xbff48af8) at .moc/moc_glavnoo.cpp:87
#3 0x04ab9eb4 in QObject::activate_signal (this=0x9967440, clist=0x9969488, o=0xbff48af8) at kernel/qobject.cpp:2355
#4 0x04aba374 in QObject::activate_signal (this=0x9967440, signal=4) at kernel/qobject.cpp:2324
#5 0x04e39c7e in QButton::clicked (this=0xffff) at .moc/release-shared-mt/moc_qbutton.cpp:152
#6 0x04b59a63 in QButton::mouseReleaseEvent (this=0x9967440, e=0xbff48e54) at widgets/qbutton.cpp:836
#7 0x04af8187 in QWidget::event (this=0x9967440, e=0xbff48e54) at kernel/qwidget.cpp:4699
#8 0x04a550dd in QApplication::internalNotify (this=0xffff, receiver=0x9967440, e=0xbff48e54) at kernel/qapplication.cpp:2635
#9 0x04a5603f in QApplication::notify (this=0xbff49334, receiver=0x9967440, e=0xbff48e54) at kernel/qapplication.cpp:2421
#10 0x049ec746 in QETWidget::translateMouseEvent (this=0x9967440, event=0xbff49118) at kernel/qapplication.h:518
#11 0x049eaf01 in QApplication::x11ProcessEvent (this=0xbff49334, event=0xbff49118) at kernel/qapplication_x11.cpp:3468
#12 0x049ff008 in QEventLoop:rocessEvents (this=0x9944fe0, flags=Variable "flags" is not available.
) at kernel/qeventloop_x11.cpp:192
#13 0x04a6d82b in QEventLoop::enterLoop (this=0x9944fe0) at kernel/qeventloop.cpp:198
#14 0x04a6d736 in QEventLoop::exec (this=0x9944fe0) at kernel/qeventloop.cpp:145
#15 0x04a54aa9 in QApplication::exec (this=0xbff49334) at kernel/qapplication.cpp:2758
#16 0x0804bc31 in main (argc=1, argv=0xbff49414) at main.cpp:19
(gdb) Quit
(gdb)
Can we see the current code too?
Code is still the same as it was in the first post.
Then this code is surely invalid as you have a local variable "baza" which points to the database and a member variable "baza" which points to some garbage which probably causes a crash.
You mean this post?
I tried that but I'm still getting segmentation fault.Originally Posted by zlatko
But the code is different. Run it under debugger again. And please paste the contents of test_clicked() slot.
Hmm, I think I figured out my problem with help from all of you. I need to properly specify 'QSqlDatabase *baza; ' as a global variable. Now the n00b question: how do I do that, please? Tried to do it in my main.cpp but it doesn't work.
No, you don't have to do that. First of all QSqlDatabase::addDatabase() returns an object and not a pointer. And second of all you can access the database later on by calling QSqlDatabase::database(). You don't need a variable to hold that handler. Please read the reference of QSqlDatabase. It's explained there (on the very beginning of the detailed description).
Following that example I changed
Qt Code:
1. void GlavnoO :: pushButton3_clicked() { bool ok = FALSE; ok = povezava.baza->isOpen(); }To copy to clipboard, switch view to plain text mode
to
It compiles normally but it crashes with segmentation fault again when I press that button.Qt Code:
void GlavnoO::pushButton3_clicked() { bool ok = FALSE; ok = baza->isOpen(); }To copy to clipboard, switch view to plain text mode
And I have to use pointers cause I have this in my Qt Assistant QSqlDatabase Reference:
Static Public Members
QSqlDatabase * addDatabase ( const QString & type, const QString & connectionName = defaultConnection )
QSqlDatabase * addDatabase ( QSqlDriver * driver, const QString & connectionName = defaultConnection )
QSqlDatabase * database ( const QString & connectionName = defaultConnection, bool open = TRUE )
void removeDatabase ( const QString & connectionName )
void removeDatabase ( QSqlDatabase * db )
bool contains ( const QString & connectionName = defaultConnection )
QStringList drivers ()
void registerSqlDriver ( const QString & name, const QSqlDriverCreatorBase * creator )
bool isDriverAvailable ( const QString & name )
Notice also the sentence in docs:
So add a check for null pointer:If connectionName does not exist in the list of databases, 0 is returned.
Qt Code:
void GlavnoO::pushButton3_clicked() { bool ok = FALSE; if (baza) { ok = baza->isOpen(); } }To copy to clipboard, switch view to plain text mode
J-P Nurmi
Lebowski (6th April 2006)
Yep, that solves the segmentation fault. But I would still like to know how to acces databse connection which I opened in another form.
Sure, you're using Qt3 and I was looking at Qt4 docs.Originally Posted by Lebowski
First check if addDatabase returns a valid database handle.But I would still like to know how to acces databse connection which I opened in another form.
Bookmarks