2012-12-13 38 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; 
}