qt/qml quick item - scale without pixelation - qt

I'm trying to design a zoomable view in qt/qml where you can adjust the scaling of the rendered widgets similar like in a browser or QtWebView.
My first try was to use the scale attribute. Though scaling everything, an unwanted side effect is that the UI gets pixelated.
There exists the QT_SCALE_FACTOR environment variable. The rendered result is what I'm looking for but the scale factor cannot be changed anymore after creating the QGuiApplication.
Additionally it scales everything on the gui, but maybe this issue could be solved if i found a way to manipulate QT_SCALE_FACTOR dynamically at runtime.
I assume that QT_SCALE_FACTOR overrides the QScreen::devicePixelRatio property, but i didn't found a way to manually set this property since it is readonly.
Is there a way to manipulate QT_SCALE_FACTOR at runtime or exists another way to implement such a zoomable view?
With kind regards,
Neconspictor

Related

Move splitters in design mode

When i add splitters, it acts as a layout, but also allows to resize the widgets in runtime. So, for example, i managed to lay out my widgets in this way:
Therefore, i can resize my widgets in runtime. As i noticed, this function is also available in designer mode, but it doesn't work properly. I tried to hover over my splitter and drag it in designer mode, but it only replaces the entire widget.
That is how does my main window look like in QtDesigner. I haven't tried to code yet. The problem is, that even though i used to set a stretch factor, my widegt's look in designer mode and in runtime completely differ. They have another sizes.
So, what are the problems:
Firstly, i can't change my widgets sizes properly, using stretch factors. I don't know, i tried to change size policies, but i did't manage to see an effect. I have somehow changed size of the vertically oriented widgets, but when speak about horizontal orientation - stretch factor and size policy doesn't change anything at all.
Secondly, i can't move my splitter in designer mode. It's position is constant, by default, it's always somewhere in the middle.
Thirdly, i have bugs (i think so) with my widget sizes in designer mode. They differ with widget's sizes in runtime.
Question:
So, how can i change widget's sizes properly? Maybe there's a way of moving a splitter in designer mode - do newer versions of Qt have it? Currently i'm using Qt 5.9.9. Also, why these bugs, and are they bugs at all. Maybe i just should update my Qt to newer versions to get access to newer functionalities?
Comment: I'm not sure if stretch factors work with layout as they do with widgets. I'm using layouts exactly the same way i use widgets. My layout's wrong(maybe) use may have caused this problem. Anyways, i'm entirely new to Qt, and may not know something to understand it completely.

QGraphicsView RubberBandDrag leaves artifacts

I have a QGraphicsView and a QGraphicsScene set up without any properties changed but
view->setDragMode(QGraphicsView::RubberBandDrag);
view->setRenderHint(QPainter::Antialiasing, true);
When dragging arround for a bit the RubberBandDrag leaves artifacts and the RubberBand itself is often rendered incorrectly, missing the sides:
Also other graphics items such as a regular QGraphicsRectItem leave these traces. I tried without the antialias but that seems to make it even worse.
Do I have to set specific properties of the view/scene such as disabling optimization flags?
Or is this just a bug of Qt? (I am using 5.9.2)
At least I couldn't find a report of this.
I had similar problem. After I play around these two calls, things got fixed.
QGraphicsView.setCacheMode(QGraphicsView::CacheBackground);
QGraphicsView.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);

JavaFX disable TextArea scrolling

I have been trying to disable scroll bars in a text area using the code:
ScrollBar scrollBarv = (ScrollBar)textArea.lookup(".scroll-bar:vertical");
scrollBarv.setDisable(true);
But all I get is a null pointer for "scrollBarv". What am I missing?
You can't disable a scroll bar in a text area via lookups like you are trying to do.
A lookup is CSS based, which usually means it will only work after a CSS application pass has been applied. Generally, for a lookup to work as expected, a layout pass also needs to be applied on the parent node or scene. The logic in the JavaFX layout handlers for complex nodes such as controls may modify the CSS and nodes for the controls.
To understand how to apply CSS and perform a layout pass, read the relevant applyCss() documentation.
So you could do this:
textArea.applyCss();
textArea.layout();
ScrollBar scrollBarv = (ScrollBar)textArea.lookup(".scroll-bar:vertical");
scrollBarv.setDisable(true);
But even then, it would not do what you want. Because it is just a one-time call. If the user types new text into an empty TextArea until it fills the area, then a scroll bar will show up, and if the user deletes text in the text area, the scroll bar will be removed. And the new scroll bar which shows up wouldn't be found when you did your lookup because it would not have existed at that time.
Generally, the preferred alternative to performing lookups to nodes is to apply CSS style classes with the style class defining the desired attributes of the node regardless of the state it is in (and using psuedo-classes if state based CSS definitions are required). However, that probably won't work in this case as I can't see a definition for a disable attribute in the JavaFX CSS reference guide. Perhaps you might manage what you need via the visibility property, though that is unlikely as visibility is a bit different from disable.
The behavior for controlling the scroll bars is internally coded in the TextAreaSkin (which in Java 8 is not part of the public JavaFX API). You could copy or subclass the TextAreaSkin to customize its behavior and then attach your customized skin to your node. This is really the "proper" way to customize internal control behavior in the way in which you wish. A discussion of the detailed steps to achieve this is outside the scope of this answer.
But, in the end, I'm not sure how useful the behavior you desire is. Rather than disabling the vertical scroll bar, you could just disable the entire TextArea, which would be fine for most similar use-cases. Though, perhaps your use-case is different somehow in requiring only the vertical scroll bar to be disabled.

