crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QLVM4, необходимо переделать
neochapay
  опции профиля:
сообщение 14.5.2008, 17:36
Сообщение #1


Новичок


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

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




Репутация:   0  


Нужно создать лёгкий WM на qt4 по виду как это



А в оригинале так



Самое подходящее что нашёл как раз qlwm - достаточно легковесный WM да и мал по размерам - легчее изучать развивать будет
Столкнулся с такой задачей как замены кнопок бара внизу на меню
а сплющило меня вот на чём

src/menu.cpp: In constructor ‘menu::menu(QWidget*)’:
src/menu.cpp:69: ошибка: нет декларации ‘menuBar’ в этой области видимости
src/menu.cpp:69: предупреждение: unused variable ‘mainMenu’


Что не так ?

Выкладываю изменённые файлы в комплект
menu.cpp
CODE
#include <QtGui/QMenuBar>
#include "defs.h"
#include "defaults.h"
#include "qapp.h"
#include "toolbar.h"
#include "conf.h"
#include "moc_menu.cpp"

#define kcursor_width 32
#define kcursor_height 32
uchar menu::kcursor_bits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x01,
0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x08, 0x10, 0x01,
0x80, 0x10, 0x08, 0x01, 0x80, 0x20, 0x04, 0x01, 0x80, 0x40, 0x02, 0x01,
0x80, 0x80, 0x01, 0x01, 0x80, 0x80, 0x01, 0x01, 0x80, 0x40, 0x02, 0x01,
0x80, 0x20, 0x04, 0x01, 0x80, 0x10, 0x08, 0x01, 0x80, 0x08, 0x10, 0x01,
0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

uchar menu::kcursor_mask[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0x03,
0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x03, 0xc0, 0x1c, 0x38, 0x03,
0xc0, 0x38, 0x1c, 0x03, 0xc0, 0x70, 0x0e, 0x03, 0xc0, 0xe0, 0x07, 0x03,
0xc0, 0xc0, 0x03, 0x03, 0xc0, 0xc0, 0x03, 0x03, 0xc0, 0xe0, 0x07, 0x03,
0xc0, 0x70, 0x0e, 0x03, 0xc0, 0x38, 0x1c, 0x03, 0xc0, 0x1c, 0x38, 0x03,
0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x03, 0xc0, 0xff, 0xff, 0x03,
0xc0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};


menu::menu(QWidget*)
{
// setFixedSize(defaults::tc_height, defaults::tc_height);
// killop = FALSE;
// basemenu = new QMenu(this);
// Q_CHECK_PTR(basemenu);
// connect(basemenu, SIGNAL(triggered(QAction *)), this, SLOT(run_menu(QAction *)));
// QImage img(qapp::get_cfile("menu.xpm"));
//
// if(! img.isNull()) // make scaled pixmap
// {
// int wh = defaults::tc_height-4;
// setIcon(QIcon(QPixmap::fromImage(img.scaled(wh, wh, Qt::IgnoreAspectRatio, Qt::SmoothTransformation))));
// }
//
// setText("Menu");
//
// act_quit = new QAction(this);
// act_quit->setData(QVariant(QString("_Quit")));
// act_kill = new QAction(this);
// act_kill->setData(QVariant(QString("_Kill")));
// act_rest = new QAction(this);
// act_rest->setData(QVariant(QString("_Restart")));
QMenu *mainMenu = menuBar()->addMenu(tr("Main"));
}

void menu::readmenu(void)
{
QString fname = qapp::get_cfile("menuconfig");

if(fname.isNull())
return;

QFileInfo fi(fname);

if(fi.lastModified() == lmtime)
return;

lmtime == fi.lastModified();
basemenu->clear();

QFile istr(fname);
if(! istr.open(QIODevice::ReadOnly))
{
perror("cannot open menu file");
return;
}

recurse(basemenu, istr);
istr.close();
}

void menu::winkill(void)
{
QBitmap bmapc = QBitmap::fromData(QSize(kcursor_width, kcursor_height), kcursor_bits);
QBitmap bmapm = QBitmap::fromData(QSize(kcursor_width, kcursor_height), kcursor_mask);
grabMouse(QCursor(bmapc, bmapm));

killop = TRUE;
}

void menu::recurse(QMenu *cm, QFile &istr)
{
QString p1,p2,p3;

while(! istr.atEnd())
{
QTextStream til(istr.readLine(1024));

til >> p1; // command
if(p1.isEmpty() || p1 == "#")
continue;

if(p1 == "End")
return;

if(p1 == "Separator")
{
cm->addSeparator();
continue;
}

til >> p2; // menu label

if(p2.isEmpty())
continue;

p3 = til.readLine(); // command line

if(p2[0] == '"')
{
if(p2[p2.length()-1] != '"')
{
int i = p3.indexOf('"');
if(i == -1)
continue;

p2 += p3.left(i);
p2 = p2.mid(1, p2.length()-1);
p3 = p3.right(p3.length()-i-1);
}
else p2 = p2.mid(1, p2.length()-2);
}

if(p1 == "Menu")
{
QMenu *nm = new QMenu(p2);
Q_CHECK_PTR(nm);
cm->addMenu(nm);
recurse(nm, istr);
continue;
}

if(p1 == "Quit")
{
act_quit->setText(p2);
cm->addAction(act_quit);
continue;
}

if(p1 == "Kill")
{
act_kill->setText(p2);
cm->addAction(act_kill);
continue;
}

if(p1 == "Restart")
{
act_rest->setText(p2);
cm->addAction(act_rest);
continue;
}

if(p1 != "Entry")
continue;

p3 = p3.simplified();

if(p3.isEmpty())
continue;

QAction *act_run = new QAction(p2, cm);
act_run->setData(QVariant(p3));
cm->addAction(act_run);
}
}

