GVKun编程网logo

来自QWidget的“必须在QPaintDevice之前构造一个QApplication”

29

在本文中,我们将给您介绍关于来自QWidget的“必须在QPaintDevice之前构造一个QApplication”的详细内容,此外,我们还将为您提供关于android–ApplicationSta

在本文中,我们将给您介绍关于来自QWidget的“必须在QPaintDevice之前构造一个QApplication”的详细内容,此外,我们还将为您提供关于android – ApplicationStatus类E / SysUtils:ApplicationStat中的ApplicationContext为null、android – “必须在此操作中指定至少一个ID字段(installationId,deviceToken)”解析、ApplicationListener ApplicationContextAware ApplicationEvent使用、dagger2错误“没有@Inject构造函数或@Provides注释方法无法提供android.app.Application”的知识。

本文目录一览:

来自QWidget的“必须在QPaintDevice之前构造一个QApplication”

来自QWidget的“必须在QPaintDevice之前构造一个QApplication”

我正忙于将IRC客户端从Python
2.6移植到3.3,我偶然发现了PyQt的问题。该应用程序最初使用PyQt4,但我也对其进行了编码,以使其能够与PyQt5一起使用,但是却出现了一个错误,没有任何行引用:“
QWidget:必须在QPaintDevice之前构造一个QApplication”。我已将问题缩小到一堂课。

我知道这里已经被问过很多次了,但是我无法为我的案子提一个肯定的答案,因此,如果我的问题显得无知,我深表歉意。

这里是一些代码:http :
//pastebin.com/Lj60icgQ

愚蠢的是我没有在应有的导入语句之后放置“ app”变量。然后,我将其余代码放在主文件的底部,而不再出现该错误。谢谢您的帮助!

答案1

小编典典

恐怕单个文件在这种情况下是不够的-
仅从这一模块来看执行流程还不清楚。当您尝试使用某些资源/创建一些需要初始化QApplication的对象时,通常会出现问题消息,例如QIcon。

基于Qt的GUI应用程序的实例化通常如下所示:

if __name__ == "__main__":    app = QtGui.QApplication(sys.argv)    main_window = MainWindowClass()    main_window.show()    sys.exit(app.exec_())

android – ApplicationStatus类E / SysUtils:ApplicationStat中的ApplicationContext为null

android – ApplicationStatus类E / SysUtils:ApplicationStat中的ApplicationContext为null

我不时在LogCat中收到此错误:

E / SysUtils:ApplicationStat中的ApplicationContext为null

有谁知道ApplicationStatus类?我没有在我的项目中

它发生在我在openGL中快速渲染纹理时

解决方法

在我的案例中,我成功地解决了这个问题.将参数传递给intent时,我得到一个NullPointerException.

我的问题是在打开新意图时直接传递额外的变量,如下所示.

>调用代码:

intent.putExtra("markerdata: ",assetVO);

>接收代码:

markerdata = (HashMap<String,Object>) getIntent().getSerializableExtra("markerdata");

2天前升级到Android Studio 1.3后,我总是变为空.

所以我的工作是将传递的信息捆绑在一起:

>调用代码:

Bundle b = new Bundle();
            b.putSerializable("markerdata",assetVO);
            intent.putExtras(b);

>接收代码:

Bundle extras = getIntent().getExtras();
markerdata = (HashMap<String,Object>) extras.getSerializable("markerdata");

现在它的工作原理.希望它可以帮助别人.

android – “必须在此操作中指定至少一个ID字段(installationId,deviceToken)”解析

android – “必须在此操作中指定至少一个ID字段(installationId,deviceToken)”解析

这很简单,当你第一次在手机上使用解析时,它就像一个魅力.
当您重新安装应用程序时,它会拧紧所有内容.

如stackoverflow在Eran所述:

“PushService.subscribe似乎将订阅缓存在本地存储中,以避免在多次启动应用程序时重新订阅.
这是该方法的第一个参数用于:
context – 用于访问本地存储以缓存订阅,因此它当前必须是可行的上下文.
(引自here).

