crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Don
  опции профиля:
сообщение 10.5.2008, 15:34
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Как добавить главное меню на форму, чтоб оно там нормально выглядело? У меня на форме уже рисуется рисунок и имеется кнопка. Теперь хочу добавить главное меню. Пытался добавлять путём собирания всех виджетов в один Layout, получается билеберда.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
4 страниц V   1 2 3 > »   
Начать новую тему
Ответов (1 - 35)
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2008, 15:37
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


у QMainWindow есть необходимый функционал
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 10.5.2008, 15:49
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.5.2008, 15:37) *
у QMainWindow есть необходимый функционал

А по подробней можно? Мне нужно именно добавить на форму.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2008, 15:53
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


лучше, если б твое окно(форма) было бы наследником QMainWindow, там есть метод setMenuBar(), он устанавливает обект типа QMenuBar
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 10.5.2008, 16:15
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.5.2008, 15:53) *
лучше, если б твое окно(форма) было бы наследником QMainWindow, там есть метод setMenuBar(), он устанавливает обект типа QMenuBar

У меня окно наследует от QWidget
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2008, 16:21
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


измени, я думаю ты ничего не потеряшь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 10.5.2008, 16:26
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.5.2008, 16:21) *
измени, я думаю ты ничего не потеряшь

Теряется
А что добавить в форму главное меню, если форма наследник QWidget, нельзя?

Сообщение отредактировал Don - 10.5.2008, 16:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2008, 16:27
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


например, что? Ведь QMainWindow тоже наследник QWidget.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 10.5.2008, 16:30
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.5.2008, 16:27) *
например, что? Ведь QMainWindow тоже наследник QWidget.

Как я поменял QWidget на QMainWindow, так у меня всё пропало.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2008, 16:37
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


ага, у тебя все на одном виджете было, тогда так:
делаешь подкласс от QMainWindow, и методом setCentralWidget() устанавливаешь свой класс, текущий, а потом методом setMenuBar() устанавливаешь панель меню, так наверное проще будет, т.к. окошко ты уже создал.

покажи свой main()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 10.5.2008, 16:58
Сообщение #11


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.5.2008, 16:37) *
ага, у тебя все на одном виджете было, тогда так:
делаешь подкласс от QMainWindow, и методом setCentralWidget() устанавливаешь свой класс, текущий, а потом методом setMenuBar() устанавливаешь панель меню, так наверное проще будет, т.к. окошко ты уже создал.

покажи свой main()


Если установить свой класс через setCentralWidget(), то к окну добавится тока рисунок, а кнопка пропадает.

CODE

QApplication app(argc,argv);
// Установим кодировку для функции перевода tr()
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));

// Сделаем симпотичный вид
QStyle *pStyle = QStyleFactory::create("Plastique");//Cleanlooks Plastique windows
QApplication::setStyle(pStyle); //
app.setPalette(pStyle->standardPalette());

Main *menu = new Main;
Life *board = new Life;

QWidget *window = new QWidget;
window->setWindowTitle(QObject::tr("Жизнь - Игра"));
window->setGeometry(100,100,700,550); //рамки окна
//window.setFixedSize(700,550); //фиксируем границы

QPushButton *btngo = new QPushButton(QObject::tr("Вперед"));
btngo->setFixedSize(70,28);
QObject::connect(btngo, SIGNAL(clicked()), board, SLOT(ris()));



QVBoxLayout *lay = new QVBoxLayout;
//собираем все виджеты вместе
lay->addWidget(menu);
lay->addWidget(board);
lay->addWidget(btngo);

window->setLayout(lay);
//menu->show();
window->show();
return app.exec();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2008, 17:12
Сообщение #12


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Don @ 10.5.2008, 20:58) *
то к окну добавится тока рисунок, а кнопка пропадает.


это потому, что ты кнопку в main'е делаешь, надо сделать виджет который будет реализовыватьосновную функциональность окна, как отдельный класс , посути это твой
...
QWidget *window = new QWidget;
...




Вот пример с главным окном и меню: Прикрепленный файл  1.ZIP ( 2.8 килобайт ) Кол-во скачиваний: 204

