Что не так с этим сигналом QT в моем всплывающем окне?
Я реализовал Цветовое Меню выбора, основанное на BlackDal ColorPicker
Чтобы послать сигнал, когда цвет был выбран, я добавил:
class RColorPicker : public QPushButton
{
Q_OBJECT
signals:
void selected( QColor color);
...
а также
void RColorPicker::on_popup_selected( QColor color )
{
_selectedColor = color;
repaint();
emit selected( color );
Где еще я подключаюсь к этому сигналу, как
fillColorButton = new RColorPicker()
connect(fillColorButton , SIGNAL(selected(QColor)), this, SLOT(fillColorButtonTriggered(QColor)) );
Это работает, когда цвет выбирается из PopUpMenu, но если я выбираю "More..." в PopUp, а затем выбираю цвет из вызываемого QColorDialog
, подключенный слот fillColorButtonTriggered
не называется. Instaed, в моем MDI-приложении другой документ становится активным окном. Хотя должно:
void RColorPickerPopup::mousePressEvent ( QMouseEvent *event )
{
...
QColorDialog *dialog = new QColorDialog( this );
if( dialog->exec() )
{
hoverColor = dialog->selectedColor();
delete dialog;
emit selected( hoverColor );
this->close();
Проблема не возникает, если я заменяю QColorDialog
по родным окнам ChooseColor
Диалог.
У кого-нибудь есть подсказка, в чем тут проблема?
1 ответ
Я наконец нашел ответ сам: проблема в том, что в примере Qt MDI, который я использовал, была такая функция:
MdiChild *MainWin::activeMdiChild()
{
if (QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow())
return qobject_cast<MdiChild *>(activeSubWindow);
return 0;
}
Проблема в том, что
если виджет вне области MDI является активным окном, никакое подокно не будет активным
Очевидно, что как только я отображаю модальное диалоговое окно Qt, ни одно дочернее окно MDI больше не фокусируется - если я использую родное диалоговое окно Windows, это, похоже, не так. Когда я пытаюсь установить цвет выбранных элементов, я вызывал MainWin::activeMdiChild, который возвращает NULL, если Qt Dialog находится сверху (Да, я должен был проверить, что возвращал NULL, что было неожиданно в этот момент).
Решение состояло в том, чтобы заменить activeSubWindow на currentSubWindow.
MdiChild *MainWin::activeMdiChild()
{
if (QMdiSubWindow *activeSubWindow = mdiArea->currentSubWindow())
return qobject_cast<MdiChild *>(activeSubWindow);
return 0;
}