Название: Вызов функции(не слота) по сигналу?
Отправлено: billy4685 от Апрель 01, 2015, 11:29
Здравствуйте, господа форумчане. Задача следующая, есть окно, на окне кнопка. Хочу чтобы при нажатии на кнопку создавалось еще одно окно. Задача простейшая, решается через connect(but, SIGNAL(clicked()), this, SLOT(my_func())). Но дело в том, что второе окно которое должно отображаться у меня описано в другом файле, и не как класс. Поэтому connect уже увы не срабатывает. Для наглядности вот небольшой примерчик: --main.cpp #include "mainwindow.h" #include <QApplication>
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show();
return a.exec(); }
--mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow> #include <QPushButton> #include "newwindow.h"
class MainWindow : public QMainWindow { Q_OBJECT
public: explicit MainWindow(QWidget *parent = 0); ~MainWindow();
QPushButton *but;
}; #endif // MAINWINDOW_H
--mainwindow.cpp #include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setFixedSize(250, 250); move(150, 150); setWindowTitle("Window 1");
but = new QPushButton(this); but->setFixedSize(100, 25); but->move(20, 20); but->setText("Open window 2"); but->show();
connect(but, SIGNAL(clicked()), this, SLOT(newW()));
centralWidget(); }
MainWindow::~MainWindow() { delete this; }
--newwindow.h #include "mainwindow.h" #include <QDialog>
void newW();
--newwindow.cpp #include "newwindow.h"
void newW() { QDialog *dialog = new QDialog; dialog->setFixedSize(150, 150); dialog->move(100, 100); dialog->setWindowTitle("Window 2"); dialog->show(); }
Как быть в данном случаи? Функция newW() не может быть обьявлена в файле newwindow.h как слот.
Название: Re: Вызов функции(не слота) по сигналу?
Отправлено: billy4685 от Апрель 01, 2015, 11:57
Все разобрался, в данном случаи нужно использовать события QEvent. Ну к примеру в данном небольшом примере нужно внести следующие изменения: --mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow> #include <QPushButton> #include <QEvent> #include <QDialog> #include "newwindow.h"
class MainWindow : public QMainWindow { Q_OBJECT
public: explicit MainWindow(QWidget *parent = 0); ~MainWindow();
QPushButton *but;
virtual bool eventFilter(QObject *obj, QEvent *ev);
};
#endif // MAINWINDOW_H
--mainwindow.cpp #include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setFixedSize(250, 250); move(150, 150); setWindowTitle("Window 1");
but = new QPushButton(this); but->setFixedSize(100, 25); but->move(20, 20); but->setText("Open window 2"); but->installEventFilter(this); but->show();
// connect(but, SIGNAL(clicked()), this, SLOT(newW()));
centralWidget(); }
MainWindow::~MainWindow() { delete this; }
bool MainWindow::eventFilter(QObject *obj, QEvent *ev) { if(ev->type() == QEvent::MouseButtonPress) { newW(); } }
Это помогло.
Название: Re: Вызов функции(не слота) по сигналу?
Отправлено: Bepec от Апрель 01, 2015, 12:12
В пятёрке можно соединять просто функции с сигналами. Я когда переходил на пятерку пробовать, забыл написать slots в private и всё равно всё работало :D
Название: Re: Вызов функции(не слота) по сигналу?
Отправлено: Igors от Апрель 01, 2015, 13:49
Как быть в данном случаи? Функция newW() не может быть обьявлена в файле newwindow.h как слот.
Все разобрался, в данном случаи нужно использовать события QEvent.
Это слишком затратно. Проще сделать слот MainWindow который вызывает newW. [off]Интересно дойдет ли до следующего вопроса (как сделать так чтобы newW не создавало окно если оно уже есть) :)
Название: Re: Вызов функции(не слота) по сигналу?
Отправлено: billy4685 от Апрель 01, 2015, 14:24
всем спасибо за ответы) учту
|