тебе надо изменить конструктор класса MyWidget (class2.cpp) удалить от туда мое, и переместить из main'а кнопку, компоновщик, ну и игровое поле, а виджет window, уже не нужен, т.к. MyWidget и выполняет его роль.
Life    *board = new Life;
QPushButton    *btngo = new QPushButton(QObject::tr("Вперед"));
QVBoxLayout   *lay = new QVBoxLayout;

ну и не забудь приинклюдить, заколовочник своего игрового поля

---
P.S. Там косячек с кодировкой, проверь и исправь, одни файлы в виндовозной, другие в UTF-8.
Причина редактирования: Запаковал пример
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 10.5.2008, 17:58
Сообщение #13


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Заработало, спасибо!
Вот только почему в этом случае для окна не работают такие фукции как:
setWindowTitle();
setGeomtry();
setFixedSize(); //работает как задание минимального размера окна
и т.д. ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2008, 18:09
Сообщение #14


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


приведи пример, где не работает.
заголовок окна - заголовок MyMainWindow , в его конструкторе.
фиксированую геометрию виджета можно задать так,
setMaximumSize(...);
setMinimumSize(...);
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

но это плохо в твоем случае, лучше добавь ,"пружинку" между кнопкой и игровым полем, тогда кнопка будет вменяемого размера, а пространство между кнопкой и полем, будет занято пружинкой.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 10.5.2008, 18:15
Сообщение #15


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.5.2008, 18:09) *
приведи пример, где не работает.
заголовок окна - заголовок MyMainWindow , в его конструкторе.
фиксированую геометрию виджета можно задать так,
setMaximumSize(...);
setMinimumSize(...);
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

но это плохо в твоем случае, лучше добавь ,"пружинку" между кнопкой и игровым полем, тогда кнопка будет вменяемого размера, а пространство между кнопкой и полем, будет занято пружинкой.


Я размеры устанавливал в конструкторе MyMainWindow : QMainWindow, где и делал это окно центральным виджетом. Вот там и не работает.

А как добавить пружинку программно? Я её как-то добавлял в дизайнере, а так не.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2008, 18:37
Сообщение #16


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Don @ 10.5.2008, 22:15) *
Я её как-то добавлял в дизайнере, а так не.

addStretch()
Цитата(Don @ 10.5.2008, 22:15) *
Я размеры устанавливал в конструкторе MyMainWindow : QMainWindow, где и делал это окно центральным виджетом. Вот там и не работает.

Главное окно плохо делать фиксированым, это неудобно для пользователя. если тебе надо фиксировать размер виджета, то его и фиксируй.
// Рекомендация размера, для Layout'ов
QSize MyFixWidget::sizeHint() const
{
    return QSize(столько,на_столько);
}


в заголовочнике так:
...
virtual QSize sizeHint() const;
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 10.5.2008, 18:46
Сообщение #17


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


А как насчёт setWindowTitle() ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2008, 18:53
Сообщение #18


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


у тебя сейчас такая структура получается:
MyMainWindow -> MyWidget -> Life, btngo
если тебе надо фиксированый размер Life, то
либо в нем реализуешь sizeHint(),
либо в MyWidget задаешь фиксированый размер Life'а

---
у меня в конструкторе класса MyMainWindow
setWindowTitle(tr("Привет"));
делает свою работу

---
подправил 14 пост, забыл про косячек с отображением.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 10.5.2008, 23:27
Сообщение #19


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


У меня такая штука. В моей проге при нажатии на Файл->Новая Игра, должно задаться imatrix рандомные значения, но этого не происходит. Помогите плиз выйти из ситуации.

И подскжите плиз как обращаться к данным созданного класса при работе с Главным меню.

Life.h
CODE

#ifndef LIFE_H
#define LIFE_H

#include <QtGui>
#include <QWidget>
#include <QPainter>
#include <QMainWindow>

class Life : public QWidget
{
Q_OBJECT
public:
Life(QWidget *parent = 0);
int imatrix[17][17];
void smile(int x, int y );

protected:
virtual void paintEvent(QPaintEvent*);

public slots:
void ris();

private:
void over();
int newmatrix[17][17];
};
#endif


