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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Очередность сигналов  (Прочитано 5765 раз)
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 того же проекта?
« Последнее редактирование: Август 17, 2014, 13:35 от makar182 » Записан
Bepec
Гость
« Ответ #1 : Август 17, 2014, 13:49 »

Порядок коннектов и прихода сигналов не определён.
Если задать глобальную статическую - то видно будет.
Если публичную статическую - то будет видно,если второй cpp будет иметь указатель на класс из первого cpp.
Записан
makar182
Гость
« Ответ #2 : Август 17, 2014, 13:59 »

Порядок коннектов и прихода сигналов не определён.

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

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 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;
 
« Последнее редактирование: Август 17, 2014, 14:20 от Igors » Записан
Bepec
Гость
« Ответ #4 : Август 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.
В том порядке, в котором подсоединены.
Записан
makar182
Гость
« Ответ #5 : Август 17, 2014, 15:06 »

Код:
"Статическая" означает "только в этом cpp (местные). Напр

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

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

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

Т.е., как я понял, глобальной статическая переменная станет, если мы допишем к её описанию "extern" и вложим заголовочный файл класса с этой переменной в срр, в котором планируется доступ к ней?[/code]
« Последнее редактирование: Август 17, 2014, 15:08 от makar182 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 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)

Пока с азами неважно
« Последнее редактирование: Август 17, 2014, 15:48 от Igors » Записан
makar182
Гость
« Ответ #7 : Август 17, 2014, 15:58 »

Спасибо Igors! Улыбающийся

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

Такое правило относится только к static членам класса?
« Последнее редактирование: Август 17, 2014, 16:00 от makar182 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Август 17, 2014, 16:45 »

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 17, 2014, 17:19 »

кем рекомендуется? я, например, о таком никогда не слышал.
Я уже и не могу вспомнить где это почерпнул - так давно Улыбающийся Во всяком случае попробовав разок - к "static" уже вряд ли вернетесь, анонимное namespace гораздо удобнее.
Записан
makar182
Гость
« Ответ #10 : Август 17, 2014, 20:25 »

Вопрос не по теме - в каком разделе этого форума можно выложить легкий код для помощи в поиске ошибки?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Август 17, 2014, 20:54 »

вопросы новичков Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
makar182
Гость
« Ответ #12 : Август 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);

}
Записан
Bepec
Гость
« Ответ #13 : Август 17, 2014, 21:28 »

Учиться учиться и ещё раз учиться Веселый
Это с++, тут управлять памятью нужно вручную.

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

При создании вектор пуст. И память не выделена, ибо он пуст Улыбающийся
Потому надо не
Код:
 m_buttons[ i ] = bla bla
а
Код:
QPushButton * point = new QPushButton bla bla;
m_buttons.Append(point);
Записан
makar182
Гость
« Ответ #14 : Август 17, 2014, 21:37 »

Учиться учиться и ещё раз учиться Веселый
Это с++, тут управлять памятью нужно вручную.

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

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

Как же у него получилось тогда? Непонимающий

По поводу учиться я согласен - я в этом бизнесе всего два с лишним месяца(с нуля) и много не знаю Смеющийся Смеющийся Смеющийся
« Последнее редактирование: Август 17, 2014, 21:49 от makar182 » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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