Qt Designer — Как подключить сигнал к статической функции?

Хорошо, я использую Qt Designer для создания графического интерфейса. Мне удалось выяснить, как создать панель меню, и я добавил некоторые действия в панель, но теперь мне нужно соединить действия, чтобы они что-то делали.

В частности, в моем файловом меню у меня есть простое действие открытия. Я хочу, чтобы это действие запускало функцию, которая вызывает мой QFileDialog и так далее, но я не знаю, как это сделать.

Итак, как мне подключить мой actionOpen к моей статической функции?

Я использую последнюю версию Qt, 5.0.2

Я немного расстроен здесь. Это, очевидно, одна из самых простых вещей, которые кто-то может сделать, но я нигде не могу найти реального решения этой проблемы в Интернете. От недостающей вики Qt до вопросов других людей, похоже, никто не может дать четкого ответа. Есть ответы для более старых версий Qt, но в этих старых версиях сигналы, по-видимому, не могли подключаться к статическим функциям, поэтому они не имеют значения. И никто, кажется, не знает, как сделать это через Qt Designer. Кроме того, никто никогда не разъясняет, где что поставить.

У меня есть эта строка в моем файле main.cpp:

QObject::connect(actionOpen, &actionOpen::triggered, fileOpen)

У меня есть объект с именем ‘actionOpen’, созданный в Qt Designer, есть сигнал с именем triggered, и у меня есть функция, определенная чуть ниже моего main внутри main.cpp, которая называется ‘fileOpen’. Кажется, это соответствует правильному синтаксису, но выдает много ошибок.

Кроме того, я могу многократно щелкать по сборке в Qt Creator, и каждый раз, когда он обнаруживает различное количество ошибок, исчезает и появляется снова, даже не касаясь кода. Я начинаю думать, что эта IDE является своего рода POS.

РЕДАКТИРОВАТЬ:

Вот мои файлы. Может быть, это поможет несколько.

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!";
}

4

Решение

Второй аргумент неверен. Вы должны указать имя класса, а не имя объекта. Так и должно быть:

QObject::connect(actionOpen, &QAction::triggered, fileOpen);

Полный рабочий пример (проверено):

void fileOpen() {
qDebug() << "ok";
}

int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QMenu menu;
QAction* actionOpen = menu.addAction("test");
QObject::connect(actionOpen, &QAction::triggered, fileOpen);
menu.show();
return a.exec();
}
3

Другие решения

1.) Создать обычный слот и вызвать статическую функцию.

ИЛИ ЖЕ

2.) Я полагаю, вы мог создайте одноэлементный класс Q_OBJECT и подключитесь к нему — конечно, как вариант 1, вы затем вызовете любую статическую / глобальную функцию.

/**
* Pseudo-code!, the singleton should be in its own header file
* not in the global main.cpp file.
*/
class Singleton : public QObject
{
Q_OBJECT
public:
Singleton() : QObject() {}
static Singleton* getInstance() {
if(!_instance) _instance = new Singleton();
return _instance;
}
public slots:
void mySlot() { qDebug() << __FILE__ << " " << __FUNCTION__ << __LINE__;
}
private:
static Singleton* _instance;
};

Singleton* Singleton::_instance = NULL;

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

Singleton* instance = Singleton::getInstance();
QObject::connect(&w, SIGNAL(destroyed()), instance, SLOT(mySlot()));

return a.exec();
}

Я просто изо всех сил стараюсь ответить на вопрос, но, как и многие из вышеприведенных комментариев — это не то, что мне когда-либо нужно было делать. Я могу сказать, что QtCreator / Designer — действительно удивительный инструмент, и, когда вы преодолеете некоторые из кривых обучения, это будет меньше разочаровывать.

-1

По вопросам рекламы [email protected]