1

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 から色が選択されたときに機能しますが、PopUp で "More..." を選択し、呼び出された から色を選択するとQColorDialog、接続されたスロットfillColorButtonTriggeredは呼び出されません。代わりに、私の 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をネイティブの WindowsChooseColorダイアログに置き換えると、問題は発生しません。

ここで何が問題なのか、ヒントはありますか?

4

1 に答える 1

1

私は最終的に自分で答えを見つけました:問題は、私が使用したQt MDIサンプルに次のような機能があることです:

MdiChild *MainWin::activeMdiChild()
{
    if (QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow())
        return qobject_cast<MdiChild *>(activeSubWindow);
    return 0;
}

問題はそれです

MDI 領域外のウィジェットがアクティブ ウィンドウの場合、サブウィンドウはアクティブになりません。

( Qt のドキュメントを参照)

明らかに、モーダル Qt ダイアログを表示するとすぐに、MDI 子ウィンドウにフォーカスがなくなります。ネイティブの Windows ダイアログを使用すると、そうではないようです。選択した要素の色を設定しようとすると、Qt ダイアログが上にある場合に NULL を返す MainWin::activeMdiChild を呼び出しました (はい、NULL を返すことを確認する必要がありましたが、この時点では予想外でした)。

解決策は、activeSubWindow を currentSubWindow に置き換えることでした。

MdiChild *MainWin::activeMdiChild()
{
    if (QMdiSubWindow *activeSubWindow = mdiArea->currentSubWindow())
        return qobject_cast<MdiChild *>(activeSubWindow);
    return 0;
}
于 2012-12-18T13:46:53.707 に答える