【问题标题】:Qt forbid declaration of QListView with no typeQt 禁止声明没有类型的 QListView
【发布时间】:2011-09-18 21:13:43
【问题描述】:

我的 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: error: no 'QListWidgetItem QListWidget::itemAt(int, int) const' 类 'QListWidget' 中声明的成员函数*p>

等等

提前致谢。

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'

【问题讨论】:

  • 您能否显示完整的编译输出(或至少显示这些错误之前的行)?

标签: qt qlistview qlistwidget


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,当我刚刚添加“#include ”时尝试并出现了同样的问题。这是否意味着我在 Qt 标头中有问题?还是Qt本身有问题?如何解决这个问题?
  • 首先确保在编译之前在您的简单目录中除了源文件之外没有其他文件 - 有时我观察到一些奇怪的,无法解释的交互 - 如果它没有帮助,那么显然您的构建系统不知何故损坏(Qt 或编译器本身) - 如果这对你来说不是一个大问题,我会建议首先卸载 Qt 和编译器(在 Windows 上应该没什么工作)并再次安装它 - 或者至少尝试在另一个中进行独立安装目录并使用它。
  • 谢谢@j_kubik,完成后会通知。
  • 因为我的评论,我选择了这个作为最好的。
【解决方案2】:

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

您得到的错误看起来就像您只是在头文件中缺少 #include &lt;QListWidget&gt; 行。

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

#ifndef MYCLASS
#define MYCLASS

class MyClass { ... };

#endif

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

【讨论】:

  • 不应该#include 照顾吗?
  • 不。事实上,我不确定 QtGui 到底能给你带来什么。作为一般规则,Qt 中的每个小部件都需要单独#included。
  • #include 导致 QtGui 模块中的所有标头都被包含在内 - 无论如何错误消息直接表明在编译期间包含 qlistwidget.h。
  • 我在头文件中添加了缺少#include 保护的可能性。
猜你喜欢
  • 1970-01-01
  • 2011-08-21
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2020-12-28
  • 1970-01-01
相关资源
最近更新 更多