将Qt GUI与应用程序外部的对象一起使用

时间:2012-11-23 23:51:34

标签: qt user-interface

我正在创建一个Qt GUI,它将为用户生成一些表单,让它们填充它们,然后将表单保存在二进制搜索树中,然后将其序列化。这是使用Qt(显然),c ++和boost完成的。此时GUI是应用程序的唯一接口。我想在GUI之外实例化我的二叉搜索树对象,因为在主GUI类中创建它似乎是一个糟糕的设计模式。这个想法是否正确?

现在是我的main()

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
    ChocAnGui *gui = new ChocAnGui;
    gui->show();

    return app.exec();
}

有没有办法创建ChocAnGui类可以使用的BST对象,但是它存在于实际的GUI之外?我想做点什么:

int main (int argc, char *argv[])
{
    MyBST bst = new MyBST;
    MyRecord record = new MyRecord;

    QApplication app(argc, argv);
    ChocAnGui *gui = new ChocAnGui;
    gui->show();

    return app.exec();
}

然后我希望GUI能够从内部调用MyBSTMyRecord类的方法。因为在应用程序的开始和结束时,我正在对数据进行序列化和反序列化,这似乎是最抽象的方法(与GUI代码本身内的序列化和反序列化相比)。我希望这个问题很明确......我正在学习所有这些东西。有没有办法通过QApplication(argc, argv)传递这些变量?最终,记录和BST类将构建到数据库中,再次,在GUI之外创建实例似乎最直接。感谢您提供的任何输入。

2 个答案:

答案 0 :(得分:1)

我认为只有当二进制搜索花费很长时间并且可以阻止GUI的线程时,才有必要将二进制搜索树放在GUI线程之外。 如果是这种情况,你想要做的是将MyBST对象放在另一个线程

在主应用程序中,创建一个新线程来处理所有BST操作:

QThread * BSTThread = new QThread();
BSTThread->start();

BSTThread是一个具有自己的事件队列的新线程。 然后你创建MyBST对象,确保MyBST继承QObject,你可以在对象上调用moveToThread方法。

MyBST * bst = new MyBST();
bst->moveToThread(BSTThread);

当主应用程序想要与MyBST通信时,您会从主应用程序发出信号。使用Qt :: QueuedConnection将信号连接到MyBST类中的插槽,或者只使用Qt :: AutoConnection,它将自动排队,因为您的bst对象与主应用程序位于不同的线程中,并且插槽中的函数将由BSTThread执行。

当bst对象想要与主应用程序进行通信时,也会发出信号,此信号将连接到主应用程序中的插槽,该插槽将在mainThread中正确处理。这样,您的通信是异步的,当您向bst对象发送请求时,您无法立即获得结果,因为您将其作为信号发送,并将其发布到等待处理的BSTThread的事件队列中。在BSTThread处理来自主应用程序的请求之后,它将结果回发到主线程的事件队列,主线程处理结果并更新GUI。

如果您想了解更多详情,我认为您需要在QT上阅读此http://doc.qt.digia.com/qt/thread-basics.html

答案 1 :(得分:0)

只需创建窗口即可声明MyBST成员:

class MyBST;

class ChocAnGui
    : public QMainWindow
{
    Q_OBJECT

 public:
   ChocAnGui(MyBST* aBst = 0, QWidget *parent = 0);
   MyBST *bst

然后用你的对象初始化它:

ChocAnGui *gui = new ChocAnGui(bst);

或者你不能使它成为一个成员,并让你的gui总是采用MyBST指针:

class MyBST;

class ChocAnGui
    : public QMainWindow
{
    Q_OBJECT

 public:
   ChocAnGui(QWidget *parent = 0);
   void doSomething(MyBST*);