it-swarm-vi.tech

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

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 nơi tôi có thể xử lý nút trợ giúp của anh ấy. Không chắc chắn nếu đó là một lá cờ cụ thể trên cửa sổ Qt.

69
AMM

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 với tham số WindowFlags cho hàm tạo hộp thoại.

Chẳng hạn, bạn chỉ có thể chỉ định các cờ TitleHint SystemMothy 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 lại nút trợ giúp.

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_()

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

61
amos
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
37
Jens A. Koch

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

Nó không đối phó với 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);
31
AMM

Kể từ Qt 5.10, bạn có thể vô hiệu hóa các nút này trên toàn cầu bằng một thuộc tính QApplication!

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
15
Parker Coates

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

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

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

Như Michael Bishop đề xuất, nó đã chơi với ví dụ về các ô cửa sổ dẫn tôi đến sự kết hợp này. Cảm ơn!

13
rrwick

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 đề windowflags squirrelly.

4
Michael Bishop

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

Đính kèm bộ lọc sự kiện sau vào QApplication ở đâu đó 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);
  }
2
Predelnik

Tôi không thể tìm thấy một vị trí nhưng bạn có thể ghi đè hàm winEvent ả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
0
brandoneggar