совсем недавно я задал вопрос, чтобы увидеть, если Могут ли несколько приложений 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);
}
Хотя это возможно с Wt, ваш подход не на 100% правильный. AFAIK у вас есть два варианта:
Других решений пока нет …