但是,卸载应用程序时,将从您的设备中删除该应用程序的本地存储,因此新安装将导致PushService.subscribe重新注册到Google Cloud Messaging.如果新注册返回新的注册ID,则Parse将具有两个注册ID,可用于向您的应用发送推送通知,并且它们都将链接到您提供给订阅的相同userName.因此,向该userName发送通知会将其发送到两个注册ID,导致它到达两次.

当Parse为您发送通知时,他们应该通过canonical_registration_id从Google获取回复,这会让他们知道您设备上与您的应用相关联的注册ID之一已过时,不应再使用了.因此(假设Parse有一个不错的GCM实现),下次你向设备发送通知时,你应该只收到一次.“

这是我的安装源代码:

String  androidId = Secure.getString(getApplicationContext().getContentResolver(),Secure.ANDROID_ID);
Parse.initialize(this,"KEY1","KEY2");
PushService.setDefaultPushCallback(this,ParseActivity.class);

ParseInstallation installation = ParseInstallation.getCurrentInstallation();
installation.put("UniqueId",androidId);

installation.setobjectId(null);

installation.saveInBackground();

我的堆栈跟踪(像每个人一样):

05-20 19:47:35.630: E/ParseCommandCache(6497): com.parse.ParseException: at least one ID field (installationId,devicetoken) must be specified in this operation
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.ParseCommand.onPostExecute(ParseCommand.java:334)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.ParseRequest$5.then(ParseRequest.java:321)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.ParseRequest$5.then(ParseRequest.java:318)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11.run(Task.java:481)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$ImmediateExecutor.execute(Task.java:673)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.completeAfterTask(Task.java:477)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.continueWithTask(Task.java:353)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.continueWithTask(Task.java:364)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$9.then(Task.java:410)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$9.then(Task.java:402)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11.run(Task.java:481)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$ImmediateExecutor.execute(Task.java:673)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.completeAfterTask(Task.java:477)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.access$400(Task.java:22)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$7.then(Task.java:346)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$7.then(Task.java:343)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.runcontinuations(Task.java:510)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.access$800(Task.java:22)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$taskcompletionsource.trySetResult(Task.java:565)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$taskcompletionsource.setResult(Task.java:599)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11$1.then(Task.java:493)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11$1.then(Task.java:485)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$10.run(Task.java:448)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$ImmediateExecutor.execute(Task.java:673)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.completeImmediately(Task.java:444)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.access$300(Task.java:22)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$6.then(Task.java:311)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$6.then(Task.java:308)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.runcontinuations(Task.java:510)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.access$800(Task.java:22)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$taskcompletionsource.trySetResult(Task.java:565)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$taskcompletionsource.setResult(Task.java:599)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11$1.then(Task.java:493)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11$1.then(Task.java:485)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$10.run(Task.java:448)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$ImmediateExecutor.execute(Task.java:673)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.completeImmediately(Task.java:444)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.access$300(Task.java:22)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$6.then(Task.java:311)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$6.then(Task.java:308)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.runcontinuations(Task.java:510)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.access$800(Task.java:22)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$taskcompletionsource.trySetResult(Task.java:565)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$taskcompletionsource.setResult(Task.java:599)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11$1.then(Task.java:493)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11$1.then(Task.java:485)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$10.run(Task.java:448)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$ImmediateExecutor.execute(Task.java:673)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.completeImmediately(Task.java:444)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.continueWith(Task.java:318)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.continueWith(Task.java:329)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11.run(Task.java:485)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$ImmediateExecutor.execute(Task.java:673)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.completeAfterTask(Task.java:477)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.access$400(Task.java:22)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$7.then(Task.java:346)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$7.then(Task.java:343)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.runcontinuations(Task.java:510)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.access$800(Task.java:22)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$taskcompletionsource.trySetResult(Task.java:565)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$taskcompletionsource.setResult(Task.java:599)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11$1.then(Task.java:493)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11$1.then(Task.java:485)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$10.run(Task.java:448)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$ImmediateExecutor.execute(Task.java:673)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.completeImmediately(Task.java:444)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.continueWith(Task.java:318)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task.continueWith(Task.java:329)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at com.parse.Task$11.run(Task.java:485)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-20 19:47:35.630: E/ParseCommandCache(6497):  at java.lang.Thread.run(Thread.java:841)
05-20 19:48:32.615: D/Request(6497): Warning: Sessionless Request needs token but missing either application ID or client token.

