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

관련 문제