Russian Qt Forum

Qt => Вопросы новичков => Тема начата: makar182 от Август 17, 2014, 13:31



Название: Очередность сигналов
Отправлено: makar182 от Август 17, 2014, 13:31
Добрый день,

Рассматриваю учебный код (крестики-нолики):

Класс самой игры:

Код:
game::game(QWidget *parent) :
    QWidget(parent)
{
    QGridLayout *gl = new QGridLayout();

    setLayout(gl);

    for (int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
        {
            crossButton *cb = new crossButton(this);
            connect(cb, SIGNAL(clicked()), this, SLOT(turn()));
            gl->addWidget(cb, i, j);

    }
}

Класс кнопок этой игры:

Код:
crossButton::crossButton(QWidget *parent) :
    QPushButton(parent)
{
    m_isPressed = false;
    m_isCross = false;
    setMinimumSize(QSize(50, 50));
    setMaximumSize(QSize(50, 50));

    connect(this, SIGNAL(clicked()), this, SLOT(setClickedState()));

}

Непонятно, какая связка connect-ов срабатывает раньше при нажатии на crossButton
Код:
connect(cb, SIGNAL(clicked()), this, SLOT(turn()))
или эта
Код:
connect(this, SIGNAL(clicked()), this, SLOT(setClickedState()))

И еще вопрос - задавая статическую переменную в одном cpp, будет ли она доступна в другом cpp того же проекта?


Название: Re: Очередность сигналов
Отправлено: Bepec от Август 17, 2014, 13:49
Порядок коннектов и прихода сигналов не определён.
Если задать глобальную статическую - то видно будет.
Если публичную статическую - то будет видно,если второй cpp будет иметь указатель на класс из первого cpp.


Название: Re: Очередность сигналов
Отправлено: makar182 от Август 17, 2014, 13:59
Порядок коннектов и прихода сигналов не определён.

Как тогда контролировать сигналы или вообще никак?

Код:
Если задать глобальную статическую - то видно будет.
Если публичную статическую - то будет видно,если второй cpp будет иметь указатель на класс из первого cpp.

1)Глобальная статическая переменная - как она объявляется, подскажите пожалуйста?
2) Указатель на класс из первого cpp - то есть если я сделаю #include "первый_cpp.h"?
Не совсем понимаю.


Название: Re: Очередность сигналов
Отправлено: Igors от Август 17, 2014, 14:17
Непонятно, какая связка connect-ов срабатывает раньше при нажатии на crossButton
Та что коннектилась первой (в данном случае слот turn) - это легко проверить в отладчике.
 
И еще вопрос - задавая статическую переменную в одном cpp, будет ли она доступна в другом cpp того же проекта?
"Статическая" означает "только в этом cpp (местные). Напр

file1.cpp
Код
C++ (Qt)
static int var1 = 0;
 
namespаce {    // рекомендуется так вместо static
int var2 = 0;
}
 
Если нужен доступ из др cpp, то это просто глобальная, напр

file1.cpp
Код
C++ (Qt)
int var3 = 0;
 
file1.h
Код
C++ (Qt)
extern int var3;
 
file2.cpp
Код
C++ (Qt)
#include "file1.h"
var3 = 1;
 


Название: Re: Очередность сигналов
Отправлено: Bepec от Август 17, 2014, 14:29
Был неправ.

Цитировать
If several slots are connected to one signal, the slots will be executed one after the other, in the order they have been connected, when the signal is emitted.
В том порядке, в котором подсоединены.


Название: Re: Очередность сигналов
Отправлено: makar182 от Август 17, 2014, 15:06
Код:
"Статическая" означает "только в этом cpp (местные). Напр

file1.cpp
[code=cpp]static int var1 = 0;

namespаce {    // рекомендуется так вместо static
int var2 = 0;
}

Можете написать этот же код только в определении класса, а то я никак представить это не могу))

Т.е., как я понял, глобальной статическая переменная станет, если мы допишем к её описанию "extern" и вложим заголовочный файл класса с этой переменной в срр, в котором планируется доступ к ней?[/code]


Название: Re: Очередность сигналов
Отправлено: Igors от Август 17, 2014, 15:46
Можете написать этот же код только в определении класса, а то я никак представить это не могу))
Код
C++ (Qt)
// file1.h
class MyClass {
public:
static int mVar1;
};
 
// file1.cpp
int MyClass::mVar1 = 0;
 
// filу2.cpp
#include "file1.h"
MyClass::mVar1 = 33;
 

Т.е., как я понял, глобальной статическая переменная станет, если мы допишем к её описанию "extern" и вложим заголовочный файл класса с этой переменной в срр, в котором планируется доступ к ней?
Не станет. По стандарту есть "локальные переменные" и "нелокальные" - все остальные, которые живут всегда (от начала до конца приложения). static ограничивает "область видимости".  Написали static перед переменной (или объявили ее в безымянном namespace) - все, доступна только в этом файле. Объявили static член класса - значит видима из класса (обращаться просто mVar1) и тем кто видит класс (обращаться MyClass::mVar1)

