2012-12-13 32 views
1

我实现了一个颜色选择器菜单,基于BlackDal ColorPicker我的PopUp中这个QT信号有什么问题?

为了发送信号,当选择一种颜色,我说:

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中选择“More ...”,然后从被调用的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(); 

的问题不会发生,如果我通过一个本地的Windows ChooseColor对话框更换QColorDialog

有没有人有提示,问题在这里?

回答

1

我终于找到了自己的答案: 的问题是,Qt的MDI样品,我用,有这样的功能:

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; 
}