Подключение к сигналу, скрытому QMessageBox - PullRequest
1 голос
/ 12 января 2010

Я хочу показать пользователю предупреждение QMessageBox со ссылкой внутри. Это относительно просто, мне просто нужно убедиться, что я установил текстовый формат RichText в окне сообщения, а настройка QMessageBox сделает все остальное. Тем не менее, я также хотел бы закрыть окно сообщения (как в некотором роде вызова done()), если пользователь нажимает на ссылку - семантическое существо, что пользователь признал сообщение и принял решение.

Проблема: QMessageBox скрывает сигнал linkActivated, исходящий из его внутреннего QLabel (который используется для хранения текста).

Я думал, что смогу расширить класс QMessageBox и сделать очень уродливый хак в конструкторе:

QLabel *lbl = findChild<QLabel*>(QString("qt_msgbox_label"));
assert(lbl != NULL);

connect(lbl, SIGNAL(linkActivated(const QString&)), this, SLOT(handle_link_activation(const QString&)));

но хотя метка, найденная с помощью findChild, не является нулевой, а "qt_msgbox_label" определенно является правильным (c / p 'от источника), и сообщения "нет такого сигнала / слота" нет, мой слот никогда не вызывается при нажатии на ссылку.

Я бы не хотел писать свой собственный QDialog, который бы имитировал поведение QMessageBox. Кто-нибудь знает, как я могу поймать этот сигнал?

1 Ответ

2 голосов
/ 12 января 2010

Попробуйте определить собственную ссылку "протокол", т.е. msgboxurl: //yoururl.is.here, и установите для нее обработчик URL

QDesktopServices::setUrlHandler("msgboxurl", urlHandlerObj, "slotName");

urlHandlerObj может быть объектом, который создал окно сообщения. В слоте вы можете просто спрятать свое окно сообщения и принять часть URL после // и открыть ее с QDesktopServices::openUrl, но помните, что перед префиксом http / https необходимо добавить префикс (на некоторых платформах URL без «схемы» обрабатывается неправильно) URL обработки слотов должен иметь те же параметры, что и QDesktopServices::openUrl статический метод

...