Что не так с этим сигналом 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)

Очевидно, что как только я отображаю модальное диалоговое окно 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;
}
Другие вопросы по тегам