Question

Je développe l'image logiciel aquisition. Je veux lancer la fonction d'affichage dans un thread séparé (pour assurer la visualisation en direct pour faciliter la capture d'image). Pour l'instant je suis le sous-classement QObject, ce qui crée DisplayObject et en utilisant la fonction QThread :: moveToThread. Le problème est que DisplayObject doit interagir avec l'interface graphique (images doivent être affichées dans les objets QGraphicsView). Quel est le meilleur (et le plus élégant) façon de le faire?

Ma solution actuelle:

class DisplayObject : public QObject
{
    Q_OBJECT
    public:
        inline void addDetectorSystem(cci::PGR* system);
        inline void connectGui(ImageAquisition* gui);

    public slots:
        void display();

    private:
        cci::PGR* camSystem;
        ImageAquisition* guiClass;
};

DisplayObject est initialisé comme suit:

  DisplayObject Displayer;
        Displayer.addDetectorSystem(PGRSystem);
        Displayer.connectGui(this);
        QThread thread;
        Displayer.moveToThread(&thread);
        connect(this, SIGNAL(display()), &Displayer, SLOT(display()));
        thread.start();

J'ai oublié d'admettre, que cela ne fonctionne pas ...

Était-ce utile?

La solution

Vous pouvez utiliser QImage dans des threads non-UI. Cela vous permettra de faire votre capture / dessin à une image. Une fois qu'une image est prête à être affichée, vous pouvez alors émettre un signal avec l'image. Votre élément d'interface utilisateur devrait avoir une fente reliée à ce signal qui prend l'image donnée et se rafraîchit pour tirer cette image.

En utilisant des signaux et des fentes, les données doivent être transférées d'une manière adaptée aux threads. En utilisant QImages dans les autres threads, vous pouvez dessiner, et l'interface utilisateur principale est seul responsable de la mise à jour des images créées, au lieu de passer beaucoup de temps à les traiter.

Autres conseils

En général, l'interface graphique est le fil conducteur et tout le travail est fait dans les discussions de fond.
En effet, le thread principal doit gérer la souris, redessiner, iconify événements etc

La bonne chose à propos de Qt est que vous pouvez envoyer des signaux / slots entre les fils.

Voir filetage dans qt pour une vue d'ensemble.

Il y a aussi une bonne nouvelle avancé livre Qt qui couvre threadign dans détail

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top