2012-12-28 84 views
1

由于mouseEvent的原因,我期望红色和蓝色的小部件在每次点击时切换位置。相反,红色切换到蓝色,然后它永远不会切换回来,为什么?为什么旧的小部件不能被删除?

Frame *red = NULL; 
Frame *blue = NULL; 
bool isRed = true; 

Frame::Frame(QWidget *parent) : 
    QFrame(parent) 
{ 
} 


Frame::~Frame(){ 
    printf("deleted.\n"); 
    fflush(0); 
} 
void QLayout_clear(QLayout* layout, bool deleteWidgets){ 
    QLayoutItem* item; 
    QLayout* childLayout; 
    while ((item = layout->takeAt(0)) != NULL){ 
     QWidget* widget = item->widget(); 
     if (widget != NULL){ 
      layout->removeWidget(widget); 
      if (deleteWidgets){ 
       delete widget; 
      } 
     } else if (childLayout = item->layout()){ 
      QLayout_clear(childLayout, deleteWidgets); 
     } 

     //delete item; 
    } 
} 

Widget::Widget(QWidget *parent) 
    : QWidget(parent) 
{ 
    QVBoxLayout *layout = new QVBoxLayout; 
    this->setLayout(layout); 

    red = new Frame; 
    red->setFixedSize(100,100); 
    red->setStyleSheet("background-color:red"); 

    blue = new Frame; 
    blue->setFixedSize(100,100); 
    blue->setStyleSheet("background-color:blue"); 

    layout->addWidget(red); 
} 

void Widget::mouseReleaseEvent(QMouseEvent *){ 
    printf("clicked.\n"); 
    fflush(0); 
    QVBoxLayout *layout = (QVBoxLayout *)this->layout(); 
    if (1){ //it doesnt matter if this is 1 or 0 
     delete layout; 
     layout = new QVBoxLayout; 
     this->setLayout(layout); 
    } else { 
     QLayout_clear(layout, false); 
    } 
    if (isRed){ 
     layout->addWidget(blue); 
     isRed = false; 
    } else { 
     layout->addWidget(red); 
     isRed = true; 
    } 
}

注:这里我用一个简单的QFrame的部件进行切换,在我的应用程序中的小部件更为复杂,我不能我想交换每次重新创建它们。

回答

3

我认为从性能的角度来看,每次您想要切换帧时删除和重新创建图层都不是很好的做法,将两个图层添加到图层然后设置可见的只有您想要显示的图像会更容易。此外,由于能见度左右的信息是包含在每个帧本身布尔isRed是没有必要的......

试试这个:

QFrame *red = NULL; 
QFrame *blue = NULL; 

Widget::Widget(QWidget *parent) 
    : QWidget(parent) 
{ 
    QVBoxLayout *layout = new QVBoxLayout(this); 

    red = new QFrame(this); 
    red->setFixedSize(100,100); 
    red->setStyleSheet("background-color:red"); 
    red->setHidden(false); 

    blue = new QFrame(this); 
    blue->setFixedSize(100,100); 
    blue->setStyleSheet("background-color:blue"); 
    blue->setHidden(true); 

    layout->addWidget(red); 
    layout->addWidget(blue); 
    this->setLayout(layout); 
} 

void Widget::mouseReleaseEvent(QMouseEvent *){ 
    printf("clicked.\n"); 
    fflush(0); 
    red->setHidden(!red->isHidden()); 
    blue->setHidden(!blue->isHidden()); 
} 
+0

+1因为这确实有效,但我想知道为什么这个例子没有。 – chacham15

2

布局自毁其子。由于addWidget取得所有权,因此delete layout也会删除红色和蓝色小部件。

+0

这不是问题,看看更新 – chacham15

+0

@ chacham15:你的'QLayout_clear'也会删除子项。它不只是删除它们。 –

+0

@ chacham15这就是问题,它仍然在这里:) – fasked

相关问题