Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

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.


  • Moderators

    @gabor53

    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?


  • Moderators

    @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.



  • This probably won't do what you intended but it works

    void Review::updateTable()
    {
    qDebug() << "Entered updateTable!";
    MainWindow* mMainWindow=new mMainWindow(NULL);
    mMainWindow->Addview();
    mMainWindow->show();
    }


  • Moderators

    @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
    If it helps I can post the whole code.



  • the contents of review.h should be enough





  • @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)



  • What's the link between Review and MainWindow?



  • @VRonin
    In Review the data added to the database and I want to update the table in MainWindow using the record just added to the db.



  • @gabor53 Sorry, I did not explained myself. Review is a Dialog, where do you make this dialog appear?



  • @VRonin
    In MainWindow line 75

    void MainWindow::on_actionAdd_a_Friend_triggered()
    {
        Additem *mAddItem = new Additem;
        mAddItem->exec ();
    }
    


  • Now you lost me completely.
    typedef Review Additem; ?? I guess not because

    void Review::on_pushButton_Fix_clicked()
    {
        Additem *mAdditem = new Additem(this);
    


  • @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.



  • cry

    Ok, your design is "borderline". Could you please post additem.h and additem.cpp too please?



  • @VRonin
    additem.h
    additem.cpp

    Thank you for your help.



  • Unrelated to main topic but I just took a glimpse at your code:

    QString date = QDate::currentDate().toString ();
        list = date.split (QRegExp("\\s+"));
        int size = list.size ();
        QString sYear = list.at (size-1);
    
        yeark = sYear.toInt ();
    

    do you mean?

    yeark = QDate::currentDate().year();
    


  • Yes. I was complicated.



  • Hai....
    you just try by this line of code instead of your connect statement
    connect(this,&Review::RecAdded,this,&Review::updateTable,Qt::UniqueConnection);
    It may help you..



  • Hi @Venkatesh-V
    It didnt do the trick.



  • No, clearly not. I'm working on the solution, I'll post it shortly. I'm trying to find the time and avoid to correct too much



  • @VRonin
    Thank you. I appreciate it.



  • @gabor53
    When you have time please let me know how can I improve the design.



  • Hai..@gabor53
    Can you share your whole code? so that i can try to resolve.



  • @Venkatesh-V See above



  • @Venkatesh-V Thank you



  • So far whatever I've come up with it opens a second MainWindow.


Log in to reply