Problem mit QComboBox

Alles rund um die Programmierung mit Qt
KingV1k
Beiträge: 76
Registriert: 16. Oktober 2006 10:24

Problem mit QComboBox

Beitrag von KingV1k »

Hi

mein Problem ist das dashier nicht funktioniert:

Code: Alles auswählen

QObject::connect(comboBox, SIGNAL(highlighted()), MainWindow, SLOT(close()));
obwohl dashier funktioniert:

Code: Alles auswählen

QObject::connect(btnClose, SIGNAL(clicked()), MainWindow, SLOT(close()));
comboBox ist QComboBox <== ist eigentlich auch logisch
Ich benutze Qt 4.2
Es werden keine Fehlermeldungen beim compilieren ausgegeben.

Hat jemand eine Idee?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ich kann mir nicht vorstellen, das es ein Signal highlighted ohne Parameter gibt. Dazu brauch ich nicht mal die Doku :-) Also wird da nichts connected und das wirst Du bei einem Debuglauf auch sehen.
KingV1k
Beiträge: 76
Registriert: 16. Oktober 2006 10:24

Beitrag von KingV1k »

sorry hab ich nur vergessen einzufügen. ich hab es mit den werten 0, 1,2 und 3 probiert. hat aber trotzdem nicht geklappt. also vielleicht hab ich die doku falsch verstanden, aber mit diesen werten klappt es auch nicht.
KingV1k
Beiträge: 76
Registriert: 16. Oktober 2006 10:24

Beitrag von KingV1k »

tut mir leid, das ich hier soviel schreibe, aber es ist wichtig für mich. also hat jemand eine idee?

Mit freundlich Grüßen
KingV1k
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wo hast Du denn da Werte gesetzt? Wenn ich richtig liege und du hast

Code: Alles auswählen

QObject::connect(comboBox, SIGNAL(highlighted(1)), MainWindow, SLOT(close())); 
gemacht, dann würde ich sagen Du schaust Dir Signals und Slots nochmal genau an. Sowas ist nämlich weder möglich noch logisch...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Vaaco
Beiträge: 21
Registriert: 12. Oktober 2006 11:51

Beitrag von Vaaco »

Hi,

der richtige Aufruf wäre:

QObject::connect(comboBox, SIGNAL(highlighted(int)), MainWindow, SLOT(close()));

oder

QObject::connect(comboBox, SIGNAL(highlighted(QString)), MainWindow, SLOT(close()));
KingV1k
Beiträge: 76
Registriert: 16. Oktober 2006 10:24

Beitrag von KingV1k »

das versteh ich nicht ganz. wie übergib ich ihm dann den wert? welchen wert hat int in diesem moment? versteht ihr was ich meine
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich wusste doch dass es keinen Sinn hat ihm das vorzukauen.

@KingV1k: Beschäftige dich bitte mit den Qt-Tutorial und werde Dir im klaren wie Signals und Slots funktionieren! Falls Du Fragen dazu hast werden wir Dir gerne weiterhelfen, aber ganz ohne Grundkenntnisse geht es nunmal nicht!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Vaaco
Beiträge: 21
Registriert: 12. Oktober 2006 11:51

Beitrag von Vaaco »

Es wäre wirklich besser wenn du erstmal das Tutorial durcharbeiten würdest.

Zu deiner Frage:

Mit connect erstellst du lediglich eine Verbindung zwischen dem Signal und dem Slot, d.h. in diesem Moment hat dein int keinen Wert.
Dein int bekommt erst dann einen Wert wenn das Signal tatsächlich ausgelöst wurde, in diesem Fall sobald ein Benutzer etwas in der ComboBox auswählt. int hat dann den Wert des entsprechenden index.
KingV1k
Beiträge: 76
Registriert: 16. Oktober 2006 10:24

Beitrag von KingV1k »

ok ich habs jetzt durchgelesen, aber irgnedwie will es noch immer nicht.

Code: Alles auswählen

public slots:
	void testfunktion(int testvar)
	{
		comboBox->addItem("String");
		pBarStatus->setValue(80);
	}
.........
........
.........
QObject::connect(comboBox, SIGNAL(highlighted(int)), MainWindow, SLOT(testfunktion(int)));

eigentlich müsste doch ein int wert meiner funktion übergeben werden. macht es aber nicht. es ändert sich nichts an meiner gui. wieso?
Vaaco
Beiträge: 21
Registriert: 12. Oktober 2006 11:51

Beitrag von Vaaco »

Dein Slot testfunktion bekommt von dem Signal highlighted einen integer wert übergeben, sobald jemand in der comboBox etwas anwählt.
KingV1k
Beiträge: 76
Registriert: 16. Oktober 2006 10:24

Beitrag von KingV1k »

genau das selbe dachte ich auch, aber es passiert nichts.cverstehst du was ich meine?
Vaaco
Beiträge: 21
Registriert: 12. Oktober 2006 11:51

Beitrag von Vaaco »

Starte das Programm mal im Debug Modus und suche im Ausgabefenster nach der Meldung "Object::connect: No such slot ..."

Wenn du fündig wirst ist dein connect fehlgeschlagen. Das wird nicht vom Compiler bemängelt, daher der Umweg über debug.
KingV1k
Beiträge: 76
Registriert: 16. Oktober 2006 10:24

Beitrag von KingV1k »

mein problem hat sich noch immer nicht gelöst, deswegen poste ich mal den quellcode:

main.cpp

Code: Alles auswählen

#include <QApplication>
#include <QtGui>
#include <QtCore>
#include "ui_untitled.h"
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
	//cout<<"testttt"<<endl;
	QMainWindow *window = new QMainWindow();
    Ui::MainWindow ui;
    ui.setupUi(window);
    
    
    window->show();
   
   
   
    return app.exec();
}

