2010-03-01 40 views
8

Tôi có ứng dụng Qt sử dụng lớp học QMainWindow-dành cho giao diện người dùng chính. Khi khởi động tôi muốn thực hiện một số kiểm tra bảo mật và nếu chúng không thành công, hiển thị một thông báo cho người dùng và đóng cửa sổ chính. Hiện tại tôi thực hiện các kiểm tra này trong hàm tạo QMainWindow, nhưng nếu tôi gọi phương thức close, không có gì xảy ra và ứng dụng tiếp tục chạy. Ví dụ:Đóng QMainWindow khi khởi động?

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
{ 
    setupUi(this); 
    ... 
    if (checkFails()) 
    { 
     QMessageBox::warning(this, tr("Error"), tr("You cannot run this app")); 
     // This has no effect 
     close(); 
    } 
} 

Ngoài ra tôi có thể tiến hành kiểm tra tại các chức năng chính nhưng sau đó tôi mất khả năng hiển thị một hộp thông báo ngôn ngữ cụ thể (các tr vĩ mô chỉ hoạt động trong một lớp -derived QObject bởi vẻ của mọi thứ.)

Bất kỳ ý tưởng nào về cách đóng cửa sổ chính khi khởi động hoặc thực hiện tác vụ macro tr bên ngoài lớp học có nguồn gốc từ QObject?

Trả lời

23

Vòng lặp sự kiện cần phải chạy trước khi bạn có thể đóng cửa sổ chính thành công. Vì bạn có thể đầu tiên xây dựng một cửa sổ, và sau đó bắt đầu vòng lặp sự kiện, cuộc gọi close() không có hiệu lực. Hãy thử các giải pháp sau đây thay vì:

QTimer::singleShot(0, this, SLOT(close())); 

Các QTimer::singleShot() sẽ cháy ngay sau khi một vòng lặp sự kiện đã được bắt đầu, và sau đó gọi phương thức close() trên cửa sổ chính ứng dụng của bạn.

Giải pháp trên có thể sẽ khiến cửa sổ ứng dụng chính của bạn hiển thị trong một khoảng thời gian ngắn, gây nhấp nháy không mong muốn.

Giải pháp sạch hơn nên thực hiện kiểm tra bảo mật trước khi xây dựng cửa sổ chính. Vì tr() cũng có sẵn như là một phương pháp tĩnh trên QObject, điều này có thể được thực hiện từ chức năng chính.

2

trpublic static member của QObject. Bạn có thể gọi QObject::tr("Error") trong chức năng chính của bạn.

0

Bạn đã thử lần đầu tiên ẩn() vào cửa sổ (điều này sẽ xảy ra khi close() được gọi) để xem liệu điều này có cho phép đóng() để phá hủy cửa sổ không.

Nếu điều này không hoạt động, bạn luôn có thể thử phá hủy (đúng, đúng) trong cửa sổ cùng với bất kỳ cửa sổ phụ nào.

2

Hầu hết các ứng dụng khởi động theo ba bước: 1) xây dựng cửa sổ; 2) hiển thị cửa sổ; 3) bắt đầu vòng lặp sự kiện. Bạn có thể thực hiện các bước 2 và 3 có điều kiện về sự thành công của bước 1 bằng cách thêm một lá cờ, mà giá trị được thiết lập bởi các nhà xây dựng cửa sổ, đến lớp cửa sổ:

Window lớp: Mã

class myMainWindowClass : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    myMainWindowClass() 
    : isFinished_(false) { if (error) isFinished_ = true; } // constructor 

    bool isFinished() const { return isFinished_; } 
private: 
    bool isFinished_; 
} 

Ứng dụng:

int main() 
{ 
    myMainWindowClass main_window(); // Step 1 

    // Finish early if isFinished flag is set 
    if (main_window.isFinished()) 
     return 0; 

    main_window.show(); // Step 2 
    return a.exec(); // Step 3 
} 

Điều này cũng nên tránh bất kỳ nhấp nháy nào khi ứng dụng kết thúc trước khi cửa sổ hiển thị() n.

Các vấn đề liên quan