ZBLOG

c++ qt qtablewidget 列宽按照比例设置 并且能随着界面的大小变化而变化

要在 Qt 的 QTableWidget 中设置列宽为比例并使其能够随着界面的大小变化而自动调整,您可以使用信号和槽机制来监听窗口的大小变化,并在窗口调整时重新计算并设置列宽。

下面是一个示例,展示如何实现这一功能:

示例代码

#include <QApplication>
#include <QTableWidget>
#include <QHeaderView>
#include <QVBoxLayout>
#include <QWidget>

class MyTableWidget : public QWidget {
    Q_OBJECT

public:
    MyTableWidget(QWidget *parent = nullptr) : QWidget(parent) {
        // 创建布局和表格
        layout = new QVBoxLayout(this);
        table = new QTableWidget(5, 3, this);

        QStringList headerLabels{"Column 1", "Column 2", "Column 3"};
        table->setHorizontalHeaderLabels(headerLabels);

        // 填充数据
        for (int i = 0; i < table->rowCount(); ++i) {
            table->setItem(i, 0, new QTableWidgetItem(QString("Item %1-1").arg(i + 1)));
            table->setItem(i, 1, new QTableWidgetItem(QString("Item %1-2").arg(i + 1)));
            table->setItem(i, 2, new QTableWidgetItem(QString("Item %1-3").arg(i + 1)));
        }

        // 添加表格到布局中
        layout->addWidget(table);

        // 设置初始列宽
        updateColumnWidths();

        // 启用自适应调整功能
        connect(this, &MyTableWidget::resizeEvent, this, &MyTableWidget::updateColumnWidths);
    }

protected:
    void resizeEvent(QResizeEvent *event) override {
        QWidget::resizeEvent(event);
        updateColumnWidths(); // 窗口大小改变时更新列宽
    }

private slots:
    void updateColumnWidths() {
        QVector<double> ratios {2.0, 1.0, 3.0}; // 列宽比例
        
        int totalWidth = this->width(); // 获取整个窗口的宽度
       
		// 如果总宽度为零,则不进行操作以避免除以零错误。
       if (totalWidth <= 0) return;

	    double sumRatios = std::accumulate(ratios.begin(), ratios.end(), 0.0); 

	    for (int i = 0; i < ratios.size(); ++i) {
	        int columnWidth = static_cast<int>((ratios[i] / sumRatios) * totalWidth);
	        table->setColumnWidth(i, columnWidth); // 设置每一列的宽度
	    }
    }

private:
    QVBoxLayout *layout;
    QTableWidget *table;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    
    MyTableWidget window;
    window.resize(600, 400); // 设置初始窗口大小
    window.show();
    
    return app.exec();
}

#include "main.moc"

实现说明

类结构:

  • MyTableWidget:这个类继承自 QWidget,包含了一个 QVBoxLayout 和一个 QTableWidget

方法:

  • 构造函数:初始化表格和布局,并填充数据。调用 updateColumnWidths() 函数设置初始列宽。

  • resizeEvent(QResizeEvent *event):重写窗口的大小改变事件。当窗口被调整大小时,这个方法会被调用,以便更新列宽。

槽函数:

  • updateColumnWidths():根据当前窗口的宽度以及设定的比例动态地调整每一列的宽度。

注意事项:

  1. 比率数组:您可以根据需要修改比率数组中的值,以更改各列之间的相对宽度。
  2. 连接信号与槽:这里我们通过重载 resizeEvent() 方法来触发调整,而不需要额外的信号连接,因为在这段代码中已经处理了窗口变化时自动更新逻辑。

这样,当您调整主窗口的大小时,QTableWidget 的各个列将保持按照指定比例自动缩放。希望这个解决方案能满足您的需求!如果您有其他问题,请随时询问!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20531

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?