ui_untitled.h

Code: Alles auswählen

/********************************************************************************
** Form generated from reading ui file 'untitled.ui'
**
** Created: Mon 16. Oct 09:49:12 2006
**      by: Qt User Interface Compiler version 4.2.0
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/

#ifndef UI_UNTITLED_H
#define UI_UNTITLED_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QComboBox>
#include <QtGui/QFrame>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QMainWindow>
#include <QtGui/QProgressBar>
#include <QtGui/QPushButton>
#include <QtGui/QWidget>


class Ui_MainWindow
{

public slots:
	void testfunktion(const QString testvar)
	{
		comboBox->addItem("String");
		pBarStatus->setValue(70);
		
	}

public:
    QWidget *centralwidget;
    QLabel *lblUeberschrift;
    QLabel *lblStatus;
    QFrame *line;
    QPushButton *btnCreate;
    QPushButton *btnClose;
    QComboBox *comboBox;
    QProgressBar *pBarStatus;
    QLineEdit *lineEditStatus;
	
	
    void setupUi(QMainWindow *MainWindow)
    {
    MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
    lblUeberschrift = new QLabel(centralwidget);
    lblUeberschrift->setObjectName(QString::fromUtf8("lblUeberschrift"));
    lblUeberschrift->setGeometry(QRect(20, 20, 191, 31));
    lblStatus = new QLabel(centralwidget);
    lblStatus->setObjectName(QString::fromUtf8("lblStatus"));
    lblStatus->setGeometry(QRect(290, 20, 51, 31));
    line = new QFrame(centralwidget);
    line->setObjectName(QString::fromUtf8("line"));
    line->setGeometry(QRect(260, -10, 20, 191));
    line->setFrameShape(QFrame::VLine);
    line->setFrameShadow(QFrame::Sunken);
    btnCreate = new QPushButton(centralwidget);
    btnCreate->setObjectName(QString::fromUtf8("btnCreate"));
    btnCreate->setGeometry(QRect(20, 120, 141, 41));
    btnClose = new QPushButton(centralwidget);
    btnClose->setObjectName(QString::fromUtf8("btnClose"));
    btnClose->setGeometry(QRect(170, 120, 81, 41));
    comboBox = new QComboBox(centralwidget);
    comboBox->setObjectName(QString::fromUtf8("comboBox"));
    comboBox->setGeometry(QRect(20, 60, 231, 22));
    comboBox->setMouseTracking(true);
    comboBox->setMaxVisibleItems(10);
    
    //added die comboBox-Items
   
   
    comboBox->addItem("No validator2");
    comboBox->addItem("No validator3");
    comboBox->addItem("No validator4");
    comboBox->addItem("No validator5");
    comboBox->addItem("No validator6");
    //end
    
    pBarStatus = new QProgressBar(centralwidget);
    pBarStatus->setObjectName(QString::fromUtf8("pBarStatus"));
    pBarStatus->setGeometry(QRect(290, 140, 118, 23));
    pBarStatus->setValue(50);
    pBarStatus->setOrientation(Qt::Horizontal);
    lineEditStatus = new QLineEdit(centralwidget);
    lineEditStatus->setObjectName(QString::fromUtf8("lineEditStatus"));
    lineEditStatus->setGeometry(QRect(290, 60, 121, 61));
    lineEditStatus->setReadOnly(true);
    MainWindow->setCentralWidget(centralwidget);
    QWidget::setTabOrder(comboBox, btnCreate);
    QWidget::setTabOrder(btnCreate, btnClose);
    QWidget::setTabOrder(btnClose, lineEditStatus);

    retranslateUi(MainWindow);

    QSize size(437, 181);
    size = size.expandedTo(MainWindow->minimumSizeHint());
    MainWindow->resize(size);

    QObject::connect(btnClose, SIGNAL(clicked()), MainWindow, SLOT(close()));
    QObject::connect(btnCreate, SIGNAL(clicked()), MainWindow, SLOT(close()));
    QObject::connect(comboBox, SIGNAL(highlighted(const QString &)), MainWindow, SLOT(testfunktion(const QString &)));
	pBarStatus->setValue(80);
    //QObject::connect(comboBox, SIGNAL(highlighted(const QString &)), MainWindow, SLOT(close()));
    
    

    QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
    MainWindow->setWindowTitle(QApplication::translate("MainWindow", "Create ISO", 0, QApplication::UnicodeUTF8));
    lblUeberschrift->setText(QApplication::translate("MainWindow", "Altiris Deployment Server ausw\303\244hlen:", 0, QApplication::UnicodeUTF8));
    lblStatus->setText(QApplication::translate("MainWindow", "Status:", 0, QApplication::UnicodeUTF8));
    btnCreate->setText(QApplication::translate("MainWindow", "Boot-ISO erstellen", 0, QApplication::UnicodeUTF8));
    btnClose->setText(QApplication::translate("MainWindow", "Schlie\303\237en", 0, QApplication::UnicodeUTF8));
    lineEditStatus->setText(QString());
    Q_UNUSED(MainWindow);
    } // retranslateUi
	
};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

#endif // UI_UNTITLED_H
Vaaco
Beiträge: 21
Registriert: 12. Oktober 2006 11:51

Beitrag von Vaaco »

Vorweg mal was Allgemeines:
Die ui_.h Datei ist Tabu! Da solltest du nichts dran ändern! Besser du leitest dir eine Klasse von UI_MainWindow ab und änderst darin sämtliche Einstellungen!

Zu deinem Problem:
Versuch mal das hier:
connect(comboBox, SIGNAL(highlighted(const QString &)), this, SLOT(testfunktion(const QString &)));

Das sollte funktionieren!
Antworten