如何将Qt Designer 产生的*.UI文件转换成QT可以使用的*.H和*.CPP

把UIC.exe和你要转换的xxx.ui文件拷贝到同一目录。

开始菜单,运行CMD

进入uic.exe和xxx.ui的目录,运行以下命令:

uic xxx.ui -o xxx.h  生成.h文件

uic xxx.ui -i xxx.h -o xxx.cpp  生成.cpp文件

生成头文件没问题,但在生成cpp文件时,给了这么个提示(如图),并且没有生成.cpp文件!


我是在qt designer中设计的ui,项目是在vs2010里创建的..

ui 文件是不会生成.cpp文件的.ui文件就会生成一个ui_***.h文件.
有了这个ui_***.h文件就足够了.里面已经包含了所有的布局信息.

详细说明了在应用程序中使用UI文件的方法。

一、直接的方法(The Direct Approach

即把filename.ui经过uic转换后的C++代码文件ui_filename.h直接包含,使用其里面Ui命名空间下的类(名称和主窗体的objectname相同,这里假设为GoToCellDialog)。

 #include "ui_gotocelldialog.h"    // uic工具将gotocelldialog.ui生成的C++代码

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

     QDialog *dialog= new QDialog;  // 用于显示界面的父窗体QDialog(QWidget的子类) 
      Ui::GotoCellDialog ui;  // 界面类,必须显示在一个QWidget(或其子类)上
      ui.setupUi(dialog); // 将QDialog设置为 GotoCellDialog 的父窗体,这样GotoCellDialog 里面定义的控件就会显示在QDialog窗体内

      dialog->show();
     return app.exec();
 }

二、单继承方式(The Single Inheritance Approach)

       单继承方式是相对于后面要讲的多继承方式,单继承方式也称组合(即委托或代理)方式。单继承方式简单来说就是在代码中首先要自定义一个子类(例如下文中的GoToCellDialog类),该类要从form对应的窗体类(或其兼容的子类)派生;并用ui生成的类定义一个类里的成员变量,该成员变量可以是值也可以是指针,根据使用成员变量的形式不同,又分为成员变量和指针成员变量两种形式。这样在GoToCellDialog的构造函数中可以直接调用ui和ui中的变量和函数,使用起来很方便。

1、使用成员变量

      即将 Ui::GotoCellDialog ui; 作为类GotoCellDialog(只继承自QDialog,单一继承)的成员变量。这里有一点值得注意的地方,就是ui文件提供的类被包含在了名为Ui的name space里,这样做的目的是将ui文件的命名空间与用户的代码分离,避免两者出现命名冲突的情况。

头文件: gotocelldialog.h

#include <QDialog>
#include "ui_gotocelldialog.h" // 因为是成员变量形式,必须包含相应的头文件
 
class GoToCellDialog: public QDialog
 {
     Q_OBJECT

 public:
    explicit GoToCellDialog(QDialog *parent = 0);

 private slots:
     void on_lineEdit_textChanged();

 private:
     Ui::GoToCellDialog ui;
 };

实现文件: gotocelldialog.cpp

#include "gotocelldialog.h"

#include <QtGui>

GoToCellDialog::GoToCellDialog(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);  

    QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
    lineEdit->setValidator(new QRegExpValidator(regExp, this));

    connect(okButton, SIGNAL(clicked()), SLOT(accept()));
    connect(cancelButton, SIGNAL(clicked()), SLOT(reject()));
}

void GoToCellDialog::on_lineEdit_textChanged()
{
    // bool	hasAcceptableInput () const
    // This property holds whether the input satisfies the inputMask and the validator.
    // By default, this property is true.
    okButton->setEnabled(lineEdit->hasAcceptableInput());
}


2、使用指针成员变量
       与成员变量形式相似,唯一不同的是,将Ui::GoToCellDialog声明为指针成员,即 Ui::GoToCellDialog *ui;

因此,相应的头文件中只要前置声明即可:

namespace Ui 

    class GoToCellDialog; 
} // 前置声明即可,只在实现文件中包含相应的头文件 


class GoToCellDialog: public QDialog

      // 同上 
 private: 
       Ui::GoToCellDialog *ui; 
};


实现文件:

#include "ui_gotocelldialog.h"


 GoToCellDialog::GoToCellDialog(QDialog *parent) :
     QDialog(parent), ui(new Ui::GoToCellDialog)
 {
     ui->setupUi(this);
 }


 CalculatorForm::~CalculatorForm()
 {
     delete ui; // 切记删除,释放资源
 }



三、多继承方式(The Multiple Inheritance Approach)
        多继承方式就是自定义的类从窗体类和Ui类多重派生。看代码就清楚了:

