C++ 使用不同的源文件操作QT Ui
我搜索了几个小时,但找不到解决办法 我的设置如下:C++ 使用不同的源文件操作QT Ui,c++,qt4,qt-creator,qlistwidget,C++,Qt4,Qt Creator,Qlistwidget,我搜索了几个小时,但找不到解决办法 我的设置如下: Widget.h Widget.cpp Widget.ui Function.h Function.cpp 我在function.cpp中编写了一个函数,它将一些条目添加到Widget.ui中的QListWidget中。这只是一个反复试验的项目: 我已经包含了widget.h和ui_widget.h,所以我可以访问这些类 小部件是可以使用QtDesigner创建的QWidget模板 其中有一个QListWidget和一个QButton 如
Widget.h
Widget.cpp
Widget.ui
Function.h
Function.cpp
我在function.cpp中编写了一个函数,它将一些条目添加到Widget.ui中的QListWidget中。这只是一个反复试验的项目:
- 我已经包含了widget.h和ui_widget.h,所以我可以访问这些类
- 小部件是可以使用QtDesigner创建的QWidget模板
- 其中有一个QListWidget和一个QButton
编辑: 根据要求,这是代码 myWidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
namespace Ui {
class myWidget;
}
class myWidget : public QWidget
{
Q_OBJECT
public:
explicit myWidget(QWidget *parent = 0);
~myWidget();
private slots:
void on_pushButton_clicked();
private:
Ui::myWidget *ui;
};
#endif // MYWIDGET_H
myWidget.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>myWidget</class>
<widget class="QWidget" name="myWidget">
<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>
<widget class="QListWidget" name="listWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>256</width>
<height>192</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>110</x>
<y>240</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>add</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
和函数
#include "functions.h"
#include "myWidget.h" //there seems no effect between ui_mywidget.h and this one ...
Functions::Functions()
{
}
我试图补充
Ui::myWidget *ModUi = new myWidget;
ModUi->ui->listWidget->addItem("SomeItem");
我在Functions类中尝试了使用Q_对象和不使用Q_对象的不同变体。我在这件事上很有创意^^
我希望这有助于理解?您可能需要在functions.cpp文件中同时包含“myWidget.h”和“ui\u myWidget.h”。您首先需要知道myWidget是什么,以便访问它的ui成员变量。您需要第二个来了解ui变量包含的内容 尽管可能不像您预期的那样,但这些方法应该可以奏效:
#include "functions.h"
#include "myWidget.h"
#include "ui_mywidget.h"
Functions::Functions()
{
// The following line creates a new widget, and does not use any existing
// widgets (like you probably expect it to).
myWidget *ModUi = new myWidget;
ModUi->ui->listWidget->addItem("SomeItem");
}
试试这个:
class Functions; // Forward declaration
class myWidget : public QWidget
{
Q_OBJECT
public:
explicit myWidget(QWidget *parent = 0);
~myWidget();
private slots:
void on_pushButton_clicked();
private:
Ui::myWidget *ui;
Functions*fun; // member ptr
friend class Functions; // allow access to private members
};
和执行:
[...]
#include "Functions.h"
myWidget::myWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::myWidget),
fun(new Functions(this)) // initializer list
{
ui->setupUi(this);
}
myWidget::~myWidget()
{
delete ui;
delete fun; // we new'ed it so we have to delete it!
}
void myWidget::on_pushButton_clicked()
{
fun->doIt(); // call to the function
}
函数
[...]
class myWidget; // Forward declaration
class Functions
{
public:
Functions(myWidget *wid);
void doIt();
private:
myWidget *widget; // Member pointer to the main widget
};
以及Function.cpp
[...]
#include "ui_mywidget.h"
#include "myWidget.h"
Functions::Functions(myWidget *wid):widget(wid) // init the ptr
{
}
void Function::doIt()
{
widget->ui->listWidget->addItem("SomeItem"); // add the items
}
你试过你写的东西吗?有什么不起作用吗?请提供一些示例代码和/或告诉我们哪里出了问题。添加自定义插槽是在qt中执行操作的标准方式。我仍然不清楚什么不起作用。问题是,我无法从不是ui文件一部分的函数中操作ui元素。因此,任何不在myWidget.ui、myWidget.cpp或myWidget.h中的函数/slot/etc都无法从myWidget.ui操作ui元素。我可以将QButton连接到functions.cpp中的函数/插槽,但这些函数/插槽无法将项目添加到myWidget.ui中的QWidgetList。。。我希望它现在更清晰。它毫无怨言地构建,但在我尝试启动时崩溃。)=你的意思是,我必须在Functions.cpp中完整地添加“creating myWidgets Ui stuff”吗?不,小部件的创建应该是很好的。函数类是否在主应用程序线程中创建?当系统崩溃时,它会说什么?调试器向您展示了什么?很抱歉,我记不清所有细节。但舒尔表示,该应用程序根本无法启动。它立即崩溃了。至少它显示了自动完成列表中的ui元素。但它没有编译:functions.cpp:在成员函数“int functions::doIt()”中:functions.cpp:11:14:错误:不完整类型“struct Ui::myWidget”myWidget的使用无效。h:7:7:错误:“struct Ui::myWidget”函数的正向声明。cpp:12:1:警告:函数中没有返回非void[-Wreturn type]make:**错误1。有什么想法吗?是的,现在它工作了。非常感谢。我希望他们改进QT创作者使这些事情更容易。这是基本的C++理解。我想没有办法让它更容易。我从C++开始上周,所以SRY为我的经验不足。
[...]
class myWidget; // Forward declaration
class Functions
{
public:
Functions(myWidget *wid);
void doIt();
private:
myWidget *widget; // Member pointer to the main widget
};
[...]
#include "ui_mywidget.h"
#include "myWidget.h"
Functions::Functions(myWidget *wid):widget(wid) // init the ptr
{
}
void Function::doIt()
{
widget->ui->listWidget->addItem("SomeItem"); // add the items
}