Qt Bug? Mein Bug? Unser Bug? Tabellenbreite....

Alles rund um die Programmierung mit Qt
Antworten
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Qt Bug? Mein Bug? Unser Bug? Tabellenbreite....

Beitrag von joebar »

Hallo,

ich komme gerade ins schwitzen....

Situation:
Ich habe ein Tabelle mit 3 Spalten. Die 3 Spalten sind in der Summer kleiner als die Tabellenbreite. Das sieht blöd aus, daher sollen die Spalten auf die Tabellenbreite ausgedehnt werden. Automatisch natürlich.

Problem:
Die Spalten sind zwar genauso breit wie die Tabelle nun, aber trotzdem bekomme ich einen horizontalen Scrollbalken. Damit kann ich um ca. 2 Pixel scrollen. Policy ist auf scrollbar as needed gestellt.

Annahme:
Bei der Berechnung der Spaltenbreite gehe ich davon aus, dass sich die Tabellenbreite auf den Header, den Scrollbalken und die Tabellenspalten aufteilt. Falls man noch die Breite von welchen Rahmen hinzunehmen muss hätte man den Fehler, da ist mir aber nichts bekannt.

Das Coding ist im Anhang. Führt man es aus bekommt man auf der Konsole die ganzen Werte genannt und man sieht, dass die Summe der Spalten wirklich so breit ist wie die Tabelle, ich die Spalten also nicht zu gross gemacht habe. Hat jemand eine Idee?

Wollte das Coding als gz Paket anhängen, da bekomme ich aber immer einen Upload Error, daher hier das Coding.

Danke,
J.

Code: Alles auswählen

#include "addressbook.h"
#include <QDebug>
#include <QHeaderView>
#include <QMessageBox>
#include <QScrollBar>
#include <vector>

using namespace std;


addressbook::addressbook(QDialog *parent) : QDialog(parent){
	setupUi(this);	
	fillTable(); // generate table entries
	tableWidget -> setSortingEnabled(true); 
	tableWidget -> resizeColumnsToContents();
	tableWidget -> setEditTriggers(QAbstractItemView::NoEditTriggers); //read only table
	tableWidget -> setSelectionBehavior(QAbstractItemView::SelectRows); //mark complete line
}

addressbook::~addressbook(){
}


void addressbook::fillTable(){

	int zeilen = 4;  // auf hoehren Wert setzen dann kommt Scrollbalken
	QString stringa, stringb, stringc;
	stringa = "a";   // auf laengeren String setzen dann sollte enlargeColumns() keine Auswirkung haben
	stringb = "b";
	stringc = "c";
	vector <QTableWidgetItem*> cellContent;

  	for (int i=0; i < zeilen; i++){
		tableWidget -> insertRow(i);
	
		QTableWidgetItem *newItem = new QTableWidgetItem(stringa);
		cellContent.push_back(newItem);
		tableWidget -> setItem(i,0,cellContent.at(3*i));
	
		newItem = new QTableWidgetItem(stringb);
		cellContent.push_back(newItem);
		tableWidget -> setItem(i,1,cellContent.at(3*i+1));
	
		newItem = new QTableWidgetItem(stringc);
		cellContent.push_back(newItem);
		tableWidget -> setItem(i,2,cellContent.at(3*i+2));
	}
}



void addressbook::showEvent(QShowEvent * me){
	qDebug() << "show event is called.";
	if ((tableWidget -> columnWidth(0)) + (tableWidget -> columnWidth(1)) + (tableWidget -> columnWidth(2)) < tableWidget -> width()) enlargeColumns();
	QWidget::showEvent(me);	
}



void addressbook::enlargeColumns(){ // just in case the sum of all columns is smaller than the table it self, just looks stupid
	qDebug() << "Columns too small for table, have to enlarge them a bit";
	double cw, twt, twc, hw; //ColumWidth, TotalWidthTable, TotalWidthColumns, HeaderWidth
	int ncw; // NewColumnWidth after resize
	double sw;  //ScrollbarWidth

	if((tableWidget -> verticalScrollBar()) -> isVisible() == true) sw = tableWidget -> verticalScrollBar() -> width();
	else sw = 0;
	hw = tableWidget -> verticalHeader() -> width(); 
	twt = tableWidget -> width() - sw - hw; //twt is only the space left for my columns
	twc = tableWidget -> columnWidth(0) + tableWidget -> columnWidth(1) + tableWidget -> columnWidth(2);

	qDebug() << "Werte vor resize";
	qDebug() << "Breite vertikale Scrollbar " << sw;
	qDebug() << "column 0 " << tableWidget -> columnWidth(0);
	qDebug() << "column 1 " << tableWidget -> columnWidth(1);
	qDebug() << "column 2 " << tableWidget -> columnWidth(2);
	qDebug() << "Tabellenbreite " << twt;
	qDebug() << "Breite verikaler Header " << hw; 
        qDebug() << "Breite aller Spalten " << twc;
	qDebug() << "Jetzt beginnt der Resize"; 

       for(int i = 0; i < 3; i++){
		cw = tableWidget -> columnWidth(i);
		ncw = (int) (( 1.0 + ((twt - twc) / twc)) * cw);
		qDebug() << "Spalte " << i << "Breite vorher: " << cw << " Breite nachher " << ncw;
		tableWidget -> setColumnWidth(i,ncw);
	}

	twc = tableWidget -> columnWidth(0) + tableWidget -> columnWidth(1) + tableWidget -> columnWidth(2);
	qDebug() << "Breite aller Spalten nach Resize, hier kann noch eine Rundungsdifferenz auftreten: " << twc;

	if(twt != twc) tableWidget -> setColumnWidth(2, ncw + (int) twt - (int) twc); // A few pixel rounding difference, just add it to the last column
	twc = tableWidget -> columnWidth(0) + tableWidget -> columnWidth(1) + tableWidget -> columnWidth(2);
	qDebug() << "Breite aller Spalten nach Resize, hier ist keine Rundungsdifferenz mehr: " << twc;
}



