Signal doesn't work properly
-
Hi,
I have the following signal:
review.h.signals: void RecAdded();
review.cpp:
constructor:Review::Review(QWidget *parent) : QDialog(parent), ui(new Ui::Review) { ui->setupUi(this); connect(this,&Review::RecAdded,this,&Review::updateTable); }
emitting signals in Review.cpp
void Review::on_pushButton_Add_to_DB_clicked() { QSqlDatabase db = QSqlDatabase::addDatabase ("QSQLITE","writedb"); db.setDatabaseName (fileQstring); // bool OKadd = db.open (); QSqlQuery querys(db); if(!db.open ()) { qDebug() << "The database is not open (submit)!"; } else { qDebug() << "The database is open (submit)!"; } querys.prepare("INSERT INTO Items (ID, Name, Pic, Description, Month, Day, Year, History, Age, Notes, Color, Material, Signed, What) VALUES(:ID, :Name, :Pic, :Description, :Month, :Day, :Year, :History, :Age, :Notes, :Color, :Material, :Signed, :What)" ); querys.bindValue (":ID",sIDReview); querys.bindValue (":Name",nameReview); querys.bindValue (":Pic",fileByteArray); querys.bindValue (":Description",descriptionReview); querys.bindValue (":Month",monthReview); querys.bindValue (":Day",dayReview); querys.bindValue (":Year",yearReview); querys.bindValue (":History",historyReview); querys.bindValue (":Age",ageReview); querys.bindValue (":Notes",notesReview); querys.bindValue (":Color",colorReview); querys.bindValue (":Material",materialReview); querys.bindValue (":Signed",SignedbyReview); querys.bindValue (":What",whatReview); bool result = querys.exec (); if(!result) { qDebug() <<"Error inserting into the main db!" << querys.lastError (); QMessageBox::warning (this,"Add to Database Warning","<b><font size='16' color='red'>Error 1002: The Friend was not added to the database."); } else { qDebug() << "Entered FunctAdd OK loop."; QMessageBox::information (this,"Confirmation","<b><font size = '16' color = 'green'>The Friend was added to the database.</font>"); db.close (); emit RecAdded (); } }
function update:
void Review::updateTable() { qDebug() << "Entered updateTable!"; MainWindow mMainWindow; mMainWindow.Addview(); }
mainwindow.cpp:
void MainWindow::Addview() { QSqlQuery query_main ("SELECT ID, Name,Pic, Description FROM Items ORDER BY NAME ASC "); if(query_main.isActive()==true) { qDebug() << "The query is active."; } else { qDebug() << "The query is NOT active." << query_main.lastError (); } QStandardItemModel *smodel = new QStandardItemModel(this); ui->tableView->setModel (smodel);
When the signal RecAdded() emitted updateTable() and Addview starts, but after the
if(query_main.isActive()==true)
is executed control goes back to the updateTable(). Basically it goes in a cycle between updateTable() and the beginning of Addview. Please help me figure why.
-
void Review::updateTable() { qDebug() << "Entered updateTable!"; MainWindow mMainWindow; mMainWindow.Addview(); }
you are creating a MainWindow object on the stack. Means it will get deleted immediately after the Addview() call.
-
Hi @raven-worx
How to do it correctly? -
@gabor53
you need a pointer to your MainWindow object and call AddView() on it instead.
I guess somewhere you have already created a MainWindow? -
@raven-worx
Yes, I have MainWindow as a class. -
@gabor53
i meant an instance of the MainWindow already.
Since you named it "MainWindow" you might want to create i tin the main() function.Then somewhere you need to make the connection at a point where you have pointers of both objects/windows.
You could also directly connect the Review window with the MainWindow (declare AddView() as slot):
connect(mReviewWindow,&Review::RecAdded,mMainWindow,&MainWindow::AddView);
-
@raven-worx
I did the following in Review.cpp:{ qDebug() << "Entered updateTable!"; MainWindow *mMainWindow = new MainWindow(this); mMainWindow->Addview(); } It goes to Addview() in MainWindow.cpp, but after processing
``ui->tableView->setModel (smodel);`
it jumps back to
void Review::updateTable()
and the actual table in MainWindow is not updated.
-
Deleted my previous post as it was wrong, I'm surprised it compiles with duplicate symbols as mMainWindow seems to be in your code
what you are trying to do is insert a row in the db, then delete your model completely and rebuild it from scratch. would it be easier to pass the new line as arguments to RecAdded and use them to append the row?
to put my solution here I need to know the type of:
sIDReview
nameReview
fileByteArray
(QByteArray?)descriptionReview
monthReview
(int?)dayReview
(int?)yearReview
(int?)historyReview
ageReview
(int?)notesReview
colorReview
materialReview
SignedbyReview
(QString?)whatReview
EDIT:
it jumps back to
it's not jumping back, you are creating a new MainWindow and it's constructor is calling a new review, it's not a jump back, it's a different instance
-
@VRonin
review.h
review.cpp
mainwindow.cpp
Thank you. -
@VRonin
sIDReview (QString)
nameReview (QString)
fileByteArray (QByteArray)
descriptionReview ((QString))
monthReview (QString)
dayReview (QString)
yearReview (QString)
historyReview (QString)
ageReview (QString)
notesReview (QString)
colorReview (QString)
materialReview (QString)
SignedbyReview (QString)
whatReview (QString) -
@VRonin
Originally, after main.cpp MainWindow.cpp loads. MainWindow has the tableview that displays 4 columns from the database. The user can call Additem.cpp from MainWindow to add more items to the db. After data entry Review.cpp is called where the user can review the data he/she entered. Here there are two choices: either click PushButton_fix to correct errors (this takes back to Additem.cpp) or if all correct you can click Add_to_Db and the item is added to the db. After adding RecAdded signal emitted to add the new record to the tableview in MainWindow. I hope this helps.