1

我实现了一个颜色选择器菜单,基于BlackDal ColorPicker

In order to send a signal, when a color has been selected, i added:

class RColorPicker : public QPushButton
{
    Q_OBJECT
signals:
   void selected( QColor color);
 ...

void RColorPicker::on_popup_selected( QColor color )
{
   _selectedColor = color;
   repaint();
   emit selected( color );

Sowe在其他地方我连接到那个信号,比如

fillColorButton     = new RColorPicker()
connect(fillColorButton    , SIGNAL(selected(QColor)), this,  SLOT(fillColorButtonTriggered(QColor)) );

这有效,当从 PopUpMenu 中选择一种颜色时,但如果我在 PopUp 中选择“更多...”,然后从被调用的颜色中选择一种颜色,则不会调用QColorDialog连接的插槽。fillColorButtonTriggeredInstaed,在我的 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 对话框,情况似乎并非如此。当我尝试设置所选元素的颜色时,我调用了 MainWin::activeMdiChild,如果 Qt 对话框位于顶部,则返回 NULL(是的,我应该检查是否返回 NULL,此时这是出乎意料的)。

解决方案是用 currentSubWindow 替换 activeSubWindow。

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