为了发送信号,当选择了颜色时,我添加了:
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
,则不会出现问题。
有人有提示吗,这里有什么问题?
答案 0 :(得分:1)
我终于找到了答案: 问题是,我使用的Qt MDI Sample有这样的函数:
MdiChild *MainWin::activeMdiChild()
{
if (QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow())
return qobject_cast<MdiChild *>(activeSubWindow);
return 0;
}
问题在于
如果MDI区域外的窗口小部件是活动窗口,则不显示子窗口 将是活跃的
显然,只要我显示模态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;
}