ZBLOG

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

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

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

示例代码

  1. #include <QApplication>
  2. #include <QTableWidget>
  3. #include <QHeaderView>
  4. #include <QVBoxLayout>
  5. #include <QWidget>
  6. class MyTableWidget : public QWidget {
  7. Q_OBJECT
  8. public:
  9. MyTableWidget(QWidget *parent = nullptr) : QWidget(parent) {
  10. // 创建布局和表格
  11. layout = new QVBoxLayout(this);
  12. table = new QTableWidget(5, 3, this);
  13. QStringList headerLabels{"Column 1", "Column 2", "Column 3"};
  14. table->setHorizontalHeaderLabels(headerLabels);
  15. // 填充数据
  16. for (int i = 0; i < table->rowCount(); ++i) {
  17. table->setItem(i, 0, new QTableWidgetItem(QString("Item %1-1").arg(i + 1)));
  18. table->setItem(i, 1, new QTableWidgetItem(QString("Item %1-2").arg(i + 1)));
  19. table->setItem(i, 2, new QTableWidgetItem(QString("Item %1-3").arg(i + 1)));
  20. }
  21. // 添加表格到布局中
  22. layout->addWidget(table);
  23. // 设置初始列宽
  24. updateColumnWidths();
  25. // 启用自适应调整功能
  26. connect(this, &MyTableWidget::resizeEvent, this, &MyTableWidget::updateColumnWidths);
  27. }
  28. protected:
  29. void resizeEvent(QResizeEvent *event) override {
  30. QWidget::resizeEvent(event);
  31. updateColumnWidths(); // 窗口大小改变时更新列宽
  32. }
  33. private slots:
  34. void updateColumnWidths() {
  35. QVector<double> ratios {2.0, 1.0, 3.0}; // 列宽比例
  36. int totalWidth = this->width(); // 获取整个窗口的宽度
  37. // 如果总宽度为零,则不进行操作以避免除以零错误。
  38. if (totalWidth <= 0) return;
  39. double sumRatios = std::accumulate(ratios.begin(), ratios.end(), 0.0);
  40. for (int i = 0; i < ratios.size(); ++i) {
  41. int columnWidth = static_cast<int>((ratios[i] / sumRatios) * totalWidth);
  42. table->setColumnWidth(i, columnWidth); // 设置每一列的宽度
  43. }
  44. }
  45. private:
  46. QVBoxLayout *layout;
  47. QTableWidget *table;
  48. };
  49. int main(int argc, char *argv[]) {
  50. QApplication app(argc, argv);
  51. MyTableWidget window;
  52. window.resize(600, 400); // 设置初始窗口大小
  53. window.show();
  54. return app.exec();
  55. }
  56. #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

注册

已经有帐号?