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 来切换小部件,在我的应用程序中,小部件要复杂得多,每次我想交换时我都无法重新创建它们。

4

2 回答 2

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());
}
于 2012-12-28T17:37:51.700 回答
2

布局破坏了它的孩子。因为addWidget拥有所有权,所以delete layout也会删除红色和蓝色小部件。

于 2012-12-28T17:38:08.227 回答