Хорошо, я использую 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!";
}
Второй аргумент неверен. Вы должны указать имя класса, а не имя объекта. Так и должно быть:
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();
}
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 — действительно удивительный инструмент, и, когда вы преодолеете некоторые из кривых обучения, это будет меньше разочаровывать.