View Full Version : سوال: اجرای فقط یک نمونه از برنامه
sd.CSharpProgrammer
جمعه 02 تیر 1391, 00:06 صبح
سلام دوستان
من میخوام برنامه وقتی اجرا میشه اگه کاربر بازم رو آیکن برنامه کلیک کرد دیگه اجرا نشه. یعنی در هر زمان فقط یکبار قابل اجرا باشه. کیوت کلاسی به اسم QtSingleApplication داره ولی تا جایی که من فهمیدم این کلاس فقط برای نسخه تجاری کیوت قابل استفاده ست. البته سورسش رو از چندجا در آوردم ولی اجرا نمیشه!!!
بعضی از دوستان هم راههایی مثل ایجاد یک فایل temp و مقداردهی اون رو معرفی کردند که فکر میکنم میشه براحتی دور زد (مثلاً بجای بستن معمولی برنامه اونو از قسمت porocesses تاسک منیجر بست!).
اساتید خواهش میکنم کمک کنید، چه راههایی برای پیاده سازی این قابلیت وجود دارند؟! آیا کلاس دیگه ای غیر از QtSingleApplication یا dll یا خلاصه راه اصولی دیگه ای هست یا نه؟!
ممنون
alamate_aoal
جمعه 02 تیر 1391, 03:49 صبح
سلام
سورس QtSingleApplication رو کامپایل کن و کتابخونه حاصل از کامپایل را به همراه فایلهای سرآیند مربوطه در برنامه ات استفاده کن(دقیقا همونطور که از کتابخونه های دیگه استفاده میکنی)
حالا بجای ساختن نمونه از QApplication , از کلاس QtSingleApplication نمونه ای بساز. برای توضیحات بیشتر به مستندات کیوت در سایت نوکیا مراجعه کن
اگر متوجه منظورم نشدید بگید تا نمونه کد قرار بدم
حامد مصافی
جمعه 02 تیر 1391, 11:16 صبح
QtSingleApplication ربطی به خود کیوت ندارد. یکی از سولوشنهایی است که از طرف qt-project مطرح شده و در حال حاضر رسماً وارد کیوت نشده است.
برای آشنایی با نحوه کاربرد این برنامه نمونه سازنده (http://doc.qt.nokia.com/solutions/4/qtsingleapplication/qtsingleapplication-example-trivial.html) را ببینید.
sd.CSharpProgrammer
جمعه 02 تیر 1391, 14:28 عصر
دوستان موفق شدم از روی سورس qtsingleapplication فایل dll بسازم. حالا چطوری باید تو پروژه خودم استفاده کنم؟!
فایل رو تو فولدر پروژه ام اضافه کردم. چطوری میشه اونو به پروژه معرفی و ازش استفاده کرد؟!
حامد مصافی
جمعه 02 تیر 1391, 16:22 عصر
باید خروجی تولید شده رو در برنامه استفاده کنی. در فایل pro اینطوری بنویس:
LIBS += "path/to/lib/libfoo.a"
sd.CSharpProgrammer
جمعه 02 تیر 1391, 19:35 عصر
کار نمیکنه برادر تو پیام خصوصی بیشتر توضیح دادم.
اعصاب نذاشته برام 2 روز درگیرشم. واقعاً بعضی وقتا کیوت کفر آدمو در میاره :عصبانی++:
میشه یه نمونه کد کوچیک بفرستین ببینم از رو دستورات اون میشه درستش کرد یا نه؟!
حامد مصافی
جمعه 02 تیر 1391, 20:15 عصر
مشکل شما از اضافه نکردن مسیر به پروژست:
INCLUDEPATH += path/to/header/dir
پروژهی qtsingleapplication رو که خودتون ساختید آپلود کنید تا نمونه رو براتون آماده کنم. ضمنا بفرمایید چه سیستمعاملی؟
sd.CSharpProgrammer
جمعه 02 تیر 1391, 22:27 عصر
با راهنمائی های شما پروژه سرآمد qtsingleapplication رو شناخت و تونستم کلاسش رو بسازم ولی ایندفعه کامپایل نمیشه :لبخند:
سورسو فرستادم ممنون میشم اصلاحش کنید.
با تشکر فراوان :لبخندساده:
حامد مصافی
شنبه 03 تیر 1391, 00:05 صبح
88628با فرض اینکه سیستمعامل مورد استفاده شما ویندوز است...
مشکل شما در حال حاضر فقط آدرس دهیه. توجه کنید در آدرس دهی باید مسیر فایل lib را نسبت به فولدر خروجی بنویسید. یک راه آسانتر استفاده از آدرسدهی مطلق است. در فایل ضمیمه فقط فایل pro تغییر یافته است و یک فولدر qsingleapp-dev اضافه شده است. این فولدر را به ریشه درایو C انتقال داده و پروژه را make کنید.
sd.CSharpProgrammer
شنبه 03 تیر 1391, 01:02 صبح
آقای مصافی واقعاً ممنونم مشکل حل شد فقط یه مساله کوچیک باقی مونده! وقتی برنامه رو از کیوت کریتور کامپایل میکنم ، بجای پنجره برنامه یک پیغام خطا میاد ولی وقتی پروژه رو با دستور make از خط فرمان کامپایل میکنم همه چیز بخوبی پیش میره و برنامه اجرا میشه. دلیلش چیه؟!
پیغام خطا رو اینجا ضمیمه کردم.
alamate_aoal
شنبه 03 تیر 1391, 04:49 صبح
فایل پروژه
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MySingleApplication
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
INCLUDEPATH += headers
HEADERS += mainwindow.h
FORMS += mainwindow.ui
LIBS += -L. -lQtSolutions_SingleApplication-head
alamate_aoal
شنبه 03 تیر 1391, 04:51 صبح
قایل main.cpp
#include "mainwindow.h"
#include <QMessageBox>
#include "qtsingleapplication.h"
int main(int argc, char *argv[])
{
QtSingleApplication app(argc, argv);
if( app.isRunning() ){
app.sendMessage( app.sessionId() );
return 0;
}
MainWindow w;
app.setActivationWindow(&w);
w.show();
QObject::connect(&app, SIGNAL(messageReceived(QString)),
&w , SLOT(SLT_messageReceived(QString)) );
return app.exec();
}
alamate_aoal
شنبه 03 تیر 1391, 04:56 صبح
فایا های زیر رو هم در پوشه ی header کنار برنامه ات بذار
qtlocalpeer.h
qtlockedfile.h
qtsingleapplication.h
qtsinglecoreapplication.h
اسلات SLT_messageReceived رو هم پیاده سازی کن
فایل های dll کامپایل شده رو هم در کنار پروژه بذار
sd.CSharpProgrammer
شنبه 03 تیر 1391, 10:58 صبح
فایا های زیر رو هم در پوشه ی header کنار برنامه ات بذار
qtlocalpeer.h
qtlockedfile.h
qtsingleapplication.h
qtsinglecoreapplication.h
اسلات SLT_messageReceived رو هم پیاده سازی کن
فایل های dll کامپایل شده رو هم در کنار پروژه بذار
سلام دوست عزیز
موقع اجرا همون پیغامی رو میده که عکسش رو بالا آپلود کردم. و موقع build کردن یه اخطار میده به اینصورت :
auto-importing has been activated without --enable-auto-import specified on the command line.
alamate_aoal
یک شنبه 04 تیر 1391, 07:21 صبح
این رو تست کن , از MSVS2010 و Qt 4.8.2 برای کامپایلش استفاده کردم
sd.CSharpProgrammer
دوشنبه 05 تیر 1391, 01:34 صبح
خیلی ممنون دوستان مشکل حل شد، واقعاً ازتون ممنونم :لبخندساده:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.