Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Апрель 01, 2015, 11:29



Название: Вызов функции(не слота) по сигналу?
Отправлено: 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
всем спасибо за ответы) учту