Russian Qt Forum
Ноябрь 25, 2024, 18:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов функции(не слота) по сигналу?  (Прочитано 2550 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Апрель 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 как слот.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #1 : Апрель 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();
    }
}
Это помогло.
Записан
Bepec
Гость
« Ответ #2 : Апрель 01, 2015, 12:12 »

В пятёрке можно соединять просто функции с сигналами. Я когда переходил на пятерку пробовать, забыл написать slots в private и всё равно всё работало Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 01, 2015, 13:49 »

Как быть в данном случаи? Функция newW() не может быть обьявлена в файле newwindow.h как слот.
Все разобрался, в данном случаи нужно использовать события QEvent.
Это слишком затратно. Проще сделать слот MainWindow который вызывает newW.

[off]Интересно дойдет ли до следующего вопроса (как сделать так чтобы newW не создавало окно если оно уже есть)  Улыбающийся
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #4 : Апрель 01, 2015, 14:24 »

всем спасибо за ответы) учту

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 22.