qt - 关于 QtDesigner 中提升小部件的头文件的路径
问题描述
使用 Qt Designer,当我提升 Widget 时,我遇到了一些 ui_*.h 文件和提升类标头的包含问题。该问题出现在未找到提升类的标头的 Linux 下。在带有 MSVC 2017 的 Windows 下,没问题...
在windows下,我放了*.ui文件夹的相对路径。
在 Linux 下,似乎我必须将 *.pro 文件夹中的相对文件放在...
谁能解释一下?
谢谢 !
编辑 :
我在下面添加了示例代码。
你需要生成的 ui_ 文件吗?
您可以在最后一个文件中看到 mycombobox.h 的路径是相对于根文件夹而不是 *.ui 文件夹的路径。
这个配置似乎也可以在 Windows 下工作,但我想把 *.ui 文件的相对路径放在里面。
我的文件夹结构:
in the root :
main.cpp
mainWindows.h
mainwindows.cpp
/Folder1 :
MyComboBox.h
/Folder1/Folder2 :
Form.h
Form.cpp
main.cpp 文件:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
主windows.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QHBoxLayout>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
mainwindows.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "folder1/folder2/form.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
centralWidget()->setLayout(new QHBoxLayout);
centralWidget()->layout()->addWidget(new Form);
}
MainWindow::~MainWindow()
{
delete ui;
}
/folder1/MyComboBox.h
#ifndef MYCOMBOBOX_H
#define MYCOMBOBOX_H
#include <QComboBox>
class MyComboBox:public QComboBox
{
Q_OBJECT
public:
MyComboBox(QWidget* parent=nullptr):QComboBox(parent)
{
addItem("My ComboBox");
}
virtual ~MyComboBox() {}
};
/folder1/folder2/Form.h
#ifndef FORM_H
#define FORM_H
#include <QWidget>
namespace Ui {
class Form;
}
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = nullptr);
~Form();
private:
Ui::Form *ui;
};
/folder1/folder2/Form.cpp
#include "form.h"
#include "ui_form.h"
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
}
Form::~Form()
{
delete ui;
}
最后但同样重要的是,Form.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>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="MyComboBox" name="comboBox"/>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>MyComboBox</class>
<extends>QComboBox</extends>
<header>folder1/mycombobox.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
解决方案
一种可能的解决方案是使用 .pri 来放置处理表单的文件:
├── 52435692.pro
├── Folder1
│ ├── Folder2
│ │ ├── form.cpp
│ │ ├── form.h
│ │ ├── form.pri
│ │ └── form.ui
│ └── mycombobox.h
├── main.cpp
├── mainwindow.cpp
├── mainwindow.h
└── mainwindow.ui
表单.pri
INCLUDEPATH += $$PWD
SOURCES += $$PWD/form.cpp
HEADERS += $$PWD/form.h \
$$PWD/../mycombobox.h
FORMS += $$PWD/form.ui
*.pro
...
include(Folder1/Folder2/form.pri)
表单.ui
...
<customwidget>
<class>MyComboBox</class>
<extends>QComboBox</extends>
<header>../mycombobox.h
</header>
</customwidget>
...
此外,INCLUDEPATH += $$PWD
在 .pri 中使用时,导入表单时不再需要包含完整路径:
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QVBoxLayout>
#include "form.h" // <--- before "folder1/folder2/form.h"
...
完整的示例可以在以下链接中找到
推荐阅读
- java - 节点对象的通用数组的转换问题
- amazon-web-services - 一种更好的方法来计算 5 分钟内从 IP 地址到应用程序负载均衡器的请求数
- javascript - 如何在 vue 3 中制作全局状态?
- javascript - toString() 作为具有 NULL 原型的 Object 中的属性描述符
- python - 如何创建一个接受变量列表的 if 语句条件?
- c# - C# Blazor:倒数计时器
- excel - 运行 13 调试,应用程序
- python - 使用 custom_metrics 和自定义损失加载 keras 模型
- gatling - Gatling 脚本因错误“进程退出并出现错误:137”而中止
- three.js - 如何将“_BATCHID”添加到 glTF 文件中?