头文件:

#ifndef GOTOCELLDIALOG_H
#define GOTOCELLDIALOG_H

#include <QDialog>
#include "ui_gotocelldialog.h"

class GoToCellDialog :  public QDialog, public Ui::GoToCellDialog
{
    Q_OBJECT

public:
    explicit GoToCellDialog(QWidget *parent = 0);

private slots:
    void on_lineEdit_textChanged();
};

#endif // GOTOCELLDIALOG_H
实现文件:

#include "gotocelldialog.h"

#include <QtGui>

GoToCellDialog::GoToCellDialog(QWidget *parent)
    : QDialog(parent)
{
    this->setupUi(this); //第1个this指Ui::GoToCellDialog,第2个this指(QDialog) 即 Ui::GoToCellDialog->setupUi(QDialog)

    QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
    lineEdit->setValidator(new QRegExpValidator(regExp, this));

    connect(okButton, SIGNAL(clicked()), SLOT(accept()));
    connect(cancelButton, SIGNAL(clicked()), SLOT(reject()));
}

void GoToCellDialog::on_lineEdit_textChanged()
{
    // bool	hasAcceptableInput () const
    // This property holds whether the input satisfies the inputMask and the validator.
    // By default, this property is true.
    okButton->setEnabled(lineEdit->hasAcceptableInput());
} 




