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