0

我的 Qt 项目中有一个非常奇怪的错误。这是代码,main_window.h:

#include <QtGui>
#include <QtSql>

class main_window : public QTabWidget
{
    Q_OBJECT

    /// @name List Widgets
private:
    QListWidget*    m_documents_list;
....

这是main_window.cpp:

...
void main_window::create_documents_widget()
{
    m_documents = new QWidget(this);
    m_documents_list = new QListWidget(m_documents);
}
...

我无法理解的问题在 QListView 中,我没有在我的项目中使用它。只有 QListWidget,但是当我尝试构建项目时,会出现以下错误:

qlistview.h:194:错误:ISO C++ 禁止声明没有类型的“QListView”

qlistview.h:194: 错误:在 '&' 标记之前需要 ',' 或 '...'

还有以下奇怪的错误:

qlistwidget.h:308:错误:没有在类“QListWidget”中声明的“void QListWidget::removeItemWidget(QListWidgetItem)”成员函数*

qlistwidget.h:311:错误:没有在类“QListWidget”中声明的“void QListWidget::addItem(QListWidgetItem)”成员函数*

qlistwidget.h:314:错误:没有在类“QListWidget”中声明的“QListWidgetItem QListWidget::itemAt(int, int) const”成员函数*

等等

提前致谢。

UPD:我在 Windows 7 上使用 QtCreator 2.2.1。

UPD2:Qt 版本是 4.7.1。

UPD3:完整的输出

In file included from c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/QtGui:68,
                 from ..\my_project\/main_window.h:4,
                 from ..\my_project\main.cpp:2:
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistview.h:194: error: ISO C++ forbids declaration of 'QListView' with no type
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistview.h:194: error: expected ',' or '...' before '&' token
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistview.h:194: error: ISO C++ forbids declaration of 'QListView' with no type
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistview.h:194: error: ISO C++ forbids declaration of 'QListView' with no type
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistview.h:194: error: expected ';' before '&' token
In file included from c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/QtGui:69,
                 from ..\my_project\/main_window.h:4,
                 from ..\my_project\main.cpp:2:
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h:202: error: redefinition of 'class QListWidget'
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistview.h:58: error: previous definition of 'class QListWidget'
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h:308: error: no 'void QListWidget::removeItemWidget(QListWidgetItem*)' member function declared in class 'QListWidget'
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h:311: error: no 'void QListWidget::addItem(QListWidgetItem*)' member function declared in class 'QListWidget'
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h:314: error: no 'QListWidgetItem* QListWidget::itemAt(int, int) const' member function declared in class 'QListWidget'
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h: In member function 'void QListWidgetItem::setSelected(bool)':
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h:318: error: 'class QListWidget' has no member named 'setItemSelected'
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h: In member function 'bool QListWidgetItem::isSelected() const':
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h:321: error: 'class QListWidget' has no member named 'isItemSelected'
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h: In member function 'void QListWidgetItem::setHidden(bool)':
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h:324: error: 'class QListWidget' has no member named 'setItemHidden'
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h: In member function 'bool QListWidgetItem::isHidden() const':
c:\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtGui/qlistwidget.h:327: error: 'class QListWidget' has no member named 'isItemHidden'
4

2 回答 2

2

需要注意的是,QListWidget 继承自 QListView,所以你是在间接使用它。

您得到的错误看起来就像您只是#include <QListWidget>在头文件中丢失了一行。

此外,可能是您的头文件中缺少#include 保护

#ifndef MYCLASS
#define MYCLASS

class MyClass { ... };

#endif

如果您的头文件被多个项目#included,那么这将解释您看到的错误。

于 2011-09-18T22:00:01.680 回答
2

首先 - 您还应该提到 qt 版本,因为在这种情况下这是最重要的。

这似乎是编译器或 qt 的一些奇怪的怪癖——我的建议是首先创建出现问题的最简单的程序。如果它也在程序中显示

#include <QtGui/QListWidget>
int main(int argc, char* argv[]){
    QListWidget* w = 0;
}

那么编译器的 qt 标头存在一些问题 - 然后无法从提供的数据中提供答案。如果它有效,然后尝试慢慢地将代码的其他元素添加到这个简单的文件中——很可能在某些时候你会再次遇到同样的错误——然后你就会知道最后添加的代码是有罪的。可能需要一些额外的思考来弄清楚一旦发现问题如何消除。

于 2011-09-19T00:26:06.710 回答