[solved]resizing vertical header
-
"The frozen column example":http://doc.qt.nokia.com/latest/itemviews-frozencolumn.html is not exactly what you want, but the same techniques can be used here.
There are also 2 QTables that need to be in sync with each orther.
-
You can try "QTableView::setColumnWidth":http://doc.qt.nokia.com/4.7/qtableview.html#setColumnWidth and set the corresponding width.
-
I think Paul wants something like this :
!http://dl.dropbox.com/u/33544011/2Tables.PNG(2 tables)!Is that correct?
-
yes!
I solved now inheriting from qheaderview and using a method to set sizehint's width, and I override sizeHint() to return a Qsize with parent's height and just set width. I consider this an ugly fix, but it works.what's your solution (probably better)?
-
I didn't have a solution 13 minutes ago. I was just testing some things for which a made a ui.
I don't know if it's better, but I didn't need to subclass :
in the constructor of the form/mainwindow where you use the 3 tables :@ qDebug() << ui->tableWidget->verticalHeader()->sizeHint().width(); //get width of VHeader
qDebug() <<ui->tableWidget->columnWidth(0);//get width of first columnint HeaderWidth2 = ui->tableWidget->verticalHeader()->sizeHint().width() + ui->tableWidget->columnWidth(0); ui->tableWidget_2->verticalHeader()->setFixedWidth(HeaderWidth2);//set width of second VHeader@
This doen't take in to account that the widths could be changed afterwards. In that case we will need some signals and slots.
Anyway I hope it helps in some way.
-
Well, your solution is better because you haven't subclassed, but it requires the same workaround when resizing: when I resize the header (with signal/slot stuff), in my and your solution the first column ("one" in your example) is not pushed to the right.
instead, the header covers the column.As an ugly fix, I have to do something like
@ int colw=ui->tblTotals->columnWidth(0);
ui->tblTotals->setColumnWidth(0,0);
ui->tblTotals->setColumnWidth(0,colw);@and the table is repainted correctly.
thanks anyway.Paolo
-
I think you have to call the slot QTableView::updateGeometries() after resizing the header.
Because that slot is protected, you have to call it through QMetaObject::invokeMethod.
Assuming the 2 tables are named ui->tblHours and ui->tblTotals:
@// In the constructor
...
// The real column resizing is done asynchronously,
// so you have to delay the slot with Qt::QueuedConnection
connect(ui->tblHours->horizontalHeader(), SIGNAL(sectionResized(int,int,int)),
SLOT(resizeHeader()), Qt::QueuedConnection);
...void YourClass::resizeHeader() {
int width = ui->tblHours->verticalHeader()->width() +
ui->tblHours->columnWidth(0);
ui->tblTotals->verticalHeader()->setFixedWidth(width);
QMetaObject::invokeMethod(ui->tblTotals, "updateGeometries");
}@ -
thanks a lot alexisdm. this worked for me. this approach has the advantage to be more clear.
very strange thing the QMetaObject one, it breaks everything about protected/private and so on. I think in a theorical OOP it has to be avoided, but for actual programming is very useful :D