qt designer und signale

Verschiedenes zu Qt
Antworten
netchamber
Beiträge: 4
Registriert: 7. April 2006 13:53

qt designer und signale

Beitrag von netchamber »

hallo,

ich habe mir die neuste qt version inklusive qt designer runtergeladen, kompiliert und installiert. ich habe auch schon ein paar schöne formulare erstellt. mein problem ist, dass ich weder in der doku noch in diesem forum rausgefunden habe, wie ich bspw. beim klicken auf einen button eine beliebige funktion ausführen kann, die nicht zwingend etwas mit den anderen komponenten auf dem formular zu tun hat. ich möchte also nicht, m.h. der connect funktion/methode zwei komponenten mit SIGNAL und SLOT miteinander verbinden. stattdessen möchte ich, dass beim klicken auf den button ...
- ein text auf der konsole ausgegeben wird oder
- eine berechnung ausgeführt und ihr ergebnis ausgegeben wird oder
- eine mysql verbindung aufgebaut wird oder
- inhalte von text eingabefeldern gelesen werden und als eingaben für funktionen verwendet werden ... oder oder oder ...

wie mache ich das?
medi
Beiträge: 16
Registriert: 2. März 2006 13:25

qt designer und signale

Beitrag von medi »

hallo!

Du kannst die Verknüpfungen zwischen Signalen und Slots im Desginer anlegen oder im Quellcode defineren.
Willst Du beides nicht?

Tschau
netchamber
Beiträge: 4
Registriert: 7. April 2006 13:53

Beitrag von netchamber »

hallo,

ja ich kann mit dem designer bspw. einen close button mit dem formular verbinden, sodass beim klicken auf den button die quit() methode des main windows ausgeführt wird. aber ich möchte beim klick auf einen button eine im quelltext von mir definierte funktionen aufrufen können .... man, ich kann echt gut erklären :?
dankeschön im voraus
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag von Adi »

So wie ich das gesehen habe, geht das beim Qt 4 nicht (mehr).
Du kannst aber statt connect auch on_<dein_Button>_clicked() verwenden.

Definiere diese Funktion im private slots: von deiner abgeleitete QDialog Klasse.

Danach kannst du diese Funktion verwenden.
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
netchamber
Beiträge: 4
Registriert: 7. April 2006 13:53

Beitrag von netchamber »

hallo,

ich habe im designer mal ein formular erstellt, das nur aus einem mainwindow mit einem push button besteht. die datei hab ich mit

Code: Alles auswählen

uic -o easy.h easy.h
konvertiert und in die main.cpp mittels include eingebunden.

easy.h:

Code: Alles auswählen

#ifndef EASY_H
#define EASY_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QMainWindow>
#include <QtGui/QPushButton>
#include <QtGui/QStatusBar>
#include <QtGui/QWidget>

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QPushButton *pushButton;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
    MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    MainWindow->resize(QSize(121, 47).expandedTo(MainWindow->minimumSizeHint()));
    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
    pushButton = new QPushButton(centralwidget);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(20, 0, 73, 25));
    MainWindow->setCentralWidget(centralwidget);
    statusbar = new QStatusBar(MainWindow);
    statusbar->setObjectName(QString::fromUtf8("statusbar"));
    statusbar->setGeometry(QRect(0, 28, 121, 19));
    MainWindow->setStatusBar(statusbar);
    retranslateUi(MainWindow);

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

    void retranslateUi(QMainWindow *MainWindow)
    {
    MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
    pushButton->setText(QApplication::translate("MainWindow", "PushButton", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(MainWindow);
    } // retranslateUi

};

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

#endif // EASY_H
main.cpp:

Code: Alles auswählen

#include "easy.h"
#include <QApplication>
#include <QMainWindow>

int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
        QMainWindow *window = new QMainWindow;
        Ui::MainWindow ui;
        ui.setupUi(window);

        window->show();
        return app.exec();
}
wie man sieht, habe ich keine von QDialog abgeleitete klasse. wenn ich

Code: Alles auswählen

private slots:
        void on_pushButton_clicked() {
                cout << "TEST" << endl;
        }
nach der funktion retranslateUi() aus easy.h einfüge (sowie iostream inkludiere und "using namespace std" hinzufüge), wird die datei zwar kompiliert - die änderung zeigt aber keine wirkung. beim klick auf den pushbutton wird leider nichts ausgegeben. woran liegt das?
dankeschön im voraus
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag von Adi »

netchamber hat geschrieben:cout << "TEST" << endl;
Zuuerst: ist das unter Linux oder Windows.

Bei Windows
Wo erwartest du eine Ausgabe? im CMD oder in der Entwicklungsumgebung wie VC 2005 Express?

Den unter CMD wirst du keine Ausgabe Sehen (Auch mit QDebug() nicht). Aber in der MS Entwicklungsumgebung kommt was mit QDebug().
Versuch das einmal mit

