小编Gam*_*ads的帖子

从工作线程发出Qt :: signal会默认在主线程上进行UI更新?

我是新来的Qt.我有一个工作线程std::thread.工作线程函数在循环中不断地获取一些数据.经常TextQMLUI 上的元素上更新数据的大小.我有一个监听器回调,它只是一个std::function,它从它被调用thread's function.它向我发送了基于我更新Text元素的回调QML.我用signal slot机制更新它.

以下是QML : Text元素:

Text {
  id: mytext
  objectName: "mytextobject"

  function slotUpdateData(someValue){
    mytext = someValue
  }
}
Run Code Online (Sandbox Code Playgroud)

SignalUpdateData与连接slotUpdateData其驻留在QML侧.每当我得到的数据事件回调从std::threademit SignalUpdateData这更新QML Text elementUI.

void CallBackReceivedFromWorkerThread(float someValue) {
  emit SignalUpdateData(someValue)
}
Run Code Online (Sandbox Code Playgroud)

以下是我如何将其C++ signalQML slot

QObject::connect(this, SIGNAL(SignalUpdateData(QVariant)), myTextItemQObject, SLOT(slotUpdateData(QVariant)));
Run Code Online (Sandbox Code Playgroud)

所有这一切都很好.没有碰撞,锁定,什么也没有.

根据我的理解,由于工作线程的函数正在触发回调,因此当收到回调时,执行控制在工作线程上.所以在做的时候emit SignalUpdateData(someValue),我们仍然在工作线程上.据我之前在 …

c++ qt multithreading signals-slots qml

1
推荐指数
1
解决办法
1353
查看次数

混合纯虚拟和虚拟方法的类

我创建了一个抽象类,它只有一组纯虚方法.有3个不同的类具有这些方法的具体实现.

在编写了上述结构之后,我发现派生类中的一些方法具有相同的实现.所以,我将这些函数转移到我的基类的逻辑,并使它们成为虚拟而不是纯虚拟.现在,实现不需要在派生类中重复.这编译并执行正常.

我的基类是纯虚方法和虚方法的混合,它遵循这样的结构是一种很好的设计方法吗?

c++ inheritance pure-virtual

1
推荐指数
1
解决办法
1032
查看次数

超出范围时,从std :: async返回的std :: future挂起

我使用的组合std::asyncstd::futureC++ 11.我正在使用对我在代码中执行的某项活动强制执行time_out,这可能需要一些时间,因为我尝试连接到服务器.

以下是代码:

#include <future>
#include <chrono>

std::size_t PotentiallyLongRunningActivity() {
    using namespace std::chrono_literals;
    std::this_thread::sleep_for(10000s);
    return 10;
}

