给QGridLayout添加一个insertLayout的方法

2024-07-04  本文已影响0人  豪爵吸金ing

Qt5中 QGirdLayout没有insertLayout的方法;
我给他创造一个
测了测是可以正常运行的。

class LayoutManager {
public:
    // Helper function to clear a QGridLayout
    static void clearQGridLayout(QGridLayout* gridLayout) {
        while (gridLayout->count() > 0) {
            QLayoutItem* item = gridLayout->takeAt(0);
            if (item && item->widget()) {
                gridLayout->removeItem(item);
            }
        }
    }

    // Struct to store layout item information
    struct LayoutItemInfo {
        int row;
        int column;
        int rowSpan;
        int columnSpan;
    };

    // Function to insert a QBoxLayout into a QGridLayout
    static void insertLayout(QGridLayout* gridLayout, QBoxLayout* boxLayout, int dstRow, int dstColumn = 0) {
        // Store the existing layout items and their positions
        QHash<QLayoutItem*, LayoutItemInfo> layoutItemInfoMap;
        for (int i = 0; i < gridLayout->count(); ++i) {
            QLayoutItem* item = gridLayout->itemAt(i);
            int row, column, rowSpan, columnSpan;
            gridLayout->getItemPosition(i, &row, &column, &rowSpan, &columnSpan);
            layoutItemInfoMap[item] = {row, column, rowSpan, columnSpan};
        }

        // Clear the grid layout
        clearQGridLayout(gridLayout);

        // Add the box layout at the specified position
        gridLayout->addLayout(boxLayout, dstRow, dstColumn);

        // Reinsert the existing layout items
        for (auto it = layoutItemInfoMap.begin(); it != layoutItemInfoMap.end(); ++it) {
            QLayoutItem* item = it.key();
            const LayoutItemInfo& info = it.value();
            if (info.row < dstRow) {
                gridLayout->addItem(item, info.row, info.column, info.rowSpan, info.columnSpan);
            } else {
                gridLayout->addItem(item, info.row + 1, info.column, info.rowSpan, info.columnSpan);
            }
        }
    }


    static void insertHeaderLayout(QGridLayout* gridLayout, QBoxLayout* boxLayout) {
        // Store the existing layout items and their positions

        QHash<QLayoutItem*, LayoutItemInfo> layoutItemInfoMap;
        for (int i = 0; i < gridLayout->count(); ++i) {
            QLayoutItem* item = gridLayout->itemAt(i);
            int row, column, rowSpan, columnSpan;
            gridLayout->getItemPosition(i, &row, &column, &rowSpan, &columnSpan);
            layoutItemInfoMap[item] = {row, column, rowSpan, columnSpan};
        }

        // Clear the grid layout
        clearQGridLayout(gridLayout);

        int dstRow = 0,  dstColumn = 0;
        // Add the box layout at the specified position
        gridLayout->addLayout(boxLayout, dstRow, dstColumn,1,gridLayout->columnCount());


        QGridLayout *layoutNew = new QGridLayout;
        // Reinsert the existing layout items
        for (auto it = layoutItemInfoMap.begin(); it != layoutItemInfoMap.end(); ++it) {
            QLayoutItem* item = it.key();
            const LayoutItemInfo& info = it.value();
            if (info.row < dstRow) {
                layoutNew->addItem(item, info.row, info.column, info.rowSpan, info.columnSpan);
            } else {
                layoutNew->addItem(item, info.row + 1, info.column, info.rowSpan, info.columnSpan);
            }
        }
        gridLayout->addLayout(layoutNew, dstRow+1, dstColumn);

        int margin = gridLayout->margin();
        gridLayout->setMargin(0);
        layoutNew->setMargin(margin);
    }
};

调用示例

FileDialog::FileDialog(QWidget *parent)
    : QFileDialog(parent)
{
    this->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    setOption(QFileDialog::DontUseNativeDialog, true);

    QLayout* originalLayout = this->layout();
    if (!originalLayout) {
        qDebug() << "Original layout is null, using default layout";
        return;
    }

    QGridLayout* gridLayout = qobject_cast<QGridLayout*>(originalLayout);
    if (gridLayout) {
        QHBoxLayout *hlayout = new QHBoxLayout();
        hlayout->addWidget(new QPushButton("xx"));
        hlayout->addWidget(new QPushButton("xx"));
        hlayout->addStretch();
        int dstRow = 0;
        LayoutManager::insertLayout(gridLayout,hlayout,dstRow);

    } else {
        qDebug() << "Original layout is not a QGridLayout, using default layout";
        this->setLayout(originalLayout);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读