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 に答える