void menu::run_cmd(QByteArray &cmd) // execute menu item
{
pid_t pid;

if((pid = fork()) == -1)
{
perror("fork()");
return;
}
if(pid)
return;

execl("/bin/sh", "sh", "-c", cmd.data(), NULL);
perror("cannot run /bin/sh");
exit(1);
}

void menu::run_menu(QAction *act)
{
QByteArray cmd = act->data().toByteArray();

if(cmd == "_Quit")
winkill_all();
else if(cmd == "_Kill")
winkill();
else if(cmd == "_Restart")
qapp::wm_restart();
else run_cmd(cmd);
}

void menu::start_popup(void)
{
Window rw,cw;
int rx,ry,wx,wy;
unsigned mr;

if(qapp::menu_open)
return;

xwindow *focusclient = qapp::focusclient;
qapp::menu_open = TRUE;

setDown(TRUE);

if(! defaults::show_menu || qapp::smode) // show at mouse position
{
XQueryPointer(QX11Info::display(), QX11Info::appRootWindow(), &rw, &cw, &rx, &ry, &wx, &wy, &mr);
basemenu->exec(QPoint(rx, ry));
}
else
{
if(! defaults::toolbar_top) // menu above button
{
QPoint p = mapToGlobal(QPoint(0, 0));
QSize s(basemenu->sizeHint());
p.setY(p.y()-s.height());
basemenu->exec(p);
}
else
basemenu->exec(mapToGlobal(QPoint(0, height())));
}
qapp::menu_open = FALSE;
setDown(FALSE);

XSetInputFocus(QX11Info::display(), QX11Info::appRootWindow(), RevertToPointerRoot, CurrentTime);
if(focusclient != NULL && clients.indexOf(focusclient) != -1)
focusclient->setchildfocus(CurrentTime);
}

void menu::mousePressEvent(QMouseEvent *event)
{
if(killop) // window kill operation
{
xwindow *client;

killop = FALSE;
releaseMouse();

if(event->button() != Qt::LeftButton)
return;

if((client = (xwindow *)QApplication::widgetAt(event->globalPos())) == NULL)
return;

XKillClient(QX11Info::display(), client->client_id());
XSync(QX11Info::display(), FALSE);

return;
}
start_popup();
}


void menu::winkill_all()
{
tb_pb->remove_all();
for(int i=0; i < clients.size(); i++)
clients.at(i)->wdestroy();

clients.clear();
XSync(QX11Info::display(), FALSE);
exit(0);
}

и menu.h
CODE
/* menu.h */

#ifndef MENU_H
#define MENU_H

class menu : public QPushButton
{
Q_OBJECT

QMenu *basemenu;
bool killop; // window kill operation active
QAction *act_quit;
QAction *act_kill;
QAction *act_rest;
void run_cmd(QByteArray &);
void winkill(void);
void winkill_all(void);
QDateTime lmtime; // last file modification time
static uchar kcursor_bits[]; // cursor bitmap
static uchar kcursor_mask[]; // cursor bitmap

void recurse(QMenu *, QFile &);

private slots:
void run_menu(QAction *);
private:
QMenu mainMenu;

protected:
virtual void mousePressEvent(QMouseEvent *);

public:
menu(QWidget *parent);
void start_popup(void);
void readmenu(void);
};
#endif
Причина редактирования: для длинных исходников применяйте тэг codbox
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 14.5.2008, 18:48
Сообщение #2


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

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

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




Репутация:   40  


Судя по тому коду, что ты привел, проблемная строка:
QMenu *mainMenu = menuBar()->addMenu(tr("Main"));
по ней выскакивает ошибка и предупреждение.
Предупреждение понятно почему, mainMenu и правда не используется, но вот menuBar() я например тоже не вижу. :)
Может там забыли просто подцепить какой *.cpp файл?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.5.2008, 19:55
Сообщение #3


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

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

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




Репутация:   94  


эту строку тупо скопировали из примера с главным окном, а внем есть такой метод. А у кнопки нет панели меню (menuBar) есть просто меню :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
neochapay
  опции профиля:
сообщение 15.5.2008, 19:33
Сообщение #4


Новичок


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

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




Репутация:   0  


Цитата(ViGOur @ 14.5.2008, 19:48) *
Судя по тому коду, что ты привел, проблемная строка:
QMenu *mainMenu = menuBar()->addMenu(tr("Main"));
по ней выскакивает ошибка и предупреждение.
Предупреждение понятно почему, mainMenu и правда не используется, но вот menuBar() я например тоже не вижу. :)
Может там забыли просто подцепить какой *.cpp файл?

ну про то что не используется то я понял - ибо проблема в реализации
Вопрос как это поправить ?
А его (menuBar) надо отдельно подцеплять ?

Цитата(Litkevich Yuriy @ 14.5.2008, 20:55) *
эту строку тупо скопировали из примера с главным окном, а внем есть такой метод. А у кнопки нет панели меню (menuBar) есть просто меню :)

И как решить проблему ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.5.2008, 20:08
Сообщение #5


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

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

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




Репутация:   94  


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

вообще я думаю тут какой-то идеологический касяк:
class menu : public QPushButton

Создается класс меню как наследник от кнопки и в этом классе активно юзается то что относится к QMainWindow :good:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 29.3.2024, 12:38