Seite 1 von 1

Zeilenbreite optimal auf Tabellenbreite verteilen

Verfasst: 16. September 2007 07:34
von joebar
Hi,

ich habe eine QTableWidget in dem ich drei Spalten habe. Falls die Summer der Spaltenbreiten grösser ist als die Breite der Tabelle dann habe ich eine Scrollbar. --> okay. Wenn die drei Spalten aber schmaeller sind als die Tabelle sieht das blöd aus, als ob eine Spalte fehlt. Ich möchte die Spalten daher einfach etwas breiter machen als sie wirklich sein müssten. Das Problem bei der Berechnung ist die "-1. Spalte", die immer die Zeilennummer angibt. Ich habe deren Breite geraten und abgezogen:

Code: Alles auswählen

void addressbook::enlargeColumns(){ // just in case the sum of all columns is smaller than the table itself
	double cw, twt, twc;
	int ncw;
	twt = (tableWidget -> width()) - 19;  //19 points for the header column fix <-- Hier ist die Zeile auf die sich meine Frage bezieht
	twc = tableWidget -> columnWidth(0) + tableWidget -> columnWidth(1) + tableWidget -> columnWidth(2);
        qDebug() << "twt " << twt << " twc " << twc;
        for(int i = 0; i < 3; i++){
		cw = tableWidget -> columnWidth(i);
		ncw = (int) (( 1.0 + ((twt - twc) / twc)) * cw);
		qDebug() << "cw " << cw << " ncw " << ncw;
		tableWidget -> setColumnWidth(i,ncw);
	}
	
	twc = tableWidget -> columnWidth(0) + tableWidget -> columnWidth(1) + tableWidget -> columnWidth(2); // twc has changed, recalculate it
	qDebug() << "new twc " << twc;
	if(twt != twc) tableWidget -> setColumnWidth(2, ncw + (int) twt - (int) twc); // A few pixel rounding difference, just add it to the last column
}
Die 19 Pixel sind durch probieren entstanden. Ich weiss nicht ob diese Spalte wirklich oder immer 19 Pixel sind. Gibt es da einen besseren Weg?

Danke,
J.

Verfasst: 16. September 2007 08:14
von upsala
Hast du dir schon mal die Breite deines vertikalen Headers angeschaut?

Verfasst: 16. September 2007 16:50
von joebar
Hi,

mmmmh.... wie heisst denn mein Objekt? Ich wuerde ja davon ausgehen dass du von der Klasse QHeaderView sprichst. Ich habe den Qt Designer zur UI Erstellung genutzt und der Header war "einfach so" da. Ich wuerde davon ausgehen, dass das item im ui_class.h File gesetzt ist, da kann ich aber nichts finden

Code: Alles auswählen

/********************************************************************************
** Form generated from reading ui file 'addressbook.ui'
**
** Created: Fri Sep 14 20:42:52 2007
**      by: Qt User Interface Compiler version 4.2.1
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/

#ifndef UI_ADDRESSBOOK_H
#define UI_ADDRESSBOOK_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDialog>
#include <QtGui/QDialogButtonBox>
#include <QtGui/QTableWidget>

class Ui_Dialog
{
public:
    QDialogButtonBox *buttonBox;
    QTableWidget *tableWidget;

    void setupUi(QDialog *Dialog)
    {
    Dialog->setObjectName(QString::fromUtf8("Dialog"));
    buttonBox = new QDialogButtonBox(Dialog);
    buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
    buttonBox->setGeometry(QRect(30, 240, 341, 32));
    buttonBox->setOrientation(Qt::Horizontal);
    buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok);
    tableWidget = new QTableWidget(Dialog);
    tableWidget->setObjectName(QString::fromUtf8("tableWidget"));
    tableWidget->setGeometry(QRect(20, 20, 351, 211));
    tableWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
    tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);

    retranslateUi(Dialog);

    QSize size(400, 300);
    size = size.expandedTo(Dialog->minimumSizeHint());
    Dialog->resize(size);

    QObject::connect(buttonBox, SIGNAL(accepted()), Dialog, SLOT(accept()));
    QObject::connect(buttonBox, SIGNAL(rejected()), Dialog, SLOT(reject()));

    QMetaObject::connectSlotsByName(Dialog);
    } // setupUi

    void retranslateUi(QDialog *Dialog)
    {
    Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0, QApplication::UnicodeUTF8));
    if (tableWidget->columnCount() < 3)
        tableWidget->setColumnCount(3);

    QTableWidgetItem *__colItem = new QTableWidgetItem();
    __colItem->setText(QApplication::translate("Dialog", "Last Name", 0, QApplication::UnicodeUTF8));
    tableWidget->setHorizontalHeaderItem(0, __colItem);

    QTableWidgetItem *__colItem1 = new QTableWidgetItem();
    __colItem1->setText(QApplication::translate("Dialog", "First Name", 0, QApplication::UnicodeUTF8));
    tableWidget->setHorizontalHeaderItem(1, __colItem1);

    QTableWidgetItem *__colItem2 = new QTableWidgetItem();
    __colItem2->setText(QApplication::translate("Dialog", "Mobile No.", 0, QApplication::UnicodeUTF8));
    tableWidget->setHorizontalHeaderItem(2, __colItem2);
    Q_UNUSED(Dialog);
    } // retranslateUi

};

namespace Ui {
    class Dialog: public Ui_Dialog {};
} // namespace Ui

#endif // UI_ADDRESSBOOK_H

dort werden die horizontalen Header gesetzt als QWidgetItem, nicht als QHeaderView. Wo aber mein vertikaler Header gesetzt wird kann ich nicht finden.

Wo sollte ich den finden?

Danke,
J.

Verfasst: 16. September 2007 17:50
von upsala
Doku. Viel Spaß beim suchen...