使用基于QDbusAbstractInterface(通过qdbusxml2cpp)构建的Qt DBus代理,处理启动时无法使用的服务/对象的最佳方法是什么?注意:我对简单地知道它不感兴趣(你可以使用BlahService.isValid()来找出它); 我希望能够知道它是否有效,并知道它何时变为有效所以我可以改变状态(并用信号广播状态变化),并且在状态变化时做其他事情.相反,我想知道它何时因类似原因而不再有效.
不跟踪服务状态:
#define CONNECT_DBUS_SIG(x,y) connect(blah,SIGNAL(x),this,SLOT(y))
// FIX - should watch for service, and also handle it going away and
// coming back
blah = new BlahService("com.xyzzy.BlahService", "/com/xyzzy/BlahService",
QDBusConnection::sessionBus(), this);
if (!blah)
return 0;
if (blah.isValid())
{
CONNECT_DBUS_SIG(foo(),Event_foo());
}
else
{
// Since we aren't watching for registration, what can we do but exit?
}
Run Code Online (Sandbox Code Playgroud)
可能我们需要在DBus连接对象上注意NameOwnerChanged - 除非QT的dbus代码为我们做这个 - 然后当我们得到那个信号改变状态时,如果需要连接或断开来自对象的信号.
我找到的所有示例要么忽略该问题,要么只是在服务器对象不存在时退出,并且不处理它就会消失.Car/Controller Qt示例至少会注意到服务器是否会消失,如果isValid()在使用过程中变为false,则打印"Disconnected",但它的轮询是isValid().
添加:
请注意,QtDbusAbtractInterface注册服务器所有权的更改(NameOwnerChanged),并在发生更改时更新isValid().因此,我怀疑您可以直接连接到该serverOwnerChanged信号,以了解所有权的更改并将其用作指示器再次尝试 - 尽管您无法信任isValid,因为它可能会在您发出信号之前或之后更新.
或者(丑陋)你可以设置一个计时器并轮询isValid().
我非常熟悉在Android WebView 中使用shouldOverrideUrlLoading 方法,并在几个项目中使用过它。我有一个需要 Mozilla 的 GeckoView 而不是标准 WebView 的新项目,但我似乎无法找到覆盖 url 的方法(以防止用户从最初加载的网站上点击某些链接)。有没有这样的方法?
我已经按照以下说明将 GeckoView 嵌入到我的项目中:https ://wiki.mozilla.org/Mobile/GeckoView并且网站渲染得很好。
我试图模拟的 Android WebView 代码如下所示:
browser.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri uri = Uri.parse(url);
if (url.startsWith("https://www.example.com/")) {
return false;
}
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
GeckoView 中是否有类似的方法?