由于我没有找到任何真正的解决方案,我在这里问.

谢谢.

解决方法

我绝对相信这是由解析错误引起的.我在Parse.com找到的很多未解决的错误报告也说了同样的事情.
我目前正在使用Parse 1.5.1:
我看到的是没有devicetoken就不会发送推送,如果没有uniqueId,我们会在上面得到运行时错误.
如果我在注册后立即发送UniqueId,则会保存没有devicetoken的行.
在Nexus 5,Nexus 4和Sony xperia E上测试的解决方案:
在您的Application类onCreate()中
Parse.initialize(this,PARSE_APP_KEY_VALUE,PARSE_CLIENT_KEY_VALUE);
    PushService.setDefaultPushCallback(getApplicationContext(),MainActivity.class);
    final ParseInstallation installation = ParseInstallation.getCurrentInstallation();
    final String  androidId = Settings.Secure.getString(getApplicationContext().getContentResolver(),Settings.Secure.ANDROID_ID);
        // Post the uniqueId delayed
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    installation.put("UniqueId",androidId);
                                    installation.saveInBackground(new SaveCallback() {
                                        @Override
                                        public void done(ParseException e) {
                                            // Saved!
                                        }
                                    });
                                }
                            },10000
        );

以这种方式工作,我能够保存正确的行(使用uniqueId和devicetoken),并发送推送通知!干杯!

ApplicationListener ApplicationContextAware ApplicationEvent使用

ApplicationListener ApplicationContextAware ApplicationEvent使用

AppCacheContext.JAVA

方法一:implements ApplicationListener

@SuppressWarnings("rawtypes")
public class AppCacheContext implements ApplicationListener{
	Logger logger = LoggerFactory.getLogger(AppCacheContext.class);
	@Autowired
	private static AppCacheContextDao cacheDao;
	
	public void onApplicationEvent(ApplicationEvent event) {
		Class<? extends ApplicationEvent> clazz = event.getClass();
		System.out.println(clazz.getName());
		if(event instanceof ContextRefreshedEvent){
			ApplicationContext appcontext = ((ApplicationContextEvent) event).getApplicationContext().getParent();
			if(appcontext != null){
				try {
					// 数据字典初始化
					initDicDetailCache();
					logger.info("----------------数据字典初始化完成----------------------");
				} catch (Exception e) {
					e.printStackTrace();
				} 
			}
		}
	}
}

方法二:ApplicationListener<ContextRefreshedEvent>

@SuppressWarnings("rawtypes")
public class AppCacheContext implements ApplicationListener<ContextRefreshedEvent>{
	Logger logger = LoggerFactory.getLogger(AppCacheContext.class);
	@Autowired
	private static AppCacheContextDao cacheDao;
	
	@Override
	public void onApplicationEvent(ContextRefreshedEvent event) {
		ApplicationContext appcontext = event.getApplicationContext().getParent();
		if(appcontext != null){
			try {
				// 数据字典初始化
				initDicDetailCache();
				logger.info("----------------数据字典初始化完成----------------------");
			} catch (Exception e) {
				e.printStackTrace();
			} 
		}
	}
}

 

在ApplicationListener<ContextRefreshedEvent>使用时,会存在一个问题,在web 项目中(spring mvc),系统会存在两个容器,一个是root application context (过程中) ,另一个就是我们自己的 projectName-servlet  context(作为root application context的子容器,初始完成之后)。这种情况下,就会造成onApplicationEvent方法被执行两次。根据自己的需求使用。

上述例子是初始化缓存,在完成之后执行。

解决办法可参考:https://my.oschina.net/u/2369810/blog/682899?nocache=1501657886165

 

dagger2错误“没有@Inject构造函数或@Provides注释方法无法提供android.app.Application”

dagger2错误“没有@Inject构造函数或@Provides注释方法无法提供android.app.Application”

