On 11/7/11 9:21 AM, "ext Alan Alpert" <alan.alp...@nokia.com> wrote:

>On Wed, 2 Nov 2011 18:03:21 ext Samuel Rødal wrote:
>> Hello,
>> 
>> I'm one of the guys who have been working on the Lighthouse API changes
>> for Qt 5 and new Qt 5 APIs like QWindow and QScreen. For those who are
>> not familiar, QWindow is the low-level Qt abstraction of a native window
>> that has its own rendering surface (native means whatever the Lighthouse
>> platform plugin provides, ie with the minimal plugin "native" currently
>> means a QImage backing store that simply gets saved as images to disk).
>> The QWidget stack and the scene graph both use QWindow as the
>> abstraction to get input and to get content onto the screen.
>> 
>> QScreen provides a way to query information (like geometry, dpi,
>> orientation, etc) about screens, and to move a window to a certain
>> screen with QWindow::setScreen(). QGuiApplication provides screens()
>> which returns a list of all the available screens, primaryScreen() which
>> returns the default screen, as well as the screenAdded() signal when a
>> new screen is connected. The QScreen header can be seen here:
>> https://qt.gitorious.org/qt/qtbase/blobs/master/src/gui/kernel/qscreen.h
>
>Looking at the QScreen header, would all of these properties really be
>constant? virtualSize and availableVirtualGeometry sound like they could
>change easily, as could logical size. If they can change, they'll need
>NOTIFY 
>signals so that th bindings and update.
>
>> 
>> Currently we're trying to find a nice way to expose the QScreen API to
>> QML. The obvious way of exposing the QGuiApplication properties /
>> signals as Qt.application.screens, Qt.application.primaryScreen, and
>> Qt.application.screenAdded doesn't work too well unfortunately, since
>> there's no way of finding out which screen the QQuickView belongs to
>> from QML, and the screen list is useless as there's no way to control
>> which screen you're on from QML at the moment. We could limit ourselves
>> to only allowing a single declarative context to only be associated with
>> one screen, but that prevents future use cases like controlling the UI
>> for both the main display and the external display from a single QML
>> file, which might be useful in for example presentation tools or video
>> players / gallery viewers where the main display shows some controls
>> that are not shown on the external display. In the future we might want
>> to support these use cases as well as better support desktop
>> applications by having a Window item or similar to be able to explicitly
>> create new top-level windows from QML (a similar feature is already
>> exposed in QML desktop components, but it sounds like it would be useful
>> to have a generic abstraction in the QML core).
>
>When you say QML core, you mean this should go in the QtQuick module? Or
>into 
>the engine, and be available without an import statement? The QtQuick
>module 
>is my preference.

Any API for accessing screens should be in the QtQuick module. The engine
itself shouldn't really contain anything tied to Gui.

>
>My first guess is that it would need to hook into QQuickCanvas to easily
>find 
>its QWindow* (for screen()) and to be notified of screen changes. That
>could 
>affect where it can be placed. But if they're all in the QtDeclarative
>library 
>then it's quite easy for it to work closely with the canvas to achieve
>this.
>
>>
>> Anyway, in the meantime the most future proof approach seems to be to
>> tie the screen information to an Item, instead of making it a global
>> property. The two approaches we're currently looking at is having a
>> ScreenInfo element, or using attached properties to dynamically insert a
>> Screen object with corresponding properties on demand.
>> 
>> Here's some example code for the two approaches:
>> 
>> Rectangle {
>>      ScreenInfo {
>>              id: screenInfo
>>              onCurrentOrientationChanged: {
>>                      // do animation ...
>>              }
>>      }
>>      width: 4.0 * screenInfo.physicalDotsPerInchX
>>      height: 4.0 * screenInfo.physicalDotsPerInchY
>> }
>> 
>> Alternatively, with the attached property:
>> 
>> Rectangle {
>>      width: 4.0 * Screen.physicalDotsPerInchX
>>      height: 4.0 * Screen.physicalDotsPerInchY
>>      Screen.onCurrentOrientationChanged: {
>>              // do animation ...
>>      }
>> }
>> 
>> The latter has less syntax, but it might be easier to create multiple
>> Screen objects. A way to solve that can be to compute the desired scale
>> factors etc once in a single element, and then re-use those factors in
>> child elements without accessing Screen directly.
>
>I like the idea of the attached object, it's a cleaner looking API and
>the 
>docs can explain the performance implications.

I'm not too fond of this. The reason is that I'd rather explicitly create
surfaces on a screen, than magically attach items in an existing view to a
screen.

I'll explain more in the thread about Window {}.

> 
>
>> 
>> Another question is whether the x and y DPI should be easily accessed by
>> a property that simply averages the two (square or mostly square pixels
>> seems to be the norm anyway). This might help make a UI that wants to
>> support both portrait and landscape orientation less confusing, as it
>> wouldn't have to manually swap the x and y properties when doing a 90
>> degree rotation.
>
>I'd agree that a convenience physicalDotsPerInch/logicalDotsPerInch with
>average values would be helpful, while there are a lot of properties
>already 
>I'd think that adding these (so you can choose X,Y or average) would
>still be 
>alright.

Yes, average values are really good to have. In most cases, DPI will be
the same in x and y anyway.


Cheers,
Lars

_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to