Qt Designer - Comment connecter un signal à une fonction statique?
Très bien, je suis à l'aide de Qt Designer pour créer une interface graphique. J'ai réussi à comprendre comment faire de la barre de menu et j'ai ajouté quelques actions à la barre, mais maintenant j'ai besoin de connecter les actions de leur faire faire quelque chose.
Plus précisément, sur mon menu fichier, j'ai le simple ouvert d'action. Je veux cette action pour exécuter une fonction qui s'appelle mon QFileDialog et ainsi de suite, mais je ne sais pas comment faire.
Alors, comment puis-je connecter mon actionOpen à ma fonction statique?
Je suis en utilisant le dernier Qt, 5.0.2
Je suis un peu frustré ici. C'est évidemment l'un des la plupart des choses de base quelqu'un pourrait avoir besoin de le faire, et pourtant je ne trouve pas de réelle solution à ce n'importe où sur le web. De l'absence de Qt wiki, pour les questions des autres personnes, personne ne semble vraiment avoir une réponse claire. Il y a des réponses pour les anciennes versions de Qt, mais dans ces anciennes versions apparemment signaux ne pouvait pas se connecter à des fonctions statiques, donc, ceux qui sont hors de propos. Et personne ne semble savoir comment faire cela dans le Qt Designer. Aussi, personne n'a jamais précise où mettre quoi.
J'ai cette ligne dans mon main.cpp fichier:
QObject::connect(actionOpen, &actionOpen::triggered, fileOpen)
J'ai un objet appelé "actionOpen" made in Qt Designer, il est un signal appelé déclenchée, et j'ai une fonction définie juste en dessous de mon principal à l'intérieur de main.cpp appelé "fileOpen'. Ce qui semble suivre la syntaxe correcte, mais il génère de nombreuses erreurs.
Aussi, je peux vous cliquez plusieurs fois sur construire dans Qt Creator, et chaque fois qu'il arrive, avec un nombre différent d'erreurs, de disparaître et de réapparaître, sans même me toucher le code. Je commence à penser que cette IDE est une sorte de POS.
EDIT:
Voici mes fichiers. Peut-être que cela aidera un peu.
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!";
}
Alors, comment pourrais-je aller à ce sujet? Vous dites que j'ai besoin de créer ma propre classe pour la actionOpen objet, héritant de QObject, et donnez-lui un membre de la fonction à exécuter? Cela semble un peu bidon, d'avoir à créer une classe pour chaque objet et de l'action dans Qt Designer que je veux utiliser. Je peux voir généralement les signaux sont envoyés à partir d'un objet à un logement d'un autre objet, mais pour une simple commande ouvrir le fichier, il n'y a pas d'objet récepteur. Je ne comprends pas comment ce modèle de la connexion marche bien dans ce cas.
Double Possible?: stackoverflow.com/questions/9428038/...
Nope, j'ai lu ce message, et ma question n'est toujours pas répondu. Ce post fait référence à l'ancienne syntaxe, et la réponse sommet des liens vers une page sur la nouvelle syntaxe, j'ai aussi lu et je suis toujours confus au sujet de.
Désolé mec, je n'ai jamais essayé de le faire. Je souhaite que je pourrais aider.
OriginalL'auteur krb686 | 2013-06-17
Vous devez vous connecter pour publier un commentaire.
Le second argument est incorrect. Vous devez spécifier le nom de la classe, pas de nom d'objet. Il devrait donc être:
Complète d'un exemple fonctionnel (testé):
J'ai déménagé l'appel de connexion à la mainwindow.cpp fichier au lieu de main.cpp, qui semble être le seul endroit où je peux accéder à fileOpen, à l'aide de l'interface utilisateur->fileOpen, puis je reçois le message d'erreur MainWindow::fileOpen 'appel de la fonction argument manquant liste, utiliser &MainWindow::fileOpen pour créer un pointeur, j'essaie de les utiliser, et il donne de la" nul QtPrivate::FunctionPointer<Func>::appel...impossible de convertir le paramètre 2 de QObject* mainwindow. Je n'ai aucune idée de ce qu'il se passe. Je suis un débutant en c++ et c'est beaucoup trop confus pour moi. Tout ce que je veux faire est de vous connecter à la simple fonction appelée fileOpen, pourquoi ne peut il pas être simple.
Avez-vous écrit
MainWindow::fileOpen
? Il est incorrect. Ou qu'est-ce que votre code exact que vous êtes en essayant de compiler?J'ai essayé les deux façons, avec la fonction déclarée juste avec "void fileOpen', et aussi 'void MainWindow::fileOpen", ni de leur travail.
J'ai édité mon post original et collé le code à partir de mes fichiers. Peut-être que vous pouvez repérer l'erreur maintenant.
OriginalL'auteur Pavel Strakhov
1.) Créer créneau régulier et d'appeler la fonction statique.
OU
2.) Je suppose que vous pourrait créer un singleton macro q_object de la classe et de se connecter à elle - bien sûr, comme dans l'option 1, vous devez ensuite faire l'appel quel que soit statique/fonction globale.
Je suis juste essayer de mon mieux pour répondre à la question, mais comme la plupart des commentaires ci - dessus, ce n'est pas quelque chose que j'ai besoin de besoin de le faire. Je peux dire que QtCreator/Concepteur est vraiment un outil formidable et que vous surmonter certains des courbes d'apprentissage ce sera moins frustrant.
Strakhov si nous ne pouvons pas utiliser
this
et la fonction est dans une autre classe?OriginalL'auteur Huy