Может ли несколько приложений WT работать на одной веб-странице?

совсем недавно я задал вопрос, чтобы увидеть, если Могут ли несколько приложений WT работать на одном порту? и ответ был да, (+1 к Хорхе Нуньесу за этот потрясающий ответ). Однако теперь я пытаюсь продвинуть его решение на шаг вперед, чтобы увидеть, можно ли запускать несколько приложений WT на одной странице, встроив их в своего рода WT-приложение. Я создал хост-приложение WT, которое имеет аксессор для своего root () и имеет WTabWidget. Затем в функции CreateHostApplication я создал вкладки для 2 тестовых приложений, у которых также есть средства доступа для их root (), и добавил их root () на вкладку, которая принадлежит моему хост-приложению, после того, как все приложения были добавлены в их отдельные приложения. Вкладки я вернул хозяину.

Самое интересное в том, что виджеты из тестовых приложений отображались на их вкладках, как я и ожидал, но я не ожидал, что вызов connect () для подключения кнопок к функциям завершился неудачей. Таким образом, виджеты являются функциональными в том, что касается их щелчка и редактирования текста в полях, но они больше ничего не делают, поскольку они не связаны с какими-либо пользовательскими функциями.

После небольшой отладки я почти уверен, что вызовы подключения не сработали в тестовых приложениях, потому что они на самом деле не размещаются в браузере, что и привело меня сюда. Я не смог найти решение этой проблемы, есть ли способ, чтобы с этой настройкой работали вызовы подключения?

Код ниже — решение Хорхе Нуньеса с вышеупомянутыми модификациями. Я использую Visual Studio2010 для разработки. Спасибо заранее за любую помощь!

#include <Wt/WApplication>

#include <Wt/WBreak>
#include <Wt/WContainerWidget>
#include <Wt/WLineEdit>
#include <Wt/WPushButton>
#include <Wt/WText>
#include <Wt/WException>
#include <Wt/WLogger>
#include <Wt/WServer>
#include <Wt/WTabWidget>

using namespace Wt;class Host : public Wt::WApplication
{
public:
Host(const Wt::WEnvironment& env);
WContainerWidget* GetRoot()
{
return root();
}
};
Host::Host(const Wt::WEnvironment& env) : Wt::WApplication(env)
{

}

class TestApp1 : public Wt::WApplication
{
public:
TestApp1(const Wt::WEnvironment& env, const std::string& title);
WContainerWidget* GetRoot()
{
return root();
}

private:
Wt::WLineEdit* _name_edit;
Wt::WText* _greeting;

void Greet();
};
TestApp1::TestApp1(const Wt::WEnvironment& env, const std::string& title) : Wt::WApplication(env)
{
setTitle(title);

root()->addWidget(new Wt::WText("Your name, please ? "));
_name_edit = new Wt::WLineEdit(root());

Wt::WPushButton* button = new Wt::WPushButton("Greet me.", root());
root()->addWidget(new Wt::WBreak());

_greeting = new Wt::WText(root());
button->clicked().connect(this, &TestApp1::Greet);
}
void TestApp1::Greet()
{
_greeting->setText("Hello there, " + _name_edit->text());
}

class TestApp2 : public Wt::WApplication
{
public:
TestApp2(const Wt::WEnvironment& env, const std::string& title);
WContainerWidget* GetRoot()
{
return root();
}

private:    Wt::WLineEdit *_name_edit;
Wt::WText *_greeting;

void greet();
};
TestApp2::TestApp2(const Wt::WEnvironment& env, const std::string& title) : Wt::WApplication(env)
{
setTitle(title);

root()->addWidget(new Wt::WText("Your name, please ? "));
_name_edit = new Wt::WLineEdit(root());

Wt::WPushButton* button = new Wt::WPushButton("Say goodbye.", root());
root()->addWidget(new Wt::WBreak());

_greeting = new Wt::WText(root());
button->clicked().connect(this, &TestApp2::greet);
}
void TestApp2::greet()
{
_greeting->setText("Goodbye, " + _name_edit->text());
}