bool DoActivity() {

  bool activity_done = false;
  auto my_future_result(std::async(std::launch::async, []() {
      return PotentiallyLongRunningActivity(); //returns size_t
  }));

  std::future_status my_future_status = my_future_result.wait_for(std::chrono::milliseconds(800));
  if (my_future_status == std::future_status::timeout) {
      activity_done = false;
  }
  else if (my_future_status == std::future_status::ready) {
      if (my_future_result.valid() && my_future_result.get() > 0) {
          activity_done = true;
      }
  }

  return activity_done;
  //my_future_result hangs while exiting this method …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 stdasync std-future

1
推荐指数
1
解决办法
4387
查看次数

Qt:以预期的压缩格式保存图像

我正在使用UIQt项目并保存图像文件QML。以下是我所做的

auto screenshot = quick_item->grabToImage();
screenshot->saveToFile("/somepath/filename.jpeg");
// OR sometimes use like png like
screenshot->saveToFile("/somepath/filename.png");
Run Code Online (Sandbox Code Playgroud)

这在所有平台上都表现得非常好。我打开文件,图像按预期保存。

现在我的问题是:
我刚刚提到.jpeg作为文件扩展名,同时将文件名作为参数提供到saveToFile. 这可行,但是,我是否需要使用它QImageWriter来确保图像实际上以jpeg/png格式压缩?

当它是有损压缩时会发生什么jpeg
如果我想在android中控制有损压缩,我可以做一个,image.compress(CompressFormat.JPEG, 80, stream)其中80是压缩质量的百分比

qt png jpeg image-compression qml

1
推荐指数
1
解决办法
2157
查看次数

如何调整QImage或QML Image的大小以适合父容器而不破坏Image的长宽比

场景:
我在QML中有一个Image组件,其中包含一个纵横比不同的QImage

码:

Window {
  id: app_window
  visible: true

  Rectangle {
    id: my_image_view_container
    width: app_window.width
    height: app_window.height

    Image {
       id: my_image
       // changes at runtime based on the image my app selects
       source: "random/path/to/an/image.jpg"
       width: sourceSize.width
       height: sourceSize.height
       scale: Qt.KeepAspectRatio
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

问:
我如何设定widthheightmy_image_view_container,以适应my_image完全内my_image_view_container不影响到其长宽比?

qt image qimage qml qtquick2

1
推荐指数
1
解决办法
2404
查看次数

如何阻止 QML 项被平移或其父项的边界

我有以下代码允许在应用程序窗口上平移图像

代码:

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

ApplicationWindow {
    id: app
    visible: true
    title: qsTr("Test panning an Image")

    width: 700
    height: 700

    Image {
        id: my_image_item
        source: "http://doc.qt.io/qt-5/images/declarative-qtlogo.png"
        MouseArea{
            anchors.fill: parent
            drag.target: my_image_item
            drag.axis: Drag.XAndYAxis
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

目标:
我想阻止图像被拖动/平移到其父级之外。

基本上我不想允许 my_image_item被移到以下位置:

  • my_image_item的右边缘位于其父级左边缘的左侧,
  • my_image_item的左边缘位于其父级右边缘的右侧
  • my_image_item的上边缘位于其父级下边缘的下方
  • my_image_item的底部边缘放置在其父级顶部边缘的上方

主要问题:
如何my_image_item在用户拖动时限制仅在其父级边缘内的移动my_image_item

次要问题:如果回答那么大):
限制该项目my_image_item的运动需要严格其母公司?或者它可能是另一个不是其父项的项目?(至少一个共享一个共同的 QML 父级

qt qml qtquick2

1
推荐指数
1
解决办法
533
查看次数

如何使用不同的值声明一个内联初始化的std :: array结构

我试图初始化一个结构数组std::array.我知道以下是一种初始化std::array整数的方法.

std::array<int, 5> arr { {1, 2, 3, 4, 5} };
Run Code Online (Sandbox Code Playgroud)

场景:
但是,假设我有一系列这样的结构

struct MyStruct {
    const char     *char_val_1;
    const char     *char_val_2;
    int             int_val_1;
    double          d_val_1;
} my_struct_obj[] = {
    { "a1b1"    , "a2b1"    , 1  ,   1.1 },
    { "a1b2"    , "a3b1"    , 2  ,   1.2 },
    { "a1b3"    , "a4b1"    , 3  ,   1.3 },
    { "a1b4"    , "a5b1"    , 4  ,   1.4 },
    { "a1b5"    , "a6b1"    , 5  ,   1.5 },
    { …
Run Code Online (Sandbox Code Playgroud)

c++ struct c++11 stdarray

1
推荐指数
1
解决办法
73
查看次数

通过 bash 脚本中的引用更新变量?

是否可以像在 C++ 中那样在bash 脚本通过引用来使用变量?

假设我有一个如下所示的脚本:

#!/bin/bash

A="say"
B=$A
echo "B is $B"
A="say it"
echo "B is $B" # This does not get the new value of A but is it possible to using some trick?
Run Code Online (Sandbox Code Playgroud)

即使 的值已从 更改为,您也会在上面的脚本echo "B is $B输出中看到。我知道重新分配喜欢会解决它。但我想知道是否有可能持有对的引用,以便在更新后立即更新它的值。这发生在没有重新分配的情况下。这可能吗?B is sayAsaysay itB=$ABABAB=$A

envsubstBash 中的 Lazy Evaluation 中读到了。是按照方法去做吗?

A="say"
B=$A
echo "B is $B"
envsubst A="say it"
echo …
Run Code Online (Sandbox Code Playgroud)

bash envsubst

1
推荐指数
1
解决办法
62
查看次数

如何使用 bash 命令在字符串的 2 个不同字符之间剪切子字符串?

我有以下字符串,我想从第一个字符串-和第一个字符串之间切出一个子字符串.

something-123_2523123_1232+12312-more-GI2342.txt
Run Code Online (Sandbox Code Playgroud)

我尝试使用如下所示的cut命令:

echo something-123_2523123_1232+12312-more-GI2342.txt | cut -d'-' -f 2
Run Code Online (Sandbox Code Playgroud)

上面的输出123_2523123_1232+12312是正确的一半。该cut命令已-正确选择了第一个,但随后我需要告诉它继续,直到.并输出子字符串。我该怎么做呢?

或者如何切出第一个-和之间的子字符串.

bash cut

1
推荐指数
1
解决办法
18
查看次数

QML TextInput:如何检测用户已在文本字段上完成输入

我是 Qt 和 QML 的新手。我正在使用 QtQuick 2.4。我有TextInput一个在文件中定义了信号的项目,qml如下所示:

import QtQuick 2.4

TextInput {
  text: "Text"
  cursorVisible: true

  signal qmlSignal(string msg)
}
Run Code Online (Sandbox Code Playgroud)

我还有一个与qmlSignal. TextInput我想在用户完成字段输入或关闭 qml 页面以转到应用程序中的另一个页面时触发信号。

实现此所需功能的正确方法是什么?有没有类似的东西onFocusChanged false我可以检测并触发 qml 信号?

我尝试搜索,但无法获得如何在 qml 中执行此操作的示例

qt qml qtquickcontrols

0
推荐指数
1
解决办法
6110
查看次数

Bash布尔变量检查说找不到命令

我有一个带有.sh扩展并在OSX环境中运行的shell脚本,我在其中设置了如下变量:

booean_var1 = false
booean_var2 = true
Run Code Online (Sandbox Code Playgroud)

并且根据2个变量进行if检查

if [ $booean_var1 ] || [ $booean_var2 ]
then
  echo one of them is true
fi
Run Code Online (Sandbox Code Playgroud)

在一台OSX机器上以bash运行它可以正常工作.但是我从另一台OSX机器上执行了我的shell脚本并在那里用bash运行它

booean_var1 command not found
Run Code Online (Sandbox Code Playgroud)

shell脚本语法与bash在一台机器上的区别是什么?

macos bash shell

0
推荐指数
1
解决办法
889
查看次数