Qt menuBar() Ошибка

Я изучаю Qt4 и работаю с их учебными пособиями.

В этом уроке:

http://doc.trolltech.com/4.5/mainwindows-menus-mainwindow-cpp.html

у них есть следующий код:

fileMenu = menuBar()->addMenu(tr("&File"));

что заставляет компилятор выдавать эту ошибку

g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o main.o main.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o MainWindow.o MainWindow.cpp
MainWindow.cpp: In member function ‘void MainWindow::createMenus()’:
MainWindow.cpp:56: error: ‘((MainWindow*)this)->MainWindow::menuBar’ cannot be used as a function
MainWindow.cpp:61: error: ‘((MainWindow*)this)->MainWindow::menuBar’ cannot be used as a function
make: *** [MainWindow.o] Error 1

Кто-нибудь знает, как я могу это исправить?

[Изменить] Добавлено полное сообщение об ошибке с g++


person Scott    schedule 18.06.2009    source источник


Ответы (2)


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

mainwindow.cpp, mainwindow.h, main.cpp и menus.pro из примера без изменений должны работать нормально.

$ cd examples/mainwindows/menus/
$ ls
main.cpp  mainwindow.cpp  mainwindow.h  menus.pro
$ qmake
$ make
g++ -c -pipe -g -O2 -mtune=native -pipe -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o mainwindow.o mainwindow.cpp
g++ -c -pipe -g -O2 -mtune=native -pipe -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o main.o main.cpp
/usr/bin/moc -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. mainwindow.h -o moc_mainwindow.cpp
g++ -c -pipe -g -O2 -mtune=native -pipe -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o moc_mainwindow.o moc_mainwindow.cpp
g++ -Wl,--as-needed -Wl,--hash-style=both -o menus mainwindow.o main.o moc_mainwindow.o    -L/usr/lib64/qt4 -lQtGui -L/usr/lib64 -L/usr/lib64/qt4 -L/usr/X11R6/lib64 -pthread -lpng -lfreetype -lgobject-2.0 -lSM -lICE -pthread -pthread -lXrender -lXrandr -lXinerama -lfontconfig -lXext -lX11 -lQtCore -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread
$ ls -F
Makefile  main.o          mainwindow.h  menus*     moc_mainwindow.cpp
main.cpp  mainwindow.cpp  mainwindow.o  menus.pro  moc_mainwindow.o
person ephemient    schedule 18.06.2009
comment
У меня есть qmake для меня. qmake -project qmake menus.pro make g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -Я. -Я. -o MainWindow.o MainWindow.cpp MainWindow.cpp: В функции-члене 'void MainWindow::createMenus()': MainWindow.cpp:56: ошибка: '((MainWindow*)this)->MainWindow::menuBar' не может быть используется как функция .. [повторяется для каждой строки]... make: *** [MainWindow.o] Error 1 - person Scott; 19.06.2009
comment
Я думаю, что ephemient прав, Скотт. Это сообщение об ошибке означает, что компилятор считает, что «menuBar» не является функцией, что почти наверняка означает, что у вас есть переменная, член или локальная переменная, которая также называется «menuBar» и блокирует (затеняет) функцию с тем же именем. - person quark; 19.06.2009

По какой-то причине QMainWindow неправильно настраивался. Это было исправлено путем вызова конструктора базового класса.

person Scott    schedule 19.06.2009
comment
Что значит не правильно настроить? Конструкторы базовых классов всегда вызываются перед конструкторами производного класса. Похоже, вы неправильно объявляли наследование и теперь исправили его. - person ephemient; 19.06.2009