<think>我们正在处理一个关于在VisualStudio中使用CMake配置Qt项目的问题。用户希望了解如何添加包含qt.h、qt.cppqt.ui文件的项目,并使用CMake进行编译。根据引用内容,我们可以总结出以下步骤:1.**项目结构组织**:通常,Qt项目的文件组织包括头文件目录(include)、源文件目录(source)、UI文件目录(form)资源文件目录(resource)。例如:```Root│cmake.sh│CMakeLists.txt│README.md├─bin├─form│mainwindow.ui├─include│mainwindow.h├─resource│resource.qrc└─sourcemain.cppmainwindow.cpp```2.**CMakeLists.txt配置**:在根目录的CMakeLists.txt中,我们需要设置CMake的版本,启用Qt的自动处理功能(如moc、uic、rcc),设置Qt的安装路径,查找Qt库,并将源文件、头文件、UI文件等添加到可执行目标。参考引用[3]中的CMake配置示例:```cmakecmake_minimum_required(VERSION3.10)project(CmakeQt)#启用自动处理(moc,uic,rcc)set(CMAKE_AUTOMOCON)set(CMAKE_AUTORCCON)set(CMAKE_AUTOUICON)#添加可执行文件,指定源文件add_executable(${CMAKE_PROJECT_NAME}main.cpp)#设置Qt安装路径(可选,如果Qt不在系统路径中)set(CMAKE_PREFIX_PATH"D:/Qt/Qt5.14.2/5.14.2/msvc2017_64")#查找Qt库,这里需要Core、Widgets等组件find_package(Qt5COMPONENTSCoreWidgetsREQUIRED)#链接Qt库target_link_libraries(${CMAKE_PROJECT_NAME}Qt5::CoreQt5::Widgets)```但是,上述示例只添加了main.cpp,我们需要添加更多的源文件头文件,以及UI文件。3.**添加头文件源文件**:在`add_executable`命令中,我们需要包含所有的源文件(.cpp头文件(.h)。实际上,CMake中头文件不需要在`add_executable`中列出,因为它们会被自动处理(通过moc),但为了清晰,我们可以将头文件包含在`target_sources`中。不过,通常的做法是在`add_executable`中列出所有源文件,头文件所在的目录通过`target_include_directories`指定。另外,UI文件(.ui资源文件(.qrc)需要被添加到可执行目标中。由于我们设置了`CMAKE_AUTOUICON``CMAKE_AUTORCCON`,CMake会自动处理.ui.qrc文件。因此,我们需要在`add_executable`中包含所有.cpp文件.qrc文件(如果有的话),而.ui文件不需要直接包含,因为uic工具会将其转换为对应的头文件(如ui_mainwindow.h),然后在源文件中包含该头文件。但是,为了确保CMake知道这些UI文件,我们可以将它们添加到`target_sources`中,或者通过`file(GLOB...)`命令收集这些文件并添加到可执行目标中。示例:```cmake#收集源文件file(GLOBSOURCES"source/*.cpp")#收集UI文件file(GLOBFORMS"form/*.ui")#收集资源文件file(GLOBRESOURCES"resource/*.qrc")add_executable(${CMAKE_PROJECT_NAME}${SOURCES}${FORMS}${RESOURCES})```注意:使用`file(GLOB)`不是官方推荐的做法,因为如果添加新文件,CMake不会自动重新运行。但在开发中,为了简便,我们可以这样使用。另一种方法是手动列出所有文件。4.**包含头文件目录**:为了让编译器找到头文件,我们需要使用`target_include_directories`命令:```cmaketarget_include_directories(${CMAKE_PROJECT_NAME}PRIVATEinclude)```5.**在VisualStudio中生项目**:-打开VisualStudio,选择“打开本地文件夹”,指向项目的根目录(包含CMakeLists.txt的目录)。-VisualStudio会自动检测CMake项目并开始配置。-如果配置过程中出现错误(如找不到Qt),请检查`CMAKE_PREFIX_PATH`是否正确设置(指向Qt安装目录下的对应编译器版本目录,例如`D:/Qt/Qt5.14.2/5.14.2/msvc2017_64`)。6.**处理UI文件**:在代码中,我们需要在相应的头文件或源文件中包含由uic生UI头文件。例如,如果有一个`mainwindow.ui`,那么会生`ui_mainwindow.h`。在`mainwindow.h`或`mainwindow.cpp`中,我们可以这样包含:```cpp#include"ui_mainwindow.h"```注意:生的头文件通常放在构建目录中(如`build`目录),因此我们需要在`target_include_directories`中添加构建目录,或者使用相对路径。由于CMake自动处理,生ui头文件会被放在构建目录的`uic`子目录下(如引用[4]中提到在`x64\Debug\uic`下),但CMake的自动处理会确保包含路径正确。7.**示例代码结构**:-`mainwindow.h`:```cpp#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>//包含由uic生UI头文件#include"ui_mainwindow.h"classMainWindow:publicQMainWindow{Q_OBJECTpublic:MainWindow(QWidget*parent=nullptr);private:Ui::MainWindowui;//或者使用指针};#endif```-`mainwindow.cpp`:```cpp#include"mainwindow.h"MainWindow::MainWindow(QWidget*parent):QMainWindow(parent){ui.setupUi(this);//设置UI}```-`main.cpp`(如引用[2]):```cpp#include<QApplication>#include"mainwindow.h"intmain(intargc,char*argv[]){QApplicationapp(argc,argv);MainWindowmainWindow;mainWindow.show();returnapp.exec();}```8.**资源文件(.qrc)**:如果项目中有资源文件(如图片、图标等),我们可以通过.qrc文件管理。在CMake中,由于设置了`CMAKE_AUTORCCON`,资源文件会被自动处理,生对应的cpp文件并编译进可执行文件。9.**构建运行**:在VisualStudio中,选择目标(如x64-Debug),然后生运行即可。**注意**:在配置过程中,如果出现找不到Qt的错误,请确保`CMAKE_PREFIX_PATH`正确设置。也可以考虑使用环境变量`Qt5_DIR`,或者通过CMakeGUI工具设置。下面是一个更完整的CMakeLists.txt示例:```cmakecmake_minimum_required(VERSION3.10)project(MyQtProject)#设置C++标准set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_STANDARD_REQUIREDON)#启用自动处理set(CMAKE_AUTOMOCON)set(CMAKE_AUTORCCON)set(CMAKE_AUTOUICON)#设置Qt安装路径(如果系统环境变量中没有设置)#set(CMAKE_PREFIX_PATH"D:/Qt/Qt5.14.2/5.14.2/msvc2017_64")#查找Qt库,需要Widgets模块(因为使用了QMainWindow)find_package(Qt5COMPONENTSCoreWidgetsREQUIRED)#收集源文件file(GLOB_RECURSESOURCES"source/*.cpp")#收集UI文件file(GLOBFORMS"form/*.ui")#收集资源文件file(GLOBRESOURCES"resource/*.qrc")#添加可执行文件add_executable(${PROJECT_NAME}${SOURCES}${FORMS}${RESOURCES})#包含头文件目录target_include_directories(${PROJECT_NAME}PRIVATE"include")#链接Qt库target_link_libraries(${PROJECT_NAME}Qt5::CoreQt5::Widgets)```**总结步骤**:1.创建项目目录结构(如include、source、form、resource等)。2.编写CMakeLists.txt文件,配置项目、启用自动处理、添加文件、链接库。3.在VisualStudio中打开项目文件夹(作为CMake项目)。4.编写代码,确保正确包含生UI头文件。5.构建并运行项目。如果配置过程中遇到问题,可以检查CMake的输出信息,确保Qt被正确找到,并且所有文件都被正确包含。相关问题:1.如何在CMake中设置Qt的路径?2.如何处理Qt项目中的资源文件(.qrc)?3.如何解决VisualStudio中CMake项目配置Qt时出现的错误?</think>### 在 Visual Studio 中使用 CMake 配置 Qt 项目的完整指南 #### 一、项目结构组织 首先创建标准的 Qt 项目目录结构(参考引用[1][5]): ``` 项目根目录/ ├─ CMakeLists.txt # 主配置文件 ├─ include/ # 头文件目录 │ └─ mainwindow.h # Qt 头文件 ├─ source/ # 源文件目录 │ ├─ main.cpp # 主程序 │ └─ mainwindow.cpp # Qt 实现文件 ├─ form/ # UI 文件目录 │ └─ mainwindow.ui # Qt Designer 文件 └─ resource/ # 资源文件(可选) └─ resource.qrc ``` #### 二、配置 CMakeLists.txt 创建核心配置文件(参考引用[3][5]): ```cmake cmake_minimum_required(VERSION 3.10) project(YourProjectName) # 启用 Qt 自动处理功能(关键) set(CMAKE_AUTOMOC ON) # 自动处理元对象编译器(moc) set(CMAKE_AUTORCC ON) # 自动处理资源文件(rcc) set(CMAKE_AUTOUIC ON) # 自动处理UI文件(uic) # 设置Qt安装路径(替换为您的实际路径) set(CMAKE_PREFIX_PATH "D:/Qt/Qt6.4.0/6.4.0/msvc2019_64") # 查找Qt库(根据需求添加组件) find_package(Qt6 COMPONENTS Core Widgets REQUIRED) # 添加可执行文件(包含所有源文件) add_executable(${PROJECT_NAME} include/mainwindow.h # .h 文件 source/main.cpp # .cpp 文件 source/mainwindow.cpp form/mainwindow.ui # .ui 文件 resource/resource.qrc # 资源文件(可选) ) # 包含头文件目录 target_include_directories(${PROJECT_NAME} PRIVATE include) # 链接Qt库 target_link_libraries(${PROJECT_NAME} Qt6::Core Qt6::Widgets) ``` #### 三、在 Visual Studio 中的操作步骤 1. **打开项目**: - 启动 VS → 选择 "打开本地文件夹" → 指向项目根目录 - VS 会自动检测 CMakeLists.txt 2. **配置生**(参考引用[5]): - 在 CMake 菜单中选择配置类型(如 x64-Debug) - 首次配置需指定生器:"Visual Studio 17 2022"(根据VS版本选择) - 检查 CMake 输出面板,确保无红色错误 3. **处理 UI 文件**(参考引用[4]): - 右键点击 .ui 文件 → 选择 "编译" - 生的 `ui_*.h` 文件会自动出现在 `out/build/<配置>/uic/` 目录 - 在代码中包含生的头文件: ```cpp // mainwindow.h #include "ui_mainwindow.h" // 自动生的头文件 ``` 4. **代码集示例**(参考引用[2]): ```cpp // main.cpp #include <QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } ``` ```cpp // mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" // 自动生UI头文件 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化UI } ``` #### 四、常见问题解决 1. **Qt 路径错误**: - 确认 `CMAKE_PREFIX_PATH` 指向正确的 Qt 版本目录 - 路径格式:`Qt安装根目录/版本号/编译器目录`(如 `D:/Qt/6.4.0/msvc2019_64`) 2. **UI 文件未编译**: - 确保已安装 `qtbase` `qttools` 组件 - 检查 CMake 输出面板的 uic 处理日志 3. **链接错误**: - 确认 `find_package` 包含所有必要的 Qt 组件 - 检查 `target_link_libraries` 是否链接对应模块 4. **配置后出现红色错误**(参考引用[5]): - 多次点击 "配置" 按钮(CMake 可能需要多次传递) - 清理 CMake 缓存:项目根目录 → 删除 `out/` `CMakeSettings.json` #### 五、最佳实践建议 1. **组件选择**: ```cmake # 典型桌面应用需添加的组件 find_package(Qt6 COMPONENTS Core Gui Widgets Network Sql REQUIRED) ``` 2. **跨平台配置**: ```cmake # 自动检测操作系统 if(WIN32) set(CMAKE_PREFIX_PATH "C:/Qt/6.4.0/msvc2019_64") elseif(APPLE) set(CMAKE_PREFIX_PATH "/Users/name/Qt/6.4.0/macos") endif() ``` 3. **调试支持**: - 在 VS 中安装 "Qt Visual Studio Tools" 扩展 - 使用 Qt 的 `qDebug() << "调试信息";` 输出到 VS 调试控制台 > **提示**:完整示例可参考开源项目 [qt-cmake-cmake](https://github.com/jasonccox/qt-cmake-example),该项目展示了现代 CMake 与 Qt6 的集方式[^3][^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值