在我的PopUp中,这个QT信号出了什么问题?

时间:2012-12-13 11:10:56

标签: qt signals-slots qcolordialog

我根据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 );

Sowewhere我连接到那个信号,如

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

当从PopUpMenu中选择颜色时,如果我在PopUp中选择“更多...”,然后从被叫QColorDialog中选择颜色,则连接的插槽fillColorButtonTriggered不叫。 Instaed,在我的MDI-Application中,一个不同的文档成为活动窗口。虽然它应该:

   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 个答案:

答案 0 :(得分:1)

我终于找到了答案: 问题是,我使用的Qt MDI Sample有这样的函数:

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

问题在于

  

如果MDI区域外的窗口小部件是活动窗口,则不显示子窗口   将是活跃的

see Qt Documentation

显然,只要我显示模态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;
}