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:
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ỉ TitleHint và SystemMenu 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.
Qt::WindowCloseButtonHint
nếu bạn muốn kích hoạt nút đóng.
QtCore.Qt.WindowCloseButtonHint
và 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.
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
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);
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
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 QApplication
thuộc tính duy nhất !
QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
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!
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ổ.
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 QApplication
mộ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);
}
Tôi không thể tìm thấy vị trí nhưng bạn có thể ghi đè winEvent
chứ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