首页 > 其他分享 >QPrinter构造比较慢怎么办

QPrinter构造比较慢怎么办

时间:2023-08-25 09:14:31浏览次数:34  
标签:初始化 打印机 缓存 异步 构造 比较慢 PrinterCache QPrinter

在Qt中,QPrinter构造比较慢可能是因为它需要查询系统上可用的打印机列表。如果系统中有很多打印机或者网络环境不好,这个过程可能会比较耗时。

一种解决方法是将QPrinter的构造延迟到需要使用时再进行。例如,在用户点击“打印”按钮之前,我们不需要创建QPrinter对象。当用户点击“打印”按钮后,再创建QPrinter对象并执行打印操作。

另一种解决方法是在应用程序启动时异步地查询系统上可用的打印机列表,并将其缓存下来。这样,在每次创建QPrinter对象时就可以直接使用缓存中的数据,而不必重新查询系统上的打印机列表。

以下是一个示例代码:

  1. class PrinterCache : public QObject {
  2. Q_OBJECT
  3. public:
  4. static PrinterCache& instance() {
  5. static PrinterCache instance;
  6. return instance;
  7. }
  8. QList<QPrinterInfo> printers() const {
  9. return m_printers;
  10. }
  11. signals:
  12. void initialized();
  13. private slots:
  14. void initialize() {
  15. // 异步查询系统上可用的打印机列表
  16. QFuture<void> future = QtConcurrent::run([this]() {
  17. m_printers = QPrinterInfo::availablePrinters();
  18. emit initialized();
  19. });
  20. // 等待初始化完成
  21. future.waitForFinished();
  22. }
  23. private:
  24. PrinterCache(QObject *parent = nullptr) : QObject(parent) {
  25. // 在构造函数中异步初始化缓存
  26. QMetaObject::invokeMethod(this, &PrinterCache::initialize, Qt::QueuedConnection);
  27. }
  28. QList<QPrinterInfo> m_printers;
  29. };

上面的代码中,我们创建了一个名为PrinterCache的单例类,用于异步地查询系统上可用的打印机列表,并将其缓存下来。在该类的构造函数中,我们使用QMetaObject::invokeMethod()函数异步执行初始化操作,并通过信号initialized()通知外部初始化已完成。在外部需要使用打印机时,只需从缓存中获取可用打印机列表即可。

  1. void print() {
  2. // 创建QPrinter对象并执行打印操作
  3. QPrinter printer;
  4. printer.setPrinterName(PrinterCache::instance().printers().first().printerName());
  5. // ...
  6. }
  7. void onPrintButtonClicked() {
  8. // 等待缓存初始化完成
  9. QEventLoop loop;
  10. QObject::connect(&PrinterCache::instance(), &PrinterCache::initialized, &loop, &QEventLoop::quit);
  11. loop.exec();
  12. // 执行打印操作
  13. print();
  14. }

上面的代码中,我们在用户点击“打印”按钮后等待缓存初始化完成,并通过调用print()函数创建QPrinter对象并执行打印操作。由于缓存已经在应用程序启动时进行了异步查询和初始化,因此这里不会出现延迟或阻塞问题。

 

from:http://linuxcpp.0voice.com/?id=93685

 

标签:初始化,打印机,缓存,异步,构造,比较慢,PrinterCache,QPrinter
From: https://www.cnblogs.com/im18620660608/p/17655963.html

相关文章

  • C++拷贝构造、赋值函数
    拷贝构造拷贝构造就是一种特殊版本的构造函数,格式:类名(const类名&that){    //执行给每个成员变量进行赋值  }什么时候会调用拷贝构造:当使用旧对象(已new的)给新对象(新new的)初始化时,会自动调用拷贝构造    Testt1;//调用无参构造Testt2=t1......
  • C++构造函数、析构函数、初始化列表
    构造函数构造函数就是与类名同名的成员函数,当实例化对象时它会自动执行,当构造函数执行结束后,对象才完成实例化任务:一般负责对类对象进行初始化、资源分配class类名{int*p;public:类名(参数){p=newint;}}......
  • 条件构造器_LambdaUpdateWrapper
        ......
  • 条件构造器_UpdateWrapper
          ......
  • 条件构造器_QueryWrapper
             ......
  • 条件构造器_LambdaQueryWrapper
        ......
  • Python基础入门学习笔记 041 魔法方法:构造和析构
     __init__(self[,...]) 方法是类在实例化成对象的时候首先会调用的一个方法1>>>classRectangle:2def__init__(self,x,y):3self.x=x4self.y=y5defgetPeri(self):6return(self.x+self.y)*27defgetArea......
  • 隐式构造函数和explicit
    当构造函数只有一个构造函数时,可以直接将参数赋值给类对象classEntity{public: Stringm_Name; intm_Age;public: explicitEntity(constString&name):m_Name(name),m_Age(0){} Entity(intage):m_Name("Unkown"),m_Age(age){}};Entitye1=22;Entitye2=......
  • c++ 丢失笔记 [运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符]
    运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符有一部分是学校的OJ里做题需要就提前学了,然后没记笔记,有一部分是笔记丢了。不打算补这些笔记。不过还是在这里mark一下++运算符的重载。因为++运算符可以前置也可以后置,所以这里需要注意一下,如果是后置++,需要一个in......
  • C++ 构造函数与析构函数
    构造函数和析构函数构造函数构造函数会在实例化对象的时候执行,可以在实例化时传入参数。构造函数没有返回值。不需要声明返回值。构造函数的函数名与类名保持一致。//classname:PlayerPlayer(intxa=0,intya=0){//构造函数,传入初始坐标进行初始化......