Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-34611

Fusion style: inconsistent header arrow functionality between different platforms (Windows, Linux)

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: P3: Somewhat important
    • Resolution: Done
    • Affects Version/s: 5.1.1, 5.2.0 Beta1
    • Fix Version/s: 5.6.0
    • Component/s: GUI: Look'n'Feel
    • Labels:
      None
    • Environment:
      Windows 7
    • Commits:
      9f779088f434901cd4b81f90fc00e3b34601e071

      Description

      Even though the fusion style should be platform independent, I think some of its functions should work as they do on the platform below.

      On Windows the ascending list has a header arrow pointing up and on a descending list it is pointing down. Where as on Linux (tested on Ubuntu 12.04) the header arrows work the opposite.

      The code snippet below can be used to reproduce the issue:

      #include <QApplication>
      #include <QTreeWidget>
      #include <QHeaderView>
      #include <QDebug>
      
      
      int main(int argc, char *argv[])
      {
          QApplication app(argc, argv);
          app.setStyle("Fusion");
          qDebug() << app.style();
      
          QTreeWidget *treeWidget = new QTreeWidget();
          treeWidget->setColumnCount(1);
      
          QList<QTreeWidgetItem *> items;
          for (int i = 0; i < 10; ++i)
              items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i))));
          treeWidget->insertTopLevelItems(0, items);
          treeWidget->setSortingEnabled(true);
          //treeWidget->header()->setSortIndicator(0, Qt::AscendingOrder);
          treeWidget->show();
      
          return app.exec();
      }
      

      Expected result on Windows:
      The header arrow should point down in case of descending list

      Actual result on Windows:
      The header arrow points up

      This is done in QFusionStyle::drawPrimitive()

       case PE_IndicatorHeaderArrow:
              if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
                  QRect r = header->rect;
                  QPixmap arrow;
                  QColor arrowColor = header->palette.foreground().color();
                  QPoint offset = QPoint(0, -1);
      
                  if (header->sortIndicator & QStyleOptionHeader::SortUp) {
                      arrow = colorizedImage(QLatin1String(":/qt-project.org/styles/commonstyle/images/fusion_arrow.png"), arrowColor);
                  } else if (header->sortIndicator & QStyleOptionHeader::SortDown) {
                      arrow = colorizedImage(QLatin1String(":/qt-project.org/styles/commonstyle/images/fusion_arrow.png"), arrowColor, 180);
                  } if (!arrow.isNull()) {
                      r.setSize(QSize(arrow.width()/2, arrow.height()/2));
                      r.moveCenter(header->rect.center());
                      painter->drawPixmap(r.translated(offset), arrow);
                  }
              }
      

      As a workaround one can rotate the fusion_arrow.png in case of QStyleOptionHeader::SortUp and not to rotate in case of QStyleOptionHeader::SortDown if the platform is Q_OS_WIN.

        Attachments

        For Gerrit Dashboard: QTBUG-34611
        # Subject Branch Project Status CR V

          Activity

            People

            Assignee:
            poikelin Joni Poikelin
            Reporter:
            qtcomsupport Qt Support
            Votes:
            1 Vote for this issue
            Watchers:
            3 Start watching this issue

              Dates

              Created:
              Updated:
              Resolved:

                Gerrit Reviews

                There are no open Gerrit changes