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!";
}
Das ist nicht "eines der wichtigsten Dinge". Signale sind in der Regel verbunden mit slots, die sind nicht-statische member-Funktionen von QObject abgeleiteten Klassen. Ich empfehle Ihnen, verwenden Sie die regulären slots. Anschluss an eine statische Funktion sollte verwendet werden, wenn es wirklich erforderlich ist.
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

Schreibe einen Kommentar