كيفية التأكد من تغيير حجم الأعمدة في QTableView إلى الحد الأقصى

StackOverflow https://stackoverflow.com/questions/3433664

  •  26-09-2019
  •  | 
  •  

سؤال

لست متأكدًا من كيفية طرح هذا ، لذا لا تتردد في طلب المزيد من المعلومات.

يبدو أن tableView->resizeColumnsToContents() سيقوم فقط بتغيير حجم جميع الأعمدة بناءً على البيانات في العرض الحالي. مما يعني أنه إذا كان لدي المزيد من البيانات أدناه (والتي تكون أطول من حيث عدد الكلمات) ، فسيتم لف هذه الكلمات (إذا كان wordWrap تم تعيين الخاصية على صحيح).

الشيء الغريب هو ، إذا قمت بالتمرير لأسفل إلى الأسفل وتحديث البيانات ، tableView سيتم تغيير حجم تلك الأعمدة بشكل صحيح. يبدو كما لو tableView لا أعرف أن هناك نصًا أطول أدناه.

لذا ، سؤالي هو ، كيف يمكنني التأكد من تغيير حجم هذه الأعمدة إلى الحد الأقصى بناءً على جميع البيانات؟

رموز بلدي

QSqlTableModel *model = new QSqlTableModel;
model->setTable("item");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();    
tableResult->setModel(model);    
tableResult->setEditTriggers(QAbstractItemView::NoEditTriggers);    
tableResult->setSelectionBehavior(QAbstractItemView::SelectRows);
tableResult->setSelectionMode(QAbstractItemView::SingleSelection);    
tableResult->resizeColumnsToContents();
tableResult->resizeRowsToContents();

تحديث 1

لقد حاولت tableResult->scrollToBottom() وسوف يتم تغيير حجمها فقط بناءً على العناصر الموجودة في الأسفل. لذلك ، إذا كانت هناك كلمات أطول في الوسط ، فسوف يتم لف هذه الكلمات.

تحديث 2

إذا كان أي شخص يرغب في فهم ما أتحدث عنه ، فقط تحميل هذا المثال. سترى أن النقر فوق pushbutton سيقوم بإنشاء بيانات لم يتم تغيير حجمها بشكل صحيح.

تحديث 3

ربما خطأ: https://bugreports.qt.io/browse/qtbug-9352

هل كانت مفيدة؟

المحلول

تمكنت من العثور على حل بديل لهذه المشكلة ، تحتاج فقط إلى إخفاء الجدول قبل الاتصال resizeColumnsToContents().

على سبيل المثال:

tableResult->setVisible(false);
tableResult->resizeColumnsToContents();
tableResult->setVisible(true);

نصائح أخرى

أعتقد أن ذلك لأن QSQLTABLEMODEL يقوم بتحميل البيانات عند الطلب ويحسب العرض عرض العمود بناءً على البيانات المتوفرة فقط. إذا لم تكن بحاجة إلى أن تكون أعمدةك قابلة للتطبيق ، فيمكنك تجربة ذلك:

tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);

لقد استخدمت نفس الحل البديل كما وصفها Amree ، والتي عملت بشكل رائع لعرض العمود ، ولكن tableView->resizeRowsToContents() لم يكن يعمل بشكل صحيح إذا كانت أي أعمدة خارج الشاشة تحتوي على خلايا متعددة الألين التي كان ينبغي أن تسبب ارتفاع صف في زيادة.

نظرت إلى مصدر QT ويبدو أن بعض الحسابات تعتمد على هندسة المنفذ. يبدو أن هذا يجعل كل شيء يعمل بشكل صحيح لكل من العمودين والصفوف:

#include <limits>

tableView->setVisible(false);
QRect vporig = tableView->viewport()->geometry();
QRect vpnew = vporig;
vpnew.setWidth(std::numeric_limits<int>::max());
tableView->viewport()->setGeometry(vpnew);
tableView->resizeColumnsToContents();
tableView->resizeRowsToContents();
tableView->viewport()->setGeometry(vporig);
tableView.setVisible(true);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top