Làm cách nào để ẩn / xóa dấu “?” nút trợ giúp trên “thanh tiêu đề” của Hộp thoại Qt?


81

Tôi đang sử dụng Hộp thoại Qt trong một trong các ứng dụng của mình. Tôi cần ẩn / xóa nút trợ giúp. Nhưng tôi không thể xác định chính xác vị trí mà tôi nhận được nút trợ giúp của anh ấy. Không chắc nó có phải là cờ cụ thể trên cửa sổ Qt hay không.

Câu trả lời:


65

Theo mặc định, cờ Qt :: WindowContextHelpButtonHint được thêm vào hộp thoại. Bạn có thể kiểm soát điều này bằng tham số WindowFlags cho hàm tạo hộp thoại.

Ví dụ bạn có thể xác định chỉ TitleHintSystemMenu cờ bằng cách thực hiện:

QDialog *d = new QDialog(0, Qt::WindowSystemMenuHint | Qt::WindowTitleHint);
d->exec();

Nếu bạn thêm cờ Qt :: WindowContextHelpButtonHint, bạn sẽ nhận được nút trợ giúp trở lại.

Trong PyQt, bạn có thể làm:

from PyQt4 import QtGui, QtCore
app = QtGui.QApplication([])
d = QtGui.QDialog(None, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint)
d.exec_()

Có thể tìm thấy thêm chi tiết về cờ cửa sổ trên enum WindowType trong tài liệu Qt.


7
Xem câu trả lời của rrwick dưới đây. Nếu bạn không thêm Qt :: WindowCloseButtonHint vào các cờ của mình, bạn sẽ tắt nút đóng, nút này được bật theo mặc định.
Dan

1
Đây là liên kết chỉ định cờ cửa sổ trong PyQt4, pyqt.sourceforge.net/Docs/PyQt4/qt.html#WindowType-enum
Barmaley

4
Cũng thêm cờ Qt::WindowCloseButtonHintnếu bạn muốn kích hoạt nút đóng.
Vịt Donald

1
Tôi đã có thể chỉ cần đặt QtCore.Qt.WindowCloseButtonHintvà nó đã được gỡ bỏ QtCore.Qt.WindowTitleHint. Tôi giả sử rằng việc đặt cờ sẽ ghi đè lên các cờ mặc định, vì vậy bạn cần chỉ định tất cả các cờ bạn muốn.
artomason

Xem thêm câu trả lời của @Parker Coates bên dưới để biết cách xóa dấu '?' toàn cầu với một lớp lót, từ Qt 5,10 trở đi
Clare Macrae

51
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);

32

Ok, tôi đã tìm thấy một cách để làm điều này.

Nó xử lý các cờ Window. Vì vậy, đây là mã tôi đã sử dụng:

Qt::WindowFlags flags = windowFlags()

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   
setWindowFlags(flags);

Nhưng bằng cách này, đôi khi biểu tượng của hộp thoại được đặt lại. Vì vậy, để đảm bảo biểu tượng của hộp thoại không thay đổi, bạn có thể thêm hai dòng.

QIcon icon = windowIcon();

Qt::WindowFlags flags = windowFlags();

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   

setWindowFlags(flags);

setWindowIcon(icon);

30
Phiên bản ngắn hơn:setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Thorbjørn Lindeijer

2
@ ThorbjørnLindeijer: Bạn nên thêm điều này làm câu trả lời.
Hossein

27

Kể từ Qt 5.10, bạn có thể tắt các nút này trên toàn cầu bằng một QApplicationthuộc tính duy nhất !

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);

15

Tôi gặp sự cố này trong Windows 7, Qt 5.2 và tổ hợp cờ hoạt động tốt nhất cho tôi là:

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

Điều này mang lại cho tôi một nút đóng đang hoạt động nhưng không có nút trợ giúp dấu chấm hỏi. Chỉ sử dụng Qt :: WindowTitleHint hoặc Qt :: WindowSystemMenuHint đã loại bỏ nút trợ giúp, nhưng nó cũng vô hiệu hóa nút đóng.

Như Michael Bishop đã gợi ý, việc chơi với ví dụ về cờ hiệu cửa sổ đã dẫn tôi đến sự kết hợp này. Cảm ơn!


1
Đây là câu trả lời đúng. Các câu trả lời ở trên vô hiệu hóa nút đóng, theo mặc định, không bị tắt.
Dan

4

Các câu trả lời được liệt kê ở đây sẽ hoạt động, nhưng để tự trả lời, tôi khuyên bạn nên chạy chương trình ví dụ $QTDIR/examples/widgets/windowflags. Điều đó sẽ cho phép bạn kiểm tra tất cả các cấu hình của cờ cửa sổ và hiệu ứng của chúng. Rất hữu ích để tìm ra các vấn đề về thẻ đánh dấu cửa sổ.


2

Có thể sử dụng cách sau đây để xóa dấu chấm hỏi cho tất cả các hộp thoại trong ứng dụng:

Đính kèm bộ lọc sự kiện sau vào QApplicationmột nơi nào đó khi bắt đầu chương trình của bạn:

  bool eventFilter (QObject *watched, QEvent *event) override
  {
    if (event->type () == QEvent::Create)
      {
        if (watched->isWidgetType ())
          {
            auto w = static_cast<QWidget *> (watched);
            w->setWindowFlags (w->windowFlags () & (~Qt::WindowContextHelpButtonHint));
          }
      }
    return QObject::eventFilter (watched, event);
  }

0

Tôi không thể tìm thấy vị trí nhưng bạn có thể ghi đè winEventchức năng ảo .

#if defined(Q_WS_WIN)
bool MyWizard::winEvent(MSG * msg, long * result)
{
    switch (msg->message)
    {
    case WM_NCLBUTTONDOWN:
        if (msg->wParam == HTHELP)
        {

        }
        break;
    default:
        break;
    }
    return QWizard::winEvent(msg, result);
}
#endif
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.