2012-12-28 64 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

相關問題