Главное меню |
Здравствуйте, гость ( Вход | Регистрация )
Главное меню |
Don |
10.5.2008, 16:58
Сообщение
#11
|
Студент Группа: Новичок Сообщений: 59 Регистрация: 19.3.2008 Пользователь №: 127 Спасибо сказали: 0 раз(а) Репутация: 0 |
ага, у тебя все на одном виджете было, тогда так: делаешь подкласс от 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 |
то к окну добавится тока рисунок, а кнопка пропадает. это потому, что ты кнопку в main'е делаешь, надо сделать виджет который будет реализовыватьосновную функциональность окна, как отдельный класс , посути это твой
Вот пример с главным окном и меню: 1.ZIP ( 2.8 килобайт ) Кол-во скачиваний: 183 тебе надо изменить конструктор класса MyWidget (class2.cpp) удалить от туда мое, и переместить из main'а кнопку, компоновщик, ну и игровое поле, а виджет window, уже не нужен, т.к. MyWidget и выполняет его роль.
ну и не забудь приинклюдить, заколовочник своего игрового поля --- 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 , в его конструкторе. фиксированую геометрию виджета можно задать так,
но это плохо в твоем случае, лучше добавь ,"пружинку" между кнопкой и игровым полем, тогда кнопка будет вменяемого размера, а пространство между кнопкой и полем, будет занято пружинкой. |
|
|
Don |
10.5.2008, 18:15
Сообщение
#15
|
Студент Группа: Новичок Сообщений: 59 Регистрация: 19.3.2008 Пользователь №: 127 Спасибо сказали: 0 раз(а) Репутация: 0 |
приведи пример, где не работает. заголовок окна - заголовок MyMainWindow , в его конструкторе. фиксированую геометрию виджета можно задать так,
но это плохо в твоем случае, лучше добавь ,"пружинку" между кнопкой и игровым полем, тогда кнопка будет вменяемого размера, а пространство между кнопкой и полем, будет занято пружинкой. Я размеры устанавливал в конструкторе MyMainWindow : QMainWindow, где и делал это окно центральным виджетом. Вот там и не работает. А как добавить пружинку программно? Я её как-то добавлял в дизайнере, а так не. |
|
|
Litkevich Yuriy |
10.5.2008, 18:37
Сообщение
#16
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Я её как-то добавлял в дизайнере, а так не. addStretch() Я размеры устанавливал в конструкторе MyMainWindow : QMainWindow, где и делал это окно центральным виджетом. Вот там и не работает. Главное окно плохо делать фиксированым, это неудобно для пользователя. если тебе надо фиксировать размер виджета, то его и фиксируй.
в заголовочнике так:
|
|
|
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,; 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() входит программа? Сообщение пошли для проверки. да и кстати про принудительный репаинт, я тебе в прошлой истории говорил.
|
|
|
Текстовая версия | Сейчас: 26.4.2024, 17:18 |