[Решен]Сигнали и слотове buttonbox и pushbutton



  • Здравейте :)
    Искам да свържа бутонче Open от buttonbox, така, че да прави същото, като че ли pushbutton-а е натиснат.
    Аз пиша следния код:
    @ connect(ui->buttonBox->button(QDialogButtonBox::Open), SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));
    @
    нямам изписани грешки, но вместо да се отвари новият диалог, настоящият се затваря.
    Имам 2 бутона в buttonbox-а и целият код, който се грижи за тях е:
    @void Songs::on_buttonBox_clicked(QAbstractButton *button)
    {
    connect(ui->buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(close()));
    connect(ui->buttonBox->button(QDialogButtonBox::Open), SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));
    }
    @
    Кодът който седи в on_pushButton_clicked() е:
    @void Songs::on_pushButton_clicked()
    {

    Lyrics lyricswin;
    lyricswin.setModal(true);
    lyricswin.showMaximized();
    lyricswin.exec();
    

    }
    @
    Някой може ли да ми обясни къде бъркам?



  • Здравей,

    не разбирах точно. Искаш Open бутона на диалога да прави същото като някакъв QPushButton, който седи във основният ти прозорец?

    Мисля, че всички бутони в buttonbox–а на диалоговият прозорец са свързани и със слот, който затваря диалога.



  • Да, правилно си разбрал идеята ми. Според мен трябва да може да се променя функционалността на бутоните, иначе няма логика да имат различни имена. QDialogButtonBox::Open 0x00002000 A "Open" button defined with the AcceptRole.
    Трябва да отваня нещо, нали?



  • Според мен нещо се обърква с exec-a. Всеки такъв exec() си създава свой eventloop и само слотове/сигнали свързани с него могат да бъдат извикани.

    Даже май точно това става. Когато натиснеш Open бутона. Той казва Натиснаха ме. Eventloop-а започва да обработва слотовете за тоя сигнал. Единият е Затвори прозореца, другия е твоя Отвори нов прозорец. Затварянето се изпълнява първо и затваря прозореца и унищожава eventloop-а, с което прекратява и изпълнението на всички други слотове, регистрирани в него.

    Ако искаш тоя диалог да си остане отворен, трябва да видиш в документацията има ли начин да му кажеш да не се затваря при натискане на бутон от buttonbox-а.

    Ако не държиш да остава отворен, а само новият да се покаже. Може да гледаш резултата от exec() и когато той е, че е натиснат Open да създаде новият диалог.



  • Ами размених им местата, за да видя какво ще се получи- същия резултат.
    Не ми трябва да е отворен настоящият прозорец, искам да ми се отвори следващият, но именно свързването на Open с отварянето на новия не ми се получава.
    Мислех си, че нещо не съм схванала сигналите и слотовете, но не ми изкарва грешка за тях.



  • Не да размениш твоите конецкии, то има и други които не виждаш. Те се създават първи и за това първи се изпълняват.

    Според мен най-лесно ще е ето така:

    @
    void Songs::on_pushButton_clicked()
    {

    Lyrics lyricswin;
    lyricswin.setModal(true);
    lyricswin.showMaximized();
    int res = lyricswin.exec();
    
    if ( res == QDialogButtonBox::Open )
    {
        // създаваш си другият прозорец и му даваш exec()
    }
    

    }
    @



  • Ама на мен отварянето на новия прозорец ми е в void Songs::on_pushButton_clicked().
    Когато се изпълнява този код се намирам в прозорец който се казва songswin, а като се натисне бутона се създава lyricswin.



  • Открих си грешката :) просто е трябвало други сигнали да взимам :)
    @void Songs::on_buttonBox_clicked(QAbstractButton *button)
    {
    connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(on_pushButton_clicked()));
    connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(close()));
    }@
    така работи, както исках :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.