invalid operands to binary expression ('QLabel *' and 'QPixmap')



  • Hi,
    ich bekomme die Fehlermeldung:
    invalid operands to binary expression ('QLabel *' and 'QPixmap')
    bei der If-Bedingung:

    if(bildLabel == Bild1)
    

    bildLabel ist ein QLabel auf Heap, Bild1 ist ein QPixmap in einer Klasse. Bedeutet:

    Deklaration bildLabel:

    QLabel *bildLabel = new QLabel
    

    Deklaration Bild1:

    QPixmap Bild1("E:/C++/Qt/102/Bild1.png");
    

    Auch wenn ich bildLabel in der Klasse deklariere bekomme ich diese Fehlermeldung.
    Allersings in der Variante:
    invalid operands to binary expression ('QLabel ' and 'QPixmap')

    Demnach muss der Fehler in der If-Bedingung liegen.
    Hier ist auch das == rot unterstrichen.
    Nur kann ich mit der Aussage: invalid operands to binary expression
    nichts anfangen.
    Diese Fehlermeldung bekomme ich auch bei:

    if(bildLabel.pixmap() == Bild1)
    

    Letztlich ist meine Frage, was in die If-Bedingung muss um zu prüfen,
    ob das Bild in das Label geladen wurde.



  • Du vergleichst einen Pointer ...
    QPixmap hat auch keinen operator==(). Du müsstest beide Bilder nach QImage konvertieren und dann vergleichen.

    Wieso "merkst" Du Dir nicht einfach welches Bild Du wohin geladen hast?


  • Mod

    Die Fehlermeldung sagt: Es gibt keinen Vergleichsoperator, um diese beiden Typen von Objekten zu vergleichen. Oder sprichwörtlich: Du versuchst Äpfel mit Birnen zu vergleichen. Ein Zeiger auf QLabel ist nun einmal etwas gänzlich anderes als eine QPixmap.

    @theAnfänger77 sagte in invalid operands to binary expression ('QLabel *' and 'QPixmap'):

    Letztlich ist meine Frage, was in die If-Bedingung muss um zu prüfen,
    ob das Bild in das Label geladen wurde.

    Du willst die Objektidentität vergleichen? Dann vermutlich so etwas wie bildLabel->pixmap() == &Bild1. Das prüft, ob die pixmap dasselbe ist wie Bild1. Wenn du prüfen willst, ob es die pixmap das gleiche ist wie Bild1, dann siehe Swordfish. Beides kommt mir aber nicht sehr sinnvoll vor (besonderes nicht ein Gleichheitsvergleich von Bildern), daher kann ich nur dazu raten, dass du dein Vorhaben insgesamt überdenken solltest.



  • Bei:

    if(bildLabel->pixmap() == &Bild1)
    

    stürzt das Programm ab.

    Bei dem Versuch die Bilder zu konvertieren kommt:
    no viable conversion from 'QLabel *' to 'QImage'
    bzw.
    no viable conversion from 'QPixmap *' to 'QImage'

    Am Pointer liegt es auch nicht,
    denn auch wenn ich bildLabel in der Klasse deklariere bekomme ich diese Fehlermeldung.
    Allersings in der Variante:
    invalid operands to binary expression ('QLabel ' and 'QPixmap')

    Es wird wohl darauf hinauslaufen, dass ich mein Vorhaben überdenken muss und das Problem anders lösen muss.
    Zu prüfen, ob ein Bild in ein Label geladen wurde, wird allerdings ein Problem sein, mit dem ich mich noch weiter befassen werde.


  • Mod

    @theAnfänger77 sagte in invalid operands to binary expression ('QLabel *' and 'QPixmap'):

    Bei:

    if(bildLabel->pixmap() == &Bild1)
    

    stürzt das Programm ab.

    Dann hast du ganz andere Probleme…



  • @SeppJ Pointer vergleichen funktioniert nicht weil sich das QLabel bei setPixmap() seine eigene Kopie macht.

    QtGuiApplication1.h

    #pragma once
    
    #include <QtWidgets/QDialog>
    #include "ui_QtGuiApplication1.h"
    
    class QtGuiApplication1 : public QDialog
    {
    	Q_OBJECT
    
    public:
    	QtGuiApplication1(QWidget *parent = Q_NULLPTR);
    
    private:
    	Ui::QtGuiApplication1Class ui;
    	QPixmap sad_smiley;
    	QPixmap happy_smiley;
    
    private slots:
    	void set_sad_smiley();
    	void set_happy_smiley();
    	void which_smiley();
    };
    

    QtGuiApplication1.cpp

    #include "QtGuiApplication1.h"
    #include <QMessageBox>
    
    QtGuiApplication1::QtGuiApplication1(QWidget *parent)
    	: QDialog      { parent },
    	  sad_smiley   { "sad_smiley.png" },
    	  happy_smiley { "happy_smiley.png" }
    {
    	ui.setupUi(this);
    
    	connect(ui.pushButtonLoadSadSmiley,   SIGNAL(released()), this, SLOT(set_sad_smiley())   );
    	connect(ui.pushButtonLoadHappySmiley, SIGNAL(released()), this, SLOT(set_happy_smiley()) );
    	connect(ui.pushButtonWhichSmiley,     SIGNAL(released()), this, SLOT(which_smiley())     );
    }
    
    void QtGuiApplication1::set_sad_smiley()
    {
    	ui.label->setPixmap(sad_smiley);
    }
    
    void QtGuiApplication1::set_happy_smiley()
    {
    	ui.label->setPixmap(happy_smiley);
    }
    
    void QtGuiApplication1::which_smiley()
    {
    	QMessageBox message_box;
    	message_box.setWindowTitle("Smiley Info:");
    	
    	if (!ui.label->pixmap()) {
    		message_box.setText("No Picture");
    		message_box.exec();
    		return;
    	}
    
    	QImage image_from_label{ ui.label->pixmap()->toImage() };
    
    	if ( image_from_label == sad_smiley.toImage()) {
    		message_box.setText("Sad Smiley :(");
    	}
    	else if (image_from_label == happy_smiley.toImage()) {
    		message_box.setText("Happy Smiley :)");
    	}
    	else {
    		message_box.setText("No Smiley _._");
    	}
    
    	message_box.exec();
    }
    

    ui_QtGuiApplication1.h

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>QtGuiApplication1Class</class>
     <widget class="QDialog" name="QtGuiApplication1Class">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>670</width>
        <height>475</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>QtGuiApplication1</string>
      </property>
      <widget class="QLabel" name="label">
       <property name="geometry">
        <rect>
         <x>60</x>
         <y>40</y>
         <width>400</width>
         <height>400</height>
        </rect>
       </property>
       <property name="frameShape">
        <enum>QFrame::Box</enum>
       </property>
       <property name="text">
        <string/>
       </property>
      </widget>
      <widget class="QPushButton" name="pushButtonLoadSadSmiley">
       <property name="geometry">
        <rect>
         <x>510</x>
         <y>50</y>
         <width>111</width>
         <height>23</height>
        </rect>
       </property>
       <property name="text">
        <string>Set Sad Smiley</string>
       </property>
      </widget>
      <widget class="QPushButton" name="pushButtonLoadHappySmiley">
       <property name="geometry">
        <rect>
         <x>510</x>
         <y>80</y>
         <width>111</width>
         <height>23</height>
        </rect>
       </property>
       <property name="text">
        <string>Set Happy Smiley</string>
       </property>
      </widget>
      <widget class="QPushButton" name="pushButtonWhichSmiley">
       <property name="geometry">
        <rect>
         <x>510</x>
         <y>110</y>
         <width>111</width>
         <height>23</height>
        </rect>
       </property>
       <property name="text">
        <string>Which Smiley?</string>
       </property>
      </widget>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources>
      <include location="QtGuiApplication1.qrc"/>
     </resources>
     <connections/>
    </ui>
    

    happy_smiley.png
    sad_smiley.png


    Vielleicht reicht es für Dein Vorhaben auch, die QPixmap::cacheKey()s zu vergleichen.


Anmelden zum Antworten