2015-04-21 4 views
0

Этот вопрос немного конкретный, но я не смог найти кого-то с той же проблемой или чистого решения проблемы.Как создать эквивалент ListView QtWidgets в Qt Quick Controls?

Я создаю программу Qt Quick, и я хочу использовать QListView, как он появляется в QtWidgets. This QtWidgets program имеет три таких вида, с проверяемыми элементами (что необязательно: не все QListViews имеют проверяемые элементы).

Поскольку у Qt Quick Components нет эквивалента QListView, я решил сделать свой собственный из существующих компонентов. И результат ... meh. Это выглядит как this и точно не ведет себя одинаково. Нажав на текст/пробел элемента , проверьте элемент, а не выделяя его. И граница просто уродливая и не появляется в среде GTK-themed. Он также не подчиняется пользовательским темам рабочего стола, потому что фон предметов будет всегда быть белым.

Код для этого пользовательского компонента является довольно кратким, и выглядит следующим образом:

import QtQuick 2.4 
import QtQuick.Controls 1.3 

// GroupBox creates a border... most of the time. Not in GTK envs 
GroupBox { 
    id: root 
    property var model: null 

    // This wraps the ListView up with a scrollbar 
    ScrollView { 
     anchors.fill: parent 

     ListView { // This is the view component 
      anchors.fill: parent 

      model: root.model 

      // This is the white box that the CheckBox is drawn on 
      delegate: Rectangle { 
       width: parent.width 
       height: box.height 

       // This is the actual item 
       CheckBox { 
        id: box 
        anchors.fill: parent 
        text: thing // `thing` is just a placeholder value from the model 
       } 
      } 
     } 
    } 
} 
+0

Я не вижу, граничащие именно проблема. На скриншоте все в порядке, не так ли? –

+0

Это граница вокруг ListView. [Это увеличенное изображение] (http://i.imgur.com/kP5sDGl.png) должно показать это довольно хорошо. В окне слева находится QtWidgets QListView. Окно справа - мое собственное устройство ListView. –

+0

Белый фон связан с использованием 'Rectangle' в качестве верхнего элемента' делегата'. Просто используйте «Элемент», чтобы иметь прозрачный фон или установить «цвет: прозрачный» в текущем коде - первый подход лучше. Кроме того, «CheckBox» не должен заполнять делегат, чтобы «MouseArea» можно было использовать для установки «currentIndex» и, таким образом, переместить компонент «highlight» в текущий выбранный «CheckBox». Эти изменения должны действительно улучшить общий внешний вид. К сожалению, я думаю, что получение идеального тематики было бы довольно трюком и, вероятно, невозможным. – BaCaRoZzo

ответ

0

Используйте QApplication вместо QGuiApplication. Это потребует от вас добавления поддержки виджетов (и отправки Qt widgets libs). Таким образом, Qt Quick Components автоматически получит доступ к гораздо более системным темам, таким как цвет фона при выборе текста.

Кроме того, SystemPalette предоставит вам кучу родных цветов, которые вы можете использовать, если хотите.

Неудовлетворительные интеграции системы с использованием QGuiApplication: system integration using QGuiApplication

Хорошая интеграция с использованием QApplication: integration using QApplication

+0

Извините, я использовал 'qmlscene' для прототипа этого и намерен запустить его из PyQt (или обычного C++, если вы захотите) позже. Как использовать 'QApplication' для приложения Qt Quick, чтобы я мог лучше использовать системную интеграцию? Я не совсем понимаю связь. –

+0

Я добавил скриншоты той разницы, о которой я говорил. В моем случае 'qmlscene' отображает приложение так же, как' QApplication'. Так что, возможно, вы уже добились лучших результатов. Возможно, вы захотите перейти на 'SystemPalette', чтобы настроить пользовательский интерфейс. –

+0

О, но это не проблема. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу использовать компонент в Qt Quick, который действительно не существует из коробки. Я хочу иметь ListView внутри QtQuick, который выглядит и ведет себя аналогично QListView, который существует в QtWidgets. Я создал свой собственный, какой-то, но граница уродлива и не подчиняется системным темам. SystemPalette может решить проблему с цветом фона, но я не знаю, как это исправить проблему с границей, если только я не определяю границу как линию пикселей вокруг ListView. –

Смежные вопросы