2

Qtの学習を始めたばかりで、このQUiLoaderを使用して簡単なウィジェットを作成しようとしています。しかし、次のエラーが発生します:「デザイナー:UIファイルの1行目0列目:ドキュメントの終わりが早すぎます。」の読み取り中にエラーが発生しました。

#include <QtGui/QApplication>
#include <QtUiTools/QUiLoader>
#include <QFile>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QUiLoader loader;
    QFile file(":/aks.ui");
    file.open(QFile::ReadOnly);

    QWidget *myWidget = loader.load(&file);
    if(myWidget){
        myWidget->show();
    }

    return a.exec();
}

QtCreator 2.4.1を使用してUIファイルを作成し、Qt4.7.4を使用しています。uiファイルもチェックしてください。

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>131</width>
    <height>129</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0">
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QCheckBox" name="checkBox">
       <property name="text">
        <string>A</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QCheckBox" name="checkBox_2">
       <property name="text">
        <string>B</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QCheckBox" name="checkBox_3">
       <property name="text">
        <string>C</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QCheckBox" name="checkBox_4">
       <property name="text">
        <string>D</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QCheckBox" name="checkBox_5">
       <property name="text">
        <string>E</string>
       </property>
      </widget>
     </item>
    </layout>
   </item>
   <item row="0" column="1">
    <widget class="QPushButton" name="pushButton">
     <property name="text">
      <string>PushButton</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

私のプロジェクトファイル:

#-------------------------------------------------
#
# Project created by QtCreator 2012-05-21T19:48:31
#
#-------------------------------------------------

QT       += core gui

TARGET = Example
TEMPLATE = app


SOURCES += main.cpp \
    sortdialog.cpp

HEADERS  += \
    sortdialog.h

FORMS    += \
    sortdialog.ui \
    aks.ui

CONFIG += uitools
4

1 に答える 1

4

プロジェクトのリソースに.uiファイルを追加する必要があります。リソースは、アプリの「内部でコンパイル」され、。で始まるファイルパスによってQtクラスで利用できるファイルです":/"

プロジェクトにリソースを追加するには、リソースとして登録するファイルをリストしたリソースファイルを作成する必要があります。このファイルは別のXMLファイルになり、QtCreatorで作成および編集できます。プロジェクトマネージャーで、別のファイルを追加し、ダイアログ内からタイプQt->Qtリソースファイルを選択します。

.proファイルに次のセクションが表示されます。

RESOURCES += \
    resources.qrc

リソースファイルにプレフィックスを追加する必要があります。名前を付けるだけです/(または空のままにします)。このプレフィックス内にファイルを追加して、aks.uiという名前を付けることができます:/aks.ui

このタイプのUIの作成は、実行時に行われることに注意してください。つまり、柔軟性は高くなりますが(uiファイルは実行時にのみ作成される可能性があります)、少し遅くなります(解析と実行時の処理がさらに行われるため)。


Qtを初めて使用する場合は、ビルドプロセスでQtにUIファイルのクラスファイルを作成させることもできることをおそらく知らないでしょう。これは、セクションのproファイルにuiファイルをリストするときにすでに実行されていますFORMS +=

自動的に構築されたクラスを使用するには、独自のコードを内部に配置する別のクラスであるデザイナーフォームクラスも作成する必要があります。このクラスは、UIをセットアップするために自動的に構築されたクラスをロードします。

したがって、2つのクラスがあります。*ビルドフォルダー内Ui::Aksのファイルにある、(名前空間Ui内の) UIファイル用に自動的に生成されたクラス。ui_aks.h*独自のラッパークラス。uiクラスを使用する実際のウィジェットクラス。

2番目のクラスを手動で作成する場合は、次のように記述できます(QtCreatorは、デザイナーフォームだけでなく、デザイナーフォームクラスを追加すると、実際にはこの手順を実行します)。

aks.h:

#ifndef AKS_H
#define AKS_H

#include <QWidget>

namespace Ui {
    class Aks; // <-- this is the automatically created ui class which we need
}

class aks : public QWidget // <-- your own widget class using the designer UI
{
    Q_OBJECT

public:
    explicit Aks(QWidget *parent = 0);
    ~Aks();

private:
    Ui::Aks *ui; // <-- instance of the automatically created ui class
};

#endif // AKS_H

aks.cpp:

#include "aks.h"
#include "ui_aks.h" // <-- include the automatically generated ui class

Aks::Aks(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Aks)
{
    ui->setupUi(this); // <-- here, the widgets from the ui file get created
}

Aks::~Aks()
{
    delete ui;
}
于 2012-05-22T13:52:53.043 に答える