QT4: จะรีสตาร์ทแอปพลิเคชันได้อย่างไร คืนค่าการตั้งค่า? [ทำซ้ำ]

1.) ฉันต้องการรีสตาร์ทแอปพลิเคชัน QT4 ของฉัน เพียงการปิดระบบตามปกติและเริ่มแอปพลิเคชันเดียวกัน

2.) ทำไม? ฉันต้องการตัวเลือกในการ "รีเซ็ต" ทุกอย่าง การรีสตาร์ทแอปพลิเคชันน่าจะเป็นวิธีที่ง่ายที่สุดในการดำเนินการนี้ ปัญหาคือมีคลาสมากมายและทุกอย่าง ฉันไม่มีเวลาที่จะเปลี่ยนทุกการตั้งค่ากลับเป็นมาตรฐาน ทุกกล่องข้อความ วิดเจ็ตที่ต้องล้าง... ฉันรู้ว่าการรีสตาร์ทแอปพลิเคชันไม่ใช่วิธีที่ดีที่สุด คุณคิดว่ามีวิธีอื่นอย่างไร

ขอบคุณ


person Revollt    schedule 26.02.2011    source แหล่งที่มา


คำตอบ (6)


สำหรับการรีสตาร์ทแอปพลิเคชัน คุณสามารถใช้ startDetached หลังจากออกจากกระบวนการ:

#include <QApplication>
#include <QProcess>

...

// restart the app:
qApp->quit();
QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
person masoud    schedule 30.10.2011
comment
วิธีแก้ปัญหานี้ใช้ไม่ได้บนอุปกรณ์ ใช้งานได้กับโปรแกรมจำลองเท่านั้น แต่ไม่สามารถรีสตาร์ทบน Nokia E7 ได้ - person abhishek; 21.04.2012
comment
ฉันไม่รู้เกี่ยวกับอุปกรณ์ต่างๆ จริงๆ แต่ฉันทดสอบมันบน Windows และใช้งานได้ - person masoud; 25.04.2012

1) คุณสามารถเรียกใช้สคริปต์ กำหนดเวลาระบบปฏิบัติการเพื่อเริ่มแอปของคุณในภายหลัง

2) เขียนคลาสแยกต่างหากซึ่งมีการตั้งค่าแอปพลิเคชันทั้งหมดของคุณ รีเซ็ตเมื่อจำเป็น

person MSKOnline    schedule 26.02.2011

คำขอตลกๆ เพียงจองรหัสทางออกสำหรับ "รีสตาร์ท" และทำสิ่งที่ชอบ (ยังไม่ได้ทดสอบ):

int main(int argc, char **argv)
{
 QApplication app(argc, argv);
 ...
 int ret = app.exec();
 if (ret == EXIT_RESTART) {
   ::execve(...);
 }
 return ret;
}

จากนั้นคุณสามารถโทรไปที่ QApplication::exit(EXIT_RESTART) ได้ทุกที่และคุณน่าจะไปได้ดี หรือใช้สคริปต์ตัวตัดคำเพื่อทำเช่นเดียวกัน (ตรวจสอบให้แน่ใจในทั้งสองกรณีว่าคุณจัดการอาร์กิวเมนต์บรรทัดคำสั่งได้อย่างน่าพอใจหากแอปของคุณรับไป)

แนวทางที่สะอาดกว่าคือการเชื่อมต่อทุกสิ่งที่จำเป็นต้องรีเซ็ตให้เป็นสัญญาณเดียวกัน

person Mat    schedule 26.02.2011
comment
คุณยังสามารถใช้ try-catch ที่นี่แทนโค้ดส่งคืนได้ เมื่อคุณคิดว่าถึงเวลาที่ต้องรีสตาร์ท ให้ส่งข้อยกเว้นที่ทราบ มีข้อดีคือช่วยให้คุณสามารถรีสตาร์ทได้แม้ในสภาวะที่ระบบขัดข้อง - person j4x; 04.03.2011
comment
Qt เข้ากันไม่ได้กับข้อยกเว้นในกรณีทั่วไป ประเพณีบางอย่างมีความปลอดภัย แต่ก็ไม่แนะนำเท่าที่ฉันรู้ ดูความปลอดภัยของข้อยกเว้น Qt - person Mat; 04.03.2011

คุณสามารถลบคลาสและสร้างคลาสใหม่ใน main() ภายใต้ QApplication เดียวกัน

person yolo    schedule 26.02.2011

สิ่งที่สมเหตุสมผลที่ต้องทำในกรณีเช่นนี้คือการรวมทุกสิ่งที่สร้าง/เริ่มต้นวิดเจ็ต ฯลฯ ไว้ในฟังก์ชันเดียว (แน่นอนว่ามันสามารถเรียกฟังก์ชันย่อยได้) เมื่อคุณต้องการรีเซ็ตทุกอย่าง เพียงแค่โทรหามัน ขึ้นอยู่กับการใช้งานที่แน่นอน คุณอาจต้องลบ/ยกเลิกการเริ่มต้นสิ่งต่าง ๆ ก่อน

person Daggerstab    schedule 26.02.2011

วิธีการนี้ใช้ได้กับ PyQt ฉันเขียนมันเพื่อลบการตั้งค่าทั้งหมดและรีสตาร์ทแอปพลิเคชันด้วยการตั้งค่าใหม่ทั้งหมด application_main คือวิธีการหลัก และ clearSettings คือช่องสำหรับล้างการตั้งค่า

class GuiMain

    #Most of implementation missing

    def clearSettings(self):
        """Deletes all settings, and restarts the application"""
        #TODO: save changes
        setting_store = QSettings()
        setting_store.clear()
        setting_store.sync()
        QApplication.exit(GuiMain.restart_code)

    restart_code = 1000

    @staticmethod
    def application_main():
        """
        The application's main function. 
        Create application and main window and run them.
        """
        while True:
            app = QApplication(sys.argv)
            window = GuiMain()
            window.show()
            ret = app.exec_()
            if ret != GuiMain.restart_code:
                break
            del window
            del app
person Eike    schedule 12.03.2013