Code: Alles auswählen

QMessageBox
Unter Linux:
Keine Ahnung :?

Das andere ist die Einbindung:
Im main.cpp wird normalerweise die Dialogklasse eingebunden (z.B dialog.cpp & dialog.h). Und dort werden dann die Funktionen für dein Dialog definiert.
main.cpp

Code: Alles auswählen

#include <QApplication>
#include <QWidget>

#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainDialog MyDialog;
    
    MyDialog.show();
    return app.exec();
} 
dialog.h

Code: Alles auswählen

#ifndef DIALOG_H
#define DIALOG_H

#include "easy.h"

// Klasse für den Dialog
class MainDialog : public QDialog, private Ui::MainDialog
{
    Q_OBJECT

public:
    MainDialog(QWidget *parent = 0);
    ~MainDialog();

private slots:
    // Auto-Connect
    void on_pushButton_clicked();
};

#endif
dialog.cpp

Code: Alles auswählen

#include "dialog.h"

// Hauptfenster initialisieren
MainDialog::MainDialog(QWidget *parent) : QDialog(parent)
{
    setupUi(this);       // Form laden
}

void MainDialog::on_pushButton_clicked()
{
    QMessageBox::information(this, tr("Testmeldung"), tr("Das ist ein Test"), QMessageBox::Cancel);
}
Ich hoffe, dass ich nichts wesendliches vergessen habe
Zuletzt geändert von Adi am 11. April 2006 13:38, insgesamt 2-mal geändert.
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
netchamber
Beiträge: 4
Registriert: 7. April 2006 13:53

Beitrag von netchamber »

hallo,

erstmal dankeschön für die zahlreichen code beispiele... in welcher datei steht der letzte codeblock deines postings?
Adi hat geschrieben:

Code: Alles auswählen

#include "dialog.h"

// Hauptfenster initialisieren
MainDialog::MainDialog(QWidget *parent) : QDialog(parent)
{
    setupUi(this);       // Form laden
}

void MainDialog::on_pushButton_clicked()
{
    QMessageBox::information(this, tr("Testmeldung"), tr("Das ist ein Test"), QMessageBox::Cancel);
}
meinst du damit "dialog.cpp"? unter dieser annahme, habe ich

Code: Alles auswählen

qmake -projekt
qmake
make
ausgeführt. leider bekomme ich beim kompilieren zahlreiche fehlermeldungen ...

Code: Alles auswählen

$ make
g++ -c -pipe -g -Wall -W -D_REENTRANT  -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.1.2/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.1.2/include/QtCore -I/usr/local/Trolltech/Qt-4.1.2/include/QtGui -I/usr/local/Trolltech/Qt-4.1.2/include -I. -I. -I. -o dialog.o dialog.cpp
In file included from dialog.cpp:1:
dialog.h:8: error: `MainDialog' is not a class or namespace
dialog.h:8: error: invalid base-class specification
dialog.h:8: error: base class `QDialog' has incomplete type
dialog.h:8: Warnung: `class MainDialog' has virtual functions but non-virtual 
   destructor
In Datei, eingefügt von dialog.cpp:1:
dialog.h:20:7: Warnung: Kein Newline am Dateiende
dialog.cpp: In constructor `MainDialog::MainDialog(QWidget*)':
dialog.cpp:5: error: type `class QDialog' is not a direct base of `MainDialog'
dialog.cpp:7: error: `setupUi' undeclared (first use this function)
dialog.cpp:7: error: (Each undeclared identifier is reported only once for each 
   function it appears in.)
dialog.cpp: In member function `void MainDialog::on_pushButton_clicked()':
dialog.cpp:12: error: no matching function for call to `QMessageBox::
   information(MainDialog* const, QString, QString, QMessageBox::Button)'
/usr/local/Trolltech/Qt-4.1.2/include/QtGui/qmessagebox.h:81: error: candidates 
   are: static int QMessageBox::information(QWidget*, const QString&, const 
   QString&, int, int, int)
/usr/local/Trolltech/Qt-4.1.2/include/QtGui/qmessagebox.h:88: error:            
        static int QMessageBox::information(QWidget*, const QString&, const 
   QString&, const QString&, const QString&, const QString&, int, int)
make: *** [dialog.o] Fehler 1
hmm ...
dankeschön im voraus
Adi
Beiträge: 87
Registriert: 1. Januar 2006 14:51

Beitrag von Adi »

Ja im dialog.cpp, sorry.

Und im dialog.h sollte es

class MainDialog : public QDialog, private Ui::MainWindow

sein. Bei mir ist es die MainDialog. Auch hier sorry
Win 2k, Win XP
QT Win Opensource 4.1.1
MinGW 3.4.2
Antworten