我正在尝试在我的项目中实现dagger2,但遇到错误“
android.app.Application必须在没有@Inject构造函数或@Provides注释方法的情况下才能提供 ”。

这是我的代码:

App.java

package com.poppmedia.wallpaperautomaton;import android.app.Application;import com.poppmedia.wallpaperautomaton.di.DaggerAppComponent;import dagger.android.AndroidInjector;import dagger.android.DaggerApplication;/** * The Android {@link Application}. */public class App extends DaggerApplication {    @Override    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {        return DaggerAppComponent.builder().create(this);    }}

di / AppModule.java

package com.poppmedia.wallpaperautomaton.di;import android.app.Application;import android.content.Context;import javax.inject.Singleton;import dagger.Binds;import dagger.Module;/** * Provider application-wide dependencies. */@Modulepublic interface AppModule {    @Binds    @Singleton    Context bindContext(Application application);}

di / AppComponent.java

package com.poppmedia.wallpaperautomaton.di;import com.poppmedia.wallpaperautomaton.App;import javax.inject.Singleton;import dagger.Component;import dagger.android.AndroidInjector;import dagger.android.support.AndroidSupportInjectionModule;/** * Injects application dependencies. */@Singleton@Component(modules = {        AndroidSupportInjectionModule.class,        AppModule.class,})public interface AppComponent extends AndroidInjector<App> {    @Component.Builder    abstract class Builder extends AndroidInjector.Builder<App> {}}

di / TestClassModule.java

package com.poppmedia.wallpaperautomaton.di;import android.content.Context;import com.poppmedia.wallpaperautomaton.TestClass;import javax.inject.Singleton;import dagger.Module;import dagger.Provides;@Modulepublic class TestClassModule {    @Provides    @Singleton    TestClass provideTestClass(Context context) {        return new TestClass(context);    }}

di / TestClassComponent.java

package com.poppmedia.wallpaperautomaton.di;import com.poppmedia.wallpaperautomaton.TestClass;import javax.inject.Singleton;import dagger.Component;@Singleton@Component(modules = { AppModule.class, TestClassModule.class })public interface TestClassComponent {    TestClass getTestClass();}

TestClass.java

package com.poppmedia.wallpaperautomaton;import android.content.Context;import javax.inject.Inject;import javax.inject.Singleton;@Singletonpublic class TestClass {    private Context mContext;    @Inject    public TestClass(Context context) {        mContext = context;    }}

谢谢。

答案1

小编典典

在您的特定情况下,您会丢失:

@Binds Application bindApplication(App app);

这很重要,因为dagger.android将自动包含
对特定Application,Activity,Fragment,Service,BroadcastReceiver等子类 的绑定 但不包含对
一般对象 的绑定。(您可以注入 App 而不注入 Application ,并注入 YourActivity 而不注入 Activity
。)如果要指示dagger.android使用应用程序实例应满足对Application的请求,则必须包含上述绑定。

一般而言,对于Application,Activity,Service和BroadcastReceiver而言,这是一件相当安全的事情,但对于Fragment(本机或在compat库中)而言则不是。这是因为dagger.android尊重嵌套片段,在这种情况下,要插入哪个片段将是模棱两可的。

尽管您可以通过luffy的答案中的Module和instance字段提供Application
,但这比您需要的样板好,而且优化程度也较低:Dagger将编写代码来调用您的@Provides方法,而您可以声明性地告诉Dagger重用现有的代码使用@Binds或编写static@Provides避免在实例上调用调用的方法进行绑定。

参见Dagger的优势@Binds和Android静态调度的优势。

今天关于来自QWidget的“必须在QPaintDevice之前构造一个QApplication”的分享就到这里,希望大家有所收获,若想了解更多关于android – ApplicationStatus类E / SysUtils:ApplicationStat中的ApplicationContext为null、android – “必须在此操作中指定至少一个ID字段(installationId,deviceToken)”解析、ApplicationListener ApplicationContextAware ApplicationEvent使用、dagger2错误“没有@Inject构造函数或@Provides注释方法无法提供android.app.Application”等相关知识,可以在本站进行查询。

本文标签: