Seite 1 von 1
qt designer und signale
Verfasst: 7. April 2006 14:05
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?
qt designer und signale
Verfasst: 7. April 2006 16:55
von medi
hallo!
Du kannst die Verknüpfungen zwischen Signalen und Slots im Desginer anlegen oder im Quellcode defineren.
Willst Du beides nicht?
Tschau
Verfasst: 8. April 2006 13:13
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

Verfasst: 8. April 2006 19:39
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.
Verfasst: 10. April 2006 21:56
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
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?
Verfasst: 10. April 2006 22:33
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
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
Verfasst: 11. April 2006 12:14
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
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 ...
Verfasst: 11. April 2006 13:44
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