Life.cpp
CODE

#include <QApplication>
#include <QPainter>
#include <QTextCodec>
#include <QFont>
#include <QPushButton>
#include <QtGui>
#include <math.h>
#include <time.h>
#include <QPushButton>
#include <QMainWindow>
#include "Life.h"

Life::Life(QWidget *parent) : QWidget(parent)
{
srand(time(0));
for (int i = 0; i < 10; i++)
for(int j = 0; j < 10; j++) imatrix[i][j] = rand()%3;
}
void Life::ris()
{
int count = 0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (imatrix[i+1][j] == 1) count++;
if (imatrix[i+1][j+1] == 1) count++;
if (imatrix[i+1][j-1] == 1) count++;
if (imatrix[i][j+1] == 1) count++;
if (imatrix[i][j-1] == 1) count++;
if (imatrix[i-1][j-1] == 1) count++;
if (imatrix[i-1][j] == 1) count++;
if (imatrix[i-1][j+1] == 1) count++;
if (count > 1 && count < 4 && imatrix[i][j] == 1) newmatrix[i][j] =1;
if (count == 3 && imatrix[i][j] == 0) newmatrix[i][j] =1;
if (count > 3) newmatrix[i][j] = 0;
if (count < 2) newmatrix[i][j] = 0;
count = 0;

}
}

for (i = 0; i < 10; i++)
for (int j = 0; j < 10; j++) imatrix[i][j] = newmatrix[i][j];
repaint();

}
void Life::paintEvent(QPaintEvent*)
{
qDebug() << "paintEvent";
QPainter paint(this);
int x = 15;
int y;
paint.setRenderHint(QPainter::Antialiasing,true);
paint.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap));
paint.setBrush(QBrush(Qt::white, Qt::SolidPattern));
for (int i=1; i<=11; i++) //рисуем клетку
{
paint.drawLine(x,15,x,515);

x = x + 50;
}
x = 15;
y = 19;
for (i=1; i<=11; i++)
{
paint.drawLine(15,x,515,x);
x = x+50;
}
x = 19;
paint.setPen(QPen(Qt::white)); //рисуем прямоугольники в клетках
paint.drawRoundRect(19,19,42,42);
for (i=1; i<=10; i++)
{
for (int j=1; j<=10; j++)
{
paint.drawRoundRect(x,y,42,42);
x = x+50;
}
x = 19;
y = y +50;
}

x = 20;
y = 40;
for (int i = 0; i < 10; i++) //рисуем смайлики
{
for(int j = 0; j < 10; j++)
{
if (imatrix[i][j] == 1) smile(x,y);
x = x + 50;
}
y = y + 50;
x = 20;
}

int k = 0;
for (int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
if (imatrix[i][j] == 1) k++;
}
}
if (k == 0) over();
paint.end();
}

void Life::smile(int x, int y) //рисуем смайлик
{
QPainter paintsmile(this);
paintsmile.setRenderHint(QPainter::Antialiasing,true);
paintsmile.setPen(QPen(Qt::black));
paintsmile.setBrush(QBrush(Qt::yellow));
paintsmile.drawEllipse(x,y-20,40,40);
paintsmile.drawEllipse(x+11,y-5,3,3);
paintsmile.drawEllipse(x+26,y-5,3,3);
QRect rect(x+6,y-24,28,39);
int a = 30 * 112;
int b = 120 * 16;
paintsmile.drawArc(rect,a,B);
paintsmile.end();
}
void Life::over()
{
QPainter paint(this);
paint.setRenderHint(QPainter::Antialiasing,true);
paint.setPen(QPen(Qt::black));//, 1, Qt::SolidLine, Qt::RoundCap));
paint.setBrush(QBrush(Qt::black, Qt::SolidPattern));
paint.setFont(QFont("Times",65));
paint.drawText(50,250,"Game Over");
paint.end();

}


mainwindow.h
CODE

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include "Life.h"

class QAction;
class QActionGroup;
class QLabel;
class QMenu;
class QPushButton;
class Life;