ListView scrolling issue in JavaFX2

I'm developing a application which has a ListView which contains items which needs complex cell layouts. The cells are in variable heights and some of the cells tends to be larger than the view port height.
But when the ListView is filled with items the scroll thumb tends to resize its self while scrolling, which makes it hard to hold onto the thumb while scrolling. This happens mainly when passing through different size of cells.
This is not a problem in Swing if I create a same kind of a cell render to be used with the JList. This problem is there in JavaFX 2 and JavaFX8 both.
When looking at the VirtualFlow which is responsible for layout of the ListView and handle scrolling, it seems that the scrollbar thumb side (lenghtbar) is calculated based on the cell count and the visible cell count, which is actually a problem when it comes to lists which has variable heights of cells.
So is this the future of the scroll bar behavior for Java FX list views? or is there any solution available for this problem? Or should I try to hide the scrollbar and provide a different user interaction to scroll?
This problem is already reported under https://javafx-jira.kenai.com/browse/RT-25059 and fixed in Java8 upto some extend. So if this fix is needed on JavaFx2 we have to backport the changes under commit http://hg.openjdk.java.net/openjfx/8/controls/rt/rev/81cc13fe6f96
To get this changes in JavaFX 2.2 you need to apply the required changes on to FX2.2 VirtualFlow.java class and load those changes before the jfxrt.jar is loaded. Another approach is if you don't like to mess up with the jfxrt classes is to have you own ListView which uses your own Skin and the patched VirtualFlow version may be with a different name. But this might require lot of customization compared to first solution.
More approaches are welcome :).

Flex framework_3.3.0.4852 rsl build is different compared to merged in to code

My application is set up to use the flex framework_3.3.0.4852.swf as an rsl, which works fine reporting no errors. However, now some of the charts have lost there legend text for both vertical and horizontal axis.
When analysing the styles/properties, the UITextField used for axis text has a text width of zero! The data is set correctly, and all parent components are set to a size that shouldn't influence the text width.
Initially I thought I had a style bleed problem, but then I discovered that if I built the application with all libraries (including the framework) merged in, the problem goes away.
I have also done some tests using inline styles to override any style bleeds that might have been coming through, this had no effect.
Has anyone seen this type of thing before relating to using rsl's?
UPDATE:
I have since found some known bugs in the adobe support knowledge base https://bugs.adobe.com/jira/secure/IssueNavigator.jspa?
Here are the 2 bugs that relate to my question:
1) https://bugs.adobe.com/jira/browse/FLEXDMV-1883
This is reported as fixed, however the next bug seems to disagree, I'm going to investigate further into this and update this question again.
2) https://bugs.adobe.com/jira/browse/FLEXDMV-2065
UPDATE:
Ok I removed the embedded font being used for charts from my stylesheets, from both module and application. The UITextField text has now appeared again. So clearly an embedded font issue.
So in summary, if you have a modular application, you need to embed fonts in both module and application for them to be picked up correctly. But if you use the framework swf as an rsl, you cant use an embedded font with chart axis text.
UPDATE:
Now I have a real problem, 2 of my charts use a rotation effect. When the effect plays and finishes, the axis text disappears because I need to use an embedded font when applying effects to text in this way. But of course I cant use an embedded font for chart styles when I have the framework swf as an rsl!! Not sure how to get around this one?
After some attempts to override the way Axis labels are rendered for chart components when using SDK 3.x, and not getting very far. I have decided that the short term resolution is unfortunately to roll back our builds, not using the framework swf as an RSL until we can upgrade to version 4.x of the SDK.
The main reasons for this are:
1) If the framework swf is an RSL in your project, you cant use an embedded font for chart axis labels, as they don't show up. If you analyse their properties, you'll find all data is correct except text width will be set to zero.
https://bugs.adobe.com/jira/browse/FLEXDMV-1883 - modular app related similar bug
https://bugs.adobe.com/jira/browse/FLEXDMV-2015 - RSL related
https://bugs.adobe.com/jira/browse/FLEXDMV-2065 - RSL related
2) If embedded fonts are removed from charting component Axis styles to fix the above issue, you then cant apply effects to the same components. This is because you need to use an embedded font to apply effects correctly to the Axis labels.
The only way to fix this issue is to upgrade SDK to 4.x as the chart Axis uses Label instead of UITextField.

Resources