Qt Bug? Mein Bug? Unser Bug? Tabellenbreite....
Verfasst: 20. September 2007 13:36
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.
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>