class mainwindow : public QMainWindow
{
Q_OBJECT

public:
mainwindow(QWidget *parent = 0);

public slots:
void restart();

private:
void createActions();
void createMenus();

Life *board;
QWidget *gwt;
QPushButton *btngo;
QMenu *fileMenu;
QAction *newGame;
QAction *exitAct;
};

#endif


mainwindow.cpp
CODE

#include <QtGui>
#include <time.h>
#include "Life.h"
#include "mainwindow.h"

mainwindow::mainwindow(QWidget *parent)
{
QWidget *wgt = new QWidget;
setWindowTitle(tr("Жизнь - Игра"));
setGeometry(100,100,700,570);
setFixedSize(700,570);
setCentralWidget(wgt);

Life *board = new Life;

QPushButton *btngo = new QPushButton(QObject::tr("Вперед"));
btngo->setFixedSize(70,28);
QObject::connect(btngo, SIGNAL(clicked()), board, SLOT(ris()));
QHBoxLayout *lay = new QHBoxLayout;
lay->addWidget(board);
lay->addWidget(btngo);
wgt->setLayout(lay);
createActions();
createMenus();
}

void mainwindow::createActions()
{
newGame = new QAction(tr("Новая Игра"),this);
connect(newGame, SIGNAL(triggered()), this, SLOT(restart()));

exitAct = new QAction(tr("Выход"),this);
connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));

}

void mainwindow::createMenus()
{
fileMenu = menuBar()->addMenu(tr("Файл"));
fileMenu->addAction(newGame);
fileMenu->addAction(exitAct);

}
void mainwindow::restart()
{
srand(time(0));
for (int i = 0; i < 10; i++)
for(int j = 0; j < 10; j++) board->imatrix[i][j] = rand()%3;

}


Сообщение отредактировал Don - 10.5.2008, 23:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2008, 23:48
Сообщение #20


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


проверь в слот mainwindow::restart() входит программа? Сообщение пошли для проверки. да и кстати про принудительный репаинт, я тебе в прошлой истории говорил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 11.5.2008, 17:23
Сообщение #21


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.5.2008, 23:48) *
проверь в слот mainwindow::restart() входит программа? Сообщение пошли для проверки. да и кстати про принудительный репаинт, я тебе в прошлой истории говорил.


Сам слот restart() работает. Проверял с помощью QMessaggeBox. А вот када в нём обращаешся к даннам класса Life, работа проги прекращается и выпадает окошко с предупреждением:

Unhandled exception at 0x0040270e in life.exe: 0xC0000005: Access violation writing location 0xcdcdcde1.

и внизу три кнопки Continue, Break, Ignore (не дуступна).
Это связано по ходу с кривым обращением к данным класса Life. Помогите плиз решить проблему.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 11.5.2008, 21:15
Сообщение #22


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ладно, поскажите пожалуйста хотя бы как средствами С++ или Qt можно найти и запустить exe-файл?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Admin
  опции профиля:
сообщение 11.5.2008, 21:30
Сообщение #23


Администратор
****

Группа: Администратор
Сообщений: 646
Регистрация: 9.10.2007
Из: crossplatform.ru
Пользователь №: 1

Спасибо сказали: 17 раз(а)




Репутация:   2  


Примерно так:
     QObject *parent;
     // ...
     QString program = "./path/to/Qt/examples/widgets/analogclock";
     QStringList arguments;
     arguments << "-style" << "motif";

     QProcess *myProcess = new QProcess(parent);
     myProcess->start(program, arguments);


Цитата(Don @ 11.5.2008, 17:23) *
Это связано по ходу с кривым обращением к данным класса Life. Помогите плиз решить проблему.
Угу именно так, я бы тебе посоветовл сделать так:
1. Из конструктора класса Life вынести код:
srand(time(0));
for (int i = 0; i < 10; i++)
    for(int j = 0; j < 10; j++) imatrix[i][j] = rand()%3;}
в отдельную функцию, и вызывать данную функцию в конструкторе и в слоте restart. Ну и правки нужно будет делать не в двую участках кода, а только в данной функции класса.