Wt::WTabWidget* tab_widget;
Wt::WApplication* CreateHostApplication(const Wt::WEnvironment& env)
{
Host* host = new Host(env);

WContainerWidget* root = host->GetRoot();

tab_widget = new WTabWidget(root);

//Create tab for the app
WContainerWidget* Tab_TestApp1 = new WContainerWidget();
//Get a pointer to the ACE tab
tab_widget->addTab(Tab_TestApp1, "Test Application 1", Wt::WTabWidget::LoadPolicy::PreLoading);
//Create app
TestApp1* test_app_1 = new TestApp1(env, "Test Application 1");
//Add app root to the tab
Tab_TestApp1->addWidget(test_app_1->GetRoot());

//Create tab for the app
WContainerWidget* Tab_TestApp2 = new WContainerWidget();
//Get a pointer to the ACE tab
tab_widget->addTab(Tab_TestApp2, "Test Application 2", Wt::WTabWidget::LoadPolicy::PreLoading);
//Create app
TestApp2* test_app_2 = new TestApp2(env, "Test Application 2");
//Add app root to the tab
Tab_TestApp2->addWidget(test_app_2->GetRoot());

return host;
}
Wt::WApplication* CreateTestApp1(const Wt::WEnvironment& env)
{
return new TestApp1(env, "Test Application 1");
}
Wt::WApplication* CreateTestApp2(const Wt::WEnvironment& env)
{
return new TestApp2(env, "Test Application 2");
}

int TestWRun(int argc, char* argv[],
Wt::ApplicationCreator host_application,
std::vector<Wt::ApplicationCreator> applications)
{
try
{
// use argv[0] as the application name to match a suitable entry
// in the Wt configuration file, and use the default configuration
// file (which defaults to /etc/wt/wt_config.xml unless the environment
// variable WT_CONFIG_XML is set)
Wt::WServer server(argv[0],"");

// WTHTTP_CONFIGURATION is e.g. "/etc/wt/wthttpd"server.setServerConfiguration(argc, argv, WTHTTP_CONFIGURATION);

// add a single entry point, at the default location (as determined
// by the server configuration's deploy-path)
server.addEntryPoint(Wt::Application, host_application);

unsigned int num_apps = applications.size();
for(unsigned int cur_app = 0; cur_app < num_apps; ++cur_app)
{
server.addEntryPoint(Wt::Application, applications[cur_app], "/" + boost::lexical_cast<std::string>(cur_app));
}

if (server.start())
{
int sig = Wt::WServer::waitForShutdown(argv[0]);

std::cerr << "Shutdown (signal = " << sig << ")" << std::endl;
server.stop();
}
}
catch (Wt::WServer::Exception& e)
{
std::cerr << e.what() << "\n";
return 1;
}
catch (std::exception& e)
{
std::cerr << "exception: " << e.what() << "\n";
return 1;
}
}
int main(int argc, char** argv)
{
std::vector<Wt::ApplicationCreator> applications;
applications.push_back(&CreateTestApp1);
applications.push_back(&CreateTestApp2);

return TestWRun(argc, argv, &CreateHostApplication,  applications);
}

1

Решение

Хотя это возможно с Wt, ваш подход не на 100% правильный. AFAIK у вас есть два варианта:

  1. Используйте режим виджетов Wt. Посмотрите, как виджет чата интегрирован на домашней странице Wt: это два независимых приложения Wt, которые отображаются одновременно на одной странице и оба являются активными. Режим виджета Wt лучше всего подходит по сравнению с виджетом карт Google: вы помещаете небольшой заполнитель (div + немного JS) на веб-страницу, где вы хотите, чтобы приложение отображалось. Смотрите примеры / wt-home, примеры / функция / widgetset
  2. В Wt ​​нет никаких проблем повторно использовать виджеты из одного приложения в другом приложении. Поместите часть, которую вы хотите повторно использовать все вместе, в WContainerWidget (или WCompositeWidget), и интегрируйте это в ваши tabwidgets. На самом деле, это очень похоже на то, что вы делаете сейчас, но вместо того, чтобы использовать root () TestApp1, организуйте свой код так, чтобы вы поместили только один виджет в корень TestApp1 и использовали тот же виджет в вкладки приложения Host. В createApplication вы не должны создавать более одного объекта WApplication. Widgetgallery использует этот подход для интеграции частей примера диаграмм.
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]