Qt-Designer - so schließen Sie ein signal an eine statische Funktion?
Okay, ich bin mit dem Qt Designer ein GUI zu bauen. Ich habe es geschafft, herauszufinden, wie man die menuBar und ich habe einige Aktionen an der bar, aber jetzt muss ich schließen Sie die Aktionen, um Sie etwas tun.
Speziell, auf meinem Datei-Menü, ich habe das einfache öffnen Aktion. Ich möchte diese Aktion, um eine Funktion auszuführen, ruft meine QFileDialog und so weiter, aber ich weiß nicht, wie dies zu tun.
So, wie Verbinde ich mein actionOpen auf meine statische Funktion?
Ich verwende die neueste Qt 5.0.2
Ich bin ein wenig frustriert hier. Dies ist offensichtlich eine der grundlegendsten Dinge, die jemand tun muss, doch ich finde keine wirkliche Lösung zu diesem überall auf das web. Von dem fehlenden Qt-wiki, um anderen Menschen zu Fragen, niemand scheint wirklich eine klare Antwort. Es gibt Antworten, die für ältere Versionen von Qt, aber in den alten Versionen offenbar Signale konnte keine Verbindung mit statischen Funktionen, so dass diese irrelevant sind. Und niemand scheint zu wissen, wie dies zu tun ist durch den Qt-Designer. Auch, niemand klärt, wo, was.
Ich habe diese Zeile in meine main.cpp Datei:
QObject::connect(actionOpen, &actionOpen::triggered, fileOpen)
Ich habe ein Objekt namens 'actionOpen' made in Qt-Designer, es ist ein signal genannt, ausgelöst, und ich habe eine Funktion definiert, die nur unter meinem Haupt innen main.cpp genannt 'fileOpen'. Dies scheint zu Folgen, die richtige syntax, aber es wirft viele Fehler.
Auch, ich kann immer wieder klicken Sie auf erstellen in der Qt Creator und jedes einzelne mal, es kommt mit einer unterschiedlichen Anzahl von Fehlern, verschwinden und wieder auftauchen, ohne mich selbst zu berühren, den code. Ich fange an zu denken, dass dieser IDE ist eine Art POS.
EDIT:
Hier sind meine Dateien. Vielleicht hilft es etwas.
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void fileOpen();
private:
Ui::MainWindow *ui;
};
#endif //MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
QObject::connect(ui->actionOpen, &QAction::triggered, &MainWindow::fileOpen);
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void fileOpen()
{
/*
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QString(),
tr("Text Files (*.txt);;C++ Files (*.cpp *.h)"));
if (!fileName.isEmpty()) {
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::critical(this, tr("Error"), tr("Could not open file"));
return;
}
QTextStream in(&file);
ui->textEdit->setText(in.readAll());
file.close();
}
*/
cout << "Hello!";
}
Also, wie würde ich gehen? Sie sagen, ich brauche, um meine eigene Klasse für die actionOpen Objekt erbt von QObject, und geben Sie es ein Mitglied-Funktion zum laufen? Das scheint mir ein wenig falsch, dass eine Klasse erstellen, die für jedes Objekt und Aktion im Qt-Designer verwenden möchten. Ich kann sehen, dass in der Regel Signale von einem Objekt an einen slot von einem anderen Objekt, aber für eine einfache Datei-öffnen-Befehl, es gibt keine Empfänger-Objekt. Ich verstehe nicht, wie das Modell der Verbindung funktioniert in diesem Fall.
Mögliche Duplikate?: stackoverflow.com/questions/9428038/...
NÖ, ich habe gelesen, dass die post, und meine Frage immer noch nicht beantwortet. Das post bezieht sich auf die alte syntax, und die top-Antwort links zu einer Seite, auf die neue syntax, die habe ich auch gelesen und bin immer noch verwirrt darüber.
Sorry dude, ich habe nie versucht, dies zu tun. Ich wünschte, ich könnte helfen.
InformationsquelleAutor krb686 | 2013-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das zweite argument ist falsch. Sie sollten angeben, den Namen der Klasse, nicht Objekt-Namen. So sollte es sein:
Funktionsfähiges Beispiel (getestet):
Ich zog die connect-Aufruf der mainwindow.cpp Datei statt main.cpp,, das scheint der einzige Ort zu sein ich kann auf fileOpen, über ui->fileOpen, dann bekomme ich den Fehler MainWindow::fileOpen ' - Funktion aufrufen, fehlende argument-Liste, verwenden Sie &MainWindow::fileOpen einen Zeiger zu erstellen, ich Versuch mal das, und es gibt 'void QtPrivate::FunctionPointer<U>::call...cannot convert parameter 2 von QObject* zu mainwindow. Ich habe keine Ahnung, was Los ist. Ich bin ein noob in c++ und das ist viel zu verwirrend für mich. Alles was ich tun möchte ist die Verbindung zu der einfachen Funktion fileOpen, warum kann das nicht einfach sein.
Hast du schrieb
MainWindow::fileOpen
? Es ist falsch. Oder was ist Ihre genaue code, den Sie versuchen zu kompilieren?Ich habe versucht, es in beide Richtungen, mit der Funktion deklariert nur mit 'void fileOpen', und auch 'void MainWindow::fileOpen', keiner von Ihnen arbeiten.
Ich bearbeitete meinen ursprünglichen post eingefügt und den code von meinen Dateien. Vielleicht können Sie vor Ort den Fehler jetzt.
InformationsquelleAutor Pavel Strakhov
1.) Erstellen der regelmäßigen slot und rufen Sie die statische Funktion.
ODER
2.) Ich nehme an, du könnte erstellen einer singleton-Q_OBJECT Klasse und verbinden Sie es - natürlich wie bei option 1 würden Sie dann den Aufruf zu was auch immer statische/Globale Funktion.
Ich versuche nur mein bestes, um die Frage zu beantworten, aber wie viele der Kommentare oben - das ist nicht etwas, dass ich brauchte, jemals tun musste. Ich kann sagen, dass QtCreator/Designer ist ein wirklich tolles tool und wie Sie zu überwinden einige der Lernkurven werden es weniger frustrierend.
Strakhov, wenn wir nicht verwenden können
this
und die Funktion in einer anderen Klasse?InformationsquelleAutor Huy