Здравствуйте всем!
Думаю, что это распространенный вопрос.
У меня прога под Qt 4.8.6. Консольное приложение.
В
main.cpp создаю, соединяю, инициализирую объекты. Объекты общаются друг с другом с помощью сигналов-слотов.
Некоторые соединения мне нужны обязательно с флагом с
Qt::QueuedConnection.
Но сигналы - слоты, которые соединяются как Qt::QueuedConnection, начинают работать только после того, когда цикл обработки событий запущен (с помощью
QCoreApplication::exec). До этого они не работают.
А как узнать, что QApplication::exec уже в работе?
Есть ли какое либо уведомление, сигнал, информирующий об этом?
Мне это уведомление необходимо, чтобы его перехватить, и запустить по нему слот, по которому запускается работа (логика) приложения.
C++ (Qt)
// Main function.
int main(int argc, char *argv[])
{
// App obj.
QCoreApplication a(argc, argv);
try
{
// Set app props.
QCoreApplication::setApplicationName ( "myappname" );
// Output obj.
OutputData output;
output.outputHead();
// ** Read setting - name of local server to connect to.Begin. *************************
const QString strSettingFilename = "myapp.ini";
const QString strUnknownSetting = "unknown_name";
QSettings setting ( qApp->applicationDirPath() + "/" + strSettingFilename, QSettings::IniFormat );
const QString strServerName = setting.value ( "my_server/my_server-name", strUnknownSetting ).toString();
if ( strServerName == strUnknownSetting )
throw new CustomException ( "can't load local server name" );
// ** Read setting - name of local server to connect to.End. ***************************
// ** Get commands from cmd line.Begin. ******************
const QStringList listCommands = a.arguments();
if ( listCommands.count() <= 1 ) // Need to have at least 1 parameter. (Not including app filename, that is the first param).
throw new CustomException ( "there are no parameters passed into this application" );
// ** Get commands from cmd line.End. ********************
// Smart Socket object.
SmartSocket socket ( strServerName, listCommands );
// Connections.Begin.
// Redirecting information messages to console.
if ( !QObject::connect ( &socket, SIGNAL ( notifyInfo_signal ( const QString& ) ), &output, SLOT ( outputData_slot ( const QString& ) ) ) )
throw new CustomException ( "can't connect the mechanism of redirecting information messages from socket to console" );
// Redirecting error messages to console.
if ( !QObject::connect ( &socket, SIGNAL ( notifyError_signal ( const QString& ) ), &output, SLOT ( outputData_slot ( const QString& ) ) ) )
throw new CustomException ( "can't connect the mechanism of redirecting error messages from socket to console" );
// Quiting from app mechanism.
if ( !QObject::connect ( &socket, SIGNAL ( exit_signal() ), &a, SLOT ( quit() ) ) )
throw new CustomException ( "can't connect the quiting from app mechanism" );
// Starting work mechanism.
// Connections.End.
// Start the work.
socket.startWorking_slot(); [color=red][b]// Вот этот слот мне нужно запустить после a.exec(), a не до него[/b][/color]
// Exec app.
int retCode = a.exec();
// Output exiting text.
output.outputFoot();
// Return from app.
return retCode;
}
catch ( CustomException* e )
{
std::cout << "Error: " << e->getErrorString() << "." << std::endl
<< "Exiting from " << qApp->applicationName().toStdString() << "." << std::endl;
delete e;
}
catch (...)
{
std::cout << "Unknown error." << std::endl
<< "Exiting from " << qApp->applicationName().toStdString() << "." << std::endl;
}
return 1; // Return from app whith error.
}
Попробуйте подсесть на сигнал QAbstractEventDispatcher::awake (первое срабатывание)