2

我正在创建一个 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 之外创建实例似乎最简单。感谢您提供的任何意见。

4

2 回答 2

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 。

于 2012-11-24T05:57:56.450 回答
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*);
于 2012-11-24T00:17:00.423 回答