Пока с азами неважно


Название: Re: Очередность сигналов
Отправлено: makar182 от Август 17, 2014, 15:58
Спасибо Igors! :)

И еще вопрос:
Цитировать
... и тем кто видит класс (обращаться MyClass::mVar1)

Такое правило относится только к static членам класса?


Название: Re: Очередность сигналов
Отправлено: kambala от Август 17, 2014, 16:45
Цитировать
Код
C++ (Qt)
static int var1 = 0;
 
namespаce {    // рекомендуется так вместо static
int var2 = 0;
}
кем рекомендуется? я, например, о таком никогда не слышал.
Цитировать
... и тем кто видит класс (обращаться MyClass::mVar1)
Такое правило относится только к static членам класса?
да (ну и к статическим методам тоже)


Название: Re: Очередность сигналов
Отправлено: Igors от Август 17, 2014, 17:19
кем рекомендуется? я, например, о таком никогда не слышал.
Я уже и не могу вспомнить где это почерпнул - так давно :) Во всяком случае попробовав разок - к "static" уже вряд ли вернетесь, анонимное namespace гораздо удобнее.


Название: Re: Очередность сигналов
Отправлено: makar182 от Август 17, 2014, 20:25
Вопрос не по теме - в каком разделе этого форума можно выложить легкий код для помощи в поиске ошибки?


Название: Re: Очередность сигналов
Отправлено: kambala от Август 17, 2014, 20:54
вопросы новичков :)


Название: Re: Очередность сигналов
Отправлено: makar182 от Август 17, 2014, 21:11
Хорошо :) Тут напишу тогда, чтобы темы не плодить :)
Писал учебный код по MVC и при запуске вышло системное сообщение о ошибке запуска, а в терминале вышла такая ошибка "ASSERT failure in QVector<T>::operator[]: "index out of range". У преподавателя все получилось вроде :)Ниже код.

main.cpp
Код:
#include <QApplication>
#include "calendar.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    calendar c;
    c.show();
    return a.exec();
}

calendar.h
Код:
#ifndef CALENDAR_H
#define CALENDAR_H

#include <QWidget>
#include <QTableView>
#include <QPushButton>
#include <QVector>

class calendar : public QWidget
{
    Q_OBJECT

    QTableView                      *m_view;
    QVector<QPushButton *> m_buttons;


public:
    explicit calendar(QWidget *parent = 0);

signals:

public slots:

};

#endif // CALENDAR_H

calendar.cpp
Код:
#include "calendar.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QWidget>

calendar::calendar(QWidget *parent) :
    QWidget(parent)
{
    const int buttonNum = 5;

    QString btns[buttonNum] =
    {
        "Spring",
        "Summer",
        "Fall",
        "Winter",
        "All"
    };
    setLayout((new QVBoxLayout));
    QHBoxLayout *lay = new QHBoxLayout();

    m_view = new QTableView(this);

    for (int i = 0; i < buttonNum; ++i)
    {
        m_buttons[ i ] = new QPushButton(btns[ i ], this);
        lay->addWidget(m_buttons[ i ]);
    }

    layout()->addWidget(m_view);
    layout()->addItem(lay);

}


Название: Re: Очередность сигналов
Отправлено: Bepec от Август 17, 2014, 21:28
Учиться учиться и ещё раз учиться :D
Это с++, тут управлять памятью нужно вручную.

Ошибка - выход за границы вектора.

При создании вектор пуст. И память не выделена, ибо он пуст :)
Потому надо не
Код:
 m_buttons[ i ] = bla bla
а
Код:
QPushButton * point = new QPushButton bla bla;
m_buttons.Append(point);


Название: Re: Очередность сигналов
Отправлено: makar182 от Август 17, 2014, 21:37
Учиться учиться и ещё раз учиться :D
Это с++, тут управлять памятью нужно вручную.

Ошибка - выход за границы вектора.

При создании вектор пуст. И память не выделена, ибо он пуст :)
Потому надо не
Код:
 m_buttons[ i ] = bla bla
а
Код:
QPushButton * point = new QPushButton bla bla;
m_buttons.Append(point);

Как же у него получилось тогда? ???

По поводу учиться я согласен - я в этом бизнесе всего два с лишним месяца(с нуля) и много не знаю ;D ;D ;D


Название: Re: Очередность сигналов
Отправлено: Bepec от Август 17, 2014, 22:35
Я думаю ваш преподаватель сначала создал кнопки и запихал их в вектор. А потом проехался по вектору, делая что надо.


Название: Re: Очередность сигналов
Отправлено: makar182 от Август 17, 2014, 22:48
Я думаю ваш преподаватель сначала создал кнопки и запихал их в вектор. А потом проехался по вектору, делая что надо.

Да вроде нет, хотя может неправильно понял :) Это я смотрел запись Qt лекций Nokia :)


Название: Re: Очередность сигналов
Отправлено: Bepec от Август 17, 2014, 23:02
Ещё как вариант он сразу выделил место под N элементов.