2010-07-26 36 views
14

Làm cách nào để triển khai đúng chức năng "thu nhỏ đến khay" trong Qt?Làm cách nào để triển khai đúng chức năng "thu nhỏ đến khay" trong Qt?

Tôi đã thử mã sau bên trong QMainWindow::changeEvent(QEvent *e), nhưng cửa sổ chỉ đơn giản là thu nhỏ xuống thanh tác vụ và khu vực khách hàng xuất hiện màu trắng trống khi được khôi phục.

if (Preferences::instance().minimizeToTray()) 
{ 
    e->ignore(); 
    this->setVisible(false); 
} 

Cố gắng bỏ qua sự kiện dường như chẳng làm gì cả.

+1

Từ kinh nghiệm bản thân tôi đã học được rằng bạn thường không muốn điều này. Khay không phải là nơi dành cho các ứng dụng thu nhỏ. Khay _is_ vị trí chính xác cho các applet xem các sự kiện (Bluetooth, trạng thái mạng, loại nội dung đó). Nếu ứng dụng của bạn chứa loại chức năng đó, có thể là khôn ngoan khi chia nhỏ phần đó ra trong quy trình riêng của nó. Quá trình trợ giúp này sau đó sẽ xuất hiện luôn trong khay và không có nơi nào khác. – MSalters

+3

Tuy nhiên, một số người dùng thích chức năng này. Trong ứng dụng của tôi, nó không phải là hành vi mặc định, nhưng được trình bày như một tùy chọn trong hộp thoại tùy chọn. Tôi thấy rằng loại cân bằng thiết kế chính xác và sở thích của người dùng. –

Trả lời

17

Dường như một sự chậm trễ nhỏ là cần thiết để xử lý các sự kiện khác (có thể ai đó sẽ đăng chi tiết chính xác?). Đây là những gì tôi đã kết thúc làm, mà làm việc một cách hoàn hảo:

void MainWindow::changeEvent(QEvent* e) 
{ 
    switch (e->type()) 
    { 
     case QEvent::LanguageChange: 
      this->ui->retranslateUi(this); 
      break; 
     case QEvent::WindowStateChange: 
      { 
       if (this->windowState() & Qt::WindowMinimized) 
       { 
        if (Preferences::instance().minimizeToTray()) 
        { 
         QTimer::singleShot(250, this, SLOT(hide())); 
        } 
       } 

       break; 
      } 
     default: 
      break; 
    } 

    QMainWindow::changeEvent(e); 
} 
+0

Thú vị thực tế là nó đòi hỏi một sự chậm trễ để làm việc, nhưng rất hữu ích :) Muốn biết nếu có một" sạch "giải pháp mặc dù .. Nhưng tôi cũng sẽ thử mã của bạn :) – Exa

+0

Hi im cố gắng này và nhận được lỗi "Preferences" đã không được tuyên bố? – GeneCode

7
void main_window::create_tray_icon() 
{ 
    m_tray_icon = new QSystemTrayIcon(QIcon(":/icon.png"), this); 

    connect(m_tray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_show_hide(QSystemTrayIcon::ActivationReason))); 

    QAction *quit_action = new QAction("Exit", m_tray_icon); 
    connect(quit_action, SIGNAL(triggered()), this, SLOT(on_exit())); 

    QAction *hide_action = new QAction("Show/Hide", m_tray_icon); 
    connect(hide_action, SIGNAL(triggered()), this, SLOT(on_show_hide())); 

    QMenu *tray_icon_menu = new QMenu; 
    tray_icon_menu->addAction(hide_action); 
    tray_icon_menu->addAction(quit_action); 

    m_tray_icon->setContextMenu(tray_icon_menu); 

    m_tray_icon->show(); 
    } 

void main_window::on_show_hide(QSystemTrayIcon::ActivationReason reason) 
{ 
    if(reason) 
    { 
     if(reason != QSystemTrayIcon::DoubleClick) 
     return; 
    } 

    if(isVisible()) 
    { 
     hide(); 
    } 
    else 
    { 
     show(); 
     raise(); 
     setFocus(); 
    } 
} 

Đó là cách tôi nhận ra "thu nhỏ khay". Giờ đây, bạn có thể thu nhỏ bằng cách nhấp đúp vào biểu tượng hoặc nhấp chuột phải và chọn "Hiển thị/Ẩn" trong trình đơn.

+0

Cảm ơn, nhưng tôi đặc biệt đang tìm kiếm một cách để ẩn cửa sổ khi người dùng thu nhỏ cửa sổ. ;) –

+0

Ah okay, xin lỗi, bạn đã sai ở đó :) Vì vậy, bây giờ nó chỉ là một ví dụ cho những người cần một biểu tượng làm việc với show/hide-chức năng :) – Exa

+0

1 cho một mã tốt đẹp! – Narek

11

Ngoài những gì Jake Petroules nói, dường như chỉ đơn giản là thực hiện:

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

là đủ. Từ http://qt-project.org/doc/qt-4.8/qtimer.html#details:

Là một trường hợp đặc biệt, một QTimer với một thời gian chờ của 0 sẽ hết hiệu càng sớm càng tất cả các sự kiện trong hàng đợi sự kiện hệ thống cửa sổ của đã được xử lý.

Bằng cách này bạn không có vấn đề lựa chọn một giá trị chậm trễ thích hợp ...

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