[Решен]Сигнали и слотове 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()));
 }@
 така работи, както исках :)