Code: Alles auswählen

#ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H

#include "ui_addressbook.h"

class addressbook : public QDialog, public Ui::Dialog{
	Q_OBJECT

public:
	addressbook (QDialog *parent = 0);
	~addressbook();	

private slots:


public slots:

private:
	void enlargeColumns();
	void fillTable();
protected:
     void showEvent(QShowEvent *event);
	
};

#endif 

Code: Alles auswählen

#include "addressbook.h"



int main( int argc, char* argv[]){
	QApplication a(argc, argv);
	addressbook w;
	w.show();
	return a.exec();

}

Code: Alles auswählen

<ui version="4.0" >
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog" >
  <property name="geometry" >
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle" >
   <string>Dialog</string>
  </property>
  <widget class="QDialogButtonBox" name="buttonBox" >
   <property name="geometry" >
    <rect>
     <x>30</x>
     <y>240</y>
     <width>341</width>
     <height>32</height>
    </rect>
   </property>
   <property name="orientation" >
    <enum>Qt::Horizontal</enum>
   </property>
   <property name="standardButtons" >
    <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
   </property>
  </widget>
  <widget class="QTableWidget" name="tableWidget" >
   <property name="geometry" >
    <rect>
     <x>20</x>
     <y>20</y>
     <width>351</width>
     <height>211</height>
    </rect>
   </property>
   <property name="verticalScrollBarPolicy" >
    <enum>Qt::ScrollBarAsNeeded</enum>
   </property>
   <property name="horizontalScrollBarPolicy" >
    <enum>Qt::ScrollBarAsNeeded</enum>
   </property>
   <property name="verticalScrollMode" >
    <enum>QAbstractItemView::ScrollPerPixel</enum>
   </property>
   <property name="horizontalScrollMode" >
    <enum>QAbstractItemView::ScrollPerPixel</enum>
   </property>
   <column>
    <property name="text" >
     <string>Last Name</string>
    </property>
   </column>
   <column>
    <property name="text" >
     <string>First Name</string>
    </property>
   </column>
   <column>
    <property name="text" >
     <string>Mobile No.</string>
    </property>
   </column>
  </widget>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>buttonBox</sender>
   <signal>accepted()</signal>
   <receiver>Dialog</receiver>
   <slot>accept()</slot>
   <hints>
    <hint type="sourcelabel" >
     <x>248</x>
     <y>254</y>
    </hint>
    <hint type="destinationlabel" >
     <x>157</x>
     <y>274</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>buttonBox</sender>
   <signal>rejected()</signal>
   <receiver>Dialog</receiver>
   <slot>reject()</slot>
   <hints>
    <hint type="sourcelabel" >
     <x>316</x>
     <y>260</y>
    </hint>
    <hint type="destinationlabel" >
     <x>286</x>
     <y>274</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

Versuch mal - falls du filltable schon aufrufst und das noch nicht passiert hast

tableWidget -> resizeColumnsToContents();

an das ende von

fillTable()

zu stellen

und wenn das noch nicht klappt, dann jeweils nur 2 columns an die contents anpassen
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

habe das resize to content an der original stelle gelöscht und an fillTable() gehangen. -> gleiches Problem

habe zusätzlich dann nur zwei Spalten angepasst:

Code: Alles auswählen

       for(int i = 0; i < 2; i++){
		cw = tableWidget -> columnWidth(i);
		ncw = (int) (( 1.0 + ((twt - twc) / (twc- tableWidget -> columnWidth(2)))) * cw);
		qDebug() << "Spalte " << i << "Breite vorher: " << cw << " Breite nachher " << ncw;
		tableWidget -> setColumnWidth(i,ncw);
	}
und

Code: Alles auswählen

if(twt != twc) tableWidget -> setColumnWidth(1, ncw + (int) twt - (int) twc);
-> gleiches Problem.

resize to content wieder zurück an original Position -> gleiches Problem

Danke,
j.
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

Und du bist sicher, dass du nur 3 Columns hast?
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

Wüsste nicht woher die kommen soll, habe es aber "gemessen"

Code: Alles auswählen

void addressbook::showEvent(QShowEvent * me){
	qDebug() << "show event is called.";
	if ((tableWidget -> columnWidth(0)) + (tableWidget -> columnWidth(1)) + (tableWidget -> columnWidth(2)) < tableWidget -> width()) enlargeColumns();
	qDebug() << "Number of columns in table " << tableWidget -> columnCount();
	QWidget::showEvent(me);	
}
Ergebnis: 3

Danke,
J.
Antworten