crossplatform.ru

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

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> Главное меню
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 килобайт ) Кол-во скачиваний: 183

тебе надо изменить конструктор класса 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() входит программа? Сообщение пошли для проверки. да и кстати про принудительный репаинт, я тебе в прошлой истории говорил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.4.2024, 17:18