I have a QTableWidget which I fill with data from SQL - I enabled to reorder the columns in the View by
self.horizontalHeader().setSectionsMovable(True)
To give the user perfect experience, I created much of code, that the user can decide which column he want to see by two list boxed, one showing the headers already in the table visible, in the other, all headers possible by the SQL Table. The user can switch the columns left an right and make them visible or not. The user can also put the elements in the list up and down to reorder the headers from the column. For the visible column list I have to get a list with all visible headers in the TableWidget - But I only have one problem:
When the user drags a Header like "ID" to first position
example
and I want to get all the headers as a list in a for loop,
header = self.horizontalHeaderItem(column).text()
gives "USERNAME" as first column (position 0) and "ID" as last column (position 3). Also
header = self.horizontalHeader().model().headerData(0,Qt.Orientation.Horizontal)
makes no difference..
Has anybody an idea?
you must iterate with logical index
header = self.horizontalHeader()
for col in range(self.columnCount()):
print(self.horizontalHeaderItem(header.logicalIndex(col)).text())
Related
I am using Vaadin 14 grid. This grid contains a number of columns. A few of them need to represent boolean values, hence we use a checkbox component inside that column. This is done by using grid.addComponentColumn method. The text related columns a just added using grid.addColumn
Now we want to enable multisort on the grid. By default the sorting indicators (up/down arrow) in the header are shown for the text based columns but not for the boolean values .
After adding sorting to the boolean column /component column (addComponentColumn(...).setSortable(true) the sorting indicators in the headers are shown, but the sorting itself is not performed when changing the sort direction (none / asc / desc) using the arrows in the header.
How can I make this work?
Thanks in advance!
When you have custom logic for what's rendering in a column, then you also need to explicitly configure how sorting should be handled for that column.
If you're using in-memory data, then you do that using Column.setComparator. If you're using a backend data source, then you should instead use Column.setSortProperty and also ensure that the data provider actually considers the contents of Query.getSortOrders.
You can see an example of this in practice at https://cookbook.vaadin.com/sort-with-renderer.
I have a table widget that contains 2 columns. The first column contains timestamps, and the 2nd column contains the message that corresponds with the timestamp. I want the user to be able to click on the header for the timestamp column and reverse the order. I also want the user to be able to click on the message header and have all the messages be put in alphabetical order. Using setSortingEnabled works perfectly for the message header, but due to the format of the timestamp, this will not sort the timestamps correctly. Is there a way to setSortingEnabled() on just the messages column, and when the user clicks on timestamp header it calls a custom function that sorts?
SetSortingEnabled() affects all columns.
You can setSortingEnable(False), create a function with custom sorting for the timestamp-column and standard sorting for the other columns and connect the horizonterHeaders signal sectionClicked() with this function. I tried in pyqt5, it works, but much work with recognizing the actual sortOrder, setting and deleting headerIcons etc..
A much easier way is, to set an appropriate format for the timestamp, right-aligned, fixed length, on the left filled with '0', in python3 e.g.:
ts = '{:0>15}'.format(timestamp)
left filled with spaces works too:
ts = '{: >15}'.format(timestamp)
In forms I have a block that contains name of tables.
The column is narrow so I want to add a tooltip that contains the value for each row.
I tried to put this code in post_query
:set_item_property('block1.value',tooltip_text, :block1.value);
but the tooltip always contains the last row's value and shows
it for all the rows. What could be the problem here?
set_item_instance_property is the ideal way to affect a column for just specific rows of data. But, tooltip_text is not available for setting via set_item_instance_property.
What you could do, though, is put your call to set_item_property into a when-new-record-instance trigger on the block. That way it should change the tooltip each time a new record becomes the focus.
I have a grid with 10 columns, and another with over 60. I want to offer a view of these grids where any column or number of columns can be selected to remain visible. Then submit a request to hide all of the remaining 'UN-selected' grid columns, leaving the selected columns viewable.
End-users need to have a mechanism where they can choose which column(s) to view and the remaining columns will be hidden temporarily from view. I know that I can choose each column from the context menu to hide each column, but if I have a grid with multiple columns it can be quite difficult to select each column to hide. I would like to create a mechanism where users can select which columns they want to 'view' and allow the remaining columns to hide.
I believe that grid reconfigure may be the way to go, but there are no real examples showing how I might select the columns to allow viewable "on-the-fly", and then reconfigure the grid based on the new column model.
There are a couple of ways you could approach this:
One way would be to loop through the columns and call hide() method on those you wish to hide.
For a large number of columns it might be better to use reconfigure method. using reconfigure with the first paremeter undefined you get to reuse the store that was originally configured:
reconfigure( undefined, myColumns )
I have a grid view, which has several columns, one of which is a numeric column. When the grid loads first time, the data on the numeric column gets sorted on the server side itself and gets rendered. I apply client side sorting on another column also using table sorter. Now, the requirement is, because the number column comes already sorted in ascending order, upon clicking the number column header should sort it in descending order first. How can I achieve this? I thought of doing it in the following way, but getting no help.
1. How to find out the data type of a column by giving column or index using table sorter?
2. Identify whether a column is already sorted on load and if so, the sort direction of a that column.
3. Sort that column (mentioned above) in descending order, upon first time header click of that column.
I did try with debug option of table sorter, but it is simply giving some alert message, which is not much helpful.
Any help would be really appreciated.
Set the initial sort order in tablesorter to be the same as what is returned back from the server. For example, say your numeric column is column zero and you are returning it back from the server in desc order. Use the following in the table sorter config:
sortList:[[0,1]]
This will tell tablesorter to sort the first column in descending order. Now that tablesorter knows how the data is sorted, the next time you click on this column to sort it, it will sort in ascending order (since it's currently sorted in descending order).