2. Посмотри в отладчике указатель board валиден или нет, если не валиден, то ищи где он у тебя портится...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 11.5.2008, 21:43
Сообщение #24


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Заносил в отдельную фукцию, всё равно из mainwindow.cpp не работает. А что значит валиден?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.5.2008, 21:50
Сообщение #25


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


валиден - показывает в конкретное место, а не на звезды :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 11.5.2008, 21:51
Сообщение #26


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Указывает на валидный участок памяти, а не на 0x000000, 0xffffff или 0xfefefe и т.д.

Наверняка исключение простреливается именно из-за этого.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 11.5.2008, 22:09
Сообщение #27


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


А смотреть в отладчике как? Это компилировать прогу построчно что-ли? Как им вобще пользоваться?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 11.5.2008, 22:12
Сообщение #28


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Вот можно почитать хорошии статьи по этому поводу:
Отладка в среде Visual C++


Сообщение отредактировал ViGOur - 11.5.2008, 22:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 11.5.2008, 22:17
Сообщение #29


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ViGOur @ 11.5.2008, 22:12) *
Вот можно почитать хорошую статью по этому поводу: Возможности встроенного отладчика Visual C++

Спасибо, конечно! Я прочту. Но можно в кратце, в двух словах. Как его запустить? И где мне там глянуть валиден ли мой board или нет? Просто нужно поскорей
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 11.5.2008, 22:25
Сообщение #30


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Нужно поставить точку останова, на твоей проблемной строчке. Делается это так, поставь курсор на той строчке, что ты хочешь отладить и нажми кнопку F9, после чего с лева от нее должен появится красный кружечек, который называется брэкпоинт.
Затем нажимаешь кнопку F5, после чего запускается твое приложение, и делаешь в нем то, чтобы выполнился твой проблемный участок кода, когда это произойдет студия бросит тебя на установденный брэйкопоинт. Далее, чтобы пошагово ходить нужно работать клавишами F10 (шаг далее) или F11 (шаг в функцию)...

Далее объяснять не буду, так как назначение разного рода окошек описывается в статье...


p.s. я тебе выше добавил еще статей. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 11.5.2008, 23:20
Сообщение #31


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Скажите, вот если я в заголовочном файле mainwndow.h объявил объект Life *board А потом в mainwindow.срр в конструкторе и других функциях вроде как заново объявляю его
Life *board = new Life;
то получается создаются совсем разные объекты?
И почему если объявить объект тока в заголовочном файле и не объявлять ещё в конструкторе и функциях, и обращатся с ним как с созданным объектом, то ничего не рабатает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.5.2008, 7:48
Сообщение #32


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Объявлять надо в одном месте, в хидере:
Life *board; // объявил
,
а в реализации, например в конструкторе:
board = new Life; // создал обект тапа Life и связал его с указателем
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 12.5.2008, 7:49
Сообщение #33


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Немного терминологии:
Life *board1;                 // Объявление
board1 = new Life;         // Определение
Life *board2 = new Life; // Инициализация

Насчет разных указателей на объект:
Life *board=0;
board = new Life(); // для указателя board выделена память, и он указывает на определенный участок ее.
board = new Life(); // снова для указателя board выделена память, и он указывает на другой участок памяти, чем указывал строкой выше.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 12.5.2008, 7:54
Сообщение #34


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Для локальных переменных объявление и определение совпадают. Кроме того, они часто совмещаются с инициализацией.

Не совпадают объявление и определение для внешних глобальных переменных, статических данных членов, неинлайновых функций и экспортных шаблонов (вроде ничего не забыл).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 12.5.2008, 18:00
Сообщение #35


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ViGOur @ 12.5.2008, 7:49) *
Немного терминологии:
Life *board1;                 // Объявление
board1 = new Life;         // Определение
Life *board2 = new Life; // Инициализация

Во, спасибо! Я нашёл ошибку. Нада было объект моего класса не инициализировать, а определять.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 12.5.2008, 18:58
Сообщение #36


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Don @ 12.5.2008, 19:00) *
Во, спасибо! Я нашёл ошибку. Нада было объект моего класса не инициализировать, а определять.
Главное, чтобы ты запомнил, и больше не делал эту ошибку. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 14.7.2025, 11:00