【问题标题】:about the path to the header file for promote widget in QtDesigner关于 QtDesigner 中用于提升小部件的头文件的路径
【发布时间】:2018-11-26 10:54:56
【问题描述】:

使用 Qt Designer,当我提升 Widget 时,我遇到了 ui_*.h 文件和提升类的头文件包含问题。该问题出现在未找到提升类的标头的 Linux 下。 Windows下有MSVC 2017,没问题...

在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();
}

mainwindows.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>

【问题讨论】:

  • 如果您需要帮助,请提供minimal reproducible example
  • 什么问题?,我在Linux中测试过你的代码,我没有遇到问题
  • 该代码在 Linux 下工作,因为对 mycombobox.h Form.ui 的传递是项目根路径的相对传递。在 Windows 下,pass 必须来自 *.ui 文件路径,这样比较好。
  • 路径,不是pass,对不起

标签: qt qt5 qt-designer


【解决方案1】:

一种可能的解决方案是使用 .pri 来放置处理表单的文件:

├── 52435692.pro
├── Folder1
│   ├── Folder2
│   │   ├── form.cpp
│   │   ├── form.h
│   │   ├── form.pri
│   │   └── form.ui
│   └── mycombobox.h
├── main.cpp
├── mainwindow.cpp
├── mainwindow.h
└── mainwindow.ui

form.pri

INCLUDEPATH += $$PWD
SOURCES += $$PWD/form.cpp
HEADERS += $$PWD/form.h \
         $$PWD/../mycombobox.h
FORMS += $$PWD/form.ui

*.pro

...
include(Folder1/Folder2/form.pri)

form.ui

...
  <customwidget>
   <class>MyComboBox</class>
   <extends>QComboBox</extends>
   <header>../mycombobox.h
</header>
  </customwidget>
...

此外,当在 .pri 中使用 INCLUDEPATH += $$PWD 时,导入表单时不再需要包含完整路径:

ma​​inwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QVBoxLayout>
#include "form.h" // <--- before "folder1/folder2/form.h"
...

完整的例子可以在下面的link找到

【讨论】:

  • @vcloarec 如果我的回答对你有帮助,别忘了标记为正确,如果你不知道怎么做,请查看tour,这是最好的感谢方式。 :-)
  • 我现在可以查看您的解决方案(孩子们在床上!)。告诉我如果我错了,用你的方法,在新项目中,我必须把 *.pri 文件放在新项目的 pro 中,只有这个文件。这很聪明!
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2019-10-25
  • 2012-08-28
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多