창 최소화, 최대화 버튼 커스터마이징
setWindowFlags(Qt::CustomizeWindowHint);
setWindowFlags(Qt::WindowCloseButtonHint); // 只要关闭按钮
setWindowFlags(Qt::WindowFlags type)
전체 화면 표시 및 복원
1. 작업 표시줄 차단
// 这两个都可以!
showFullScreen(); // 设置窗口全屏显示
showMaximized(); // 设置窗口最大化显示
2. 작업 표시줄을 차단하지 않음
void showMaximize()
{
// 若已经最大化
if(is_max)
{
// 恢复界面位置,并设置按钮图标为最大化图标,提示“最大化”
this->setGeometry(location);
max_button->setIcon(QIcon("maxbtn"));
max_button->setToolTip(tr("max"));
}
else
{
// 设定当前界面的位置,还原时使用
location = this->geometry();
// 获取桌面位置,设置为最大化,并设置按钮图标为还原图标,提示“还原”
QDesktopWidget *desk = QApplication::desktop();
this->setGeometry(desk->availableGeometry());
max_button->setIcon(QIcon("restorbtn"));
max_button->setToolTip(tr("restor"));
}
is_max = !is_max;
}
참고: 창을 최대화할 수 있으므로 복원해야 합니다. 물론 is_max는 창 최대화 여부를 나타내는 bool 값 변수이며 초기 값은 false입니다. location은 바탕화면의 위치이며, 최대화될 때마다 현재 위치를 기록하고 복원 시 사용되기를 기다립니다.
확대:
isFullScreen(); // 判断窗口当前是处于全屏状态还是非全屏状态
showNormal(); // 设置窗口恢复原来显示
작업 표시줄 표시 숨기기
setWindowFlags(Qt::Tool | Qt::X11BypassWindowManagerHint);
배경 이미지를 그리고 둥근 모서리 효과를 얻습니다.
void paintEvent(QPaintEvent *)
{
QPainter painter(this);
QBrush brush;
brush.setTextureImage(QImage(background_image)); // 背景图片
painter.setBrush(brush);
painter.setPen(Qt::black); // 边框色
painter.drawRoundedRect(this->rect(), 5, 5); // 圆角5像素
}
Qt는 창을 투명하게 설정합니다.
1. 완전히 투명한
setWindowOpacity(double value). 이 함수는 양식의 투명도를 설정하는 데 사용되며 유효한 범위는 1.0에서 0.0까지이며 자식 컨트롤에 영향을 미칩니다. 기본적으로 이 속성의 값은 1.0(불투명)입니다.
this->setWindowOpacity(0.7);
2. 하위 컨트롤이 투명합니다
. Qt 스타일 시트를 사용합니다. background:rgba(r, g, b, opacity), rgb는 색상 값, opacity는 반투명으로 설정된 투명도, 유효 범위는 1.0에서 0.0입니다. 스타일 시트를 사용하여 배경 이미지와 위젯 및 레이블의 투명도를 설정합니다(투명도를 설정하려면 다른 컨트롤에 영향을 주지 않도록 개체를 지정).
//子控件透明
this->setStyleSheet("#centralWidget{border-image:url(://timg.jpg);}"
"#label{background:rgba(255,255,0,0.4);}"
"#widget{background:rgba(255,0,0,0.3);}");
3. 부모창이 투명하다
상황 1: 배경에 사진이 없습니다. Qt::WA_TranslucentBackground 속성을 설정하여 MainWindow를 완전히 투명하게 만듭니다.창에서 이 속성은 Qt::FramelessWindowHint와 함께 사용해야 합니다. 그런 다음 centralWidget 스타일에 불투명도를 설정하여 부모 창의 투명도를 조정하고 자식 컨트롤의 불투명도를 설정합니다.
this->setWindowFlags(Qt::FramelessWindowHint);//需要去掉标题栏
this->setAttribute(Qt::WA_TranslucentBackground);
this>setStyleSheet("#centralWidget{background:rgba(0,255,255,0.4);}"
"#label{background:rgba(255,255,0,1);}"
"#widget{background:rgba(0,255,255,1);}");
사례 2: 배경에 사진이 있습니다. 여전히 Qt::WA_TranslucentBackground 속성을 사용하여 MainWindow를 완전히 투명하게 만듭니다. 그런 다음 paintevent의 양식에 그림을 그리고 투명도를 설정하십시오.
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPixmap pix("://timg.jpg");
QPixmap scalePix = pix.scaled(this->width(), this->height(),
Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
painter.setOpacity(0.4);
painter.drawPixmap(0, 0, scalePix);
}
참고: 배경 속성 설정에 실패하면 이 속성을 설정하여 setAttribute(Qt::WA_StyledBackground);를 해결할 수 있습니다.
애플리케이션의 글꼴 설정
QFont font("Courier", 10, QFont::Normal, false);
QApplication::setFont(font);
Qt 경계 없는 창의 두 가지 구현
setWindowFlags(Qt::CustomizeWindowHint);
setWindowFlags(Qt::FramelessWindowHint);
두 기능 모두 제목 표시줄을 제거할 수 있지만 차이점은 첫 번째 기능은 마우스로 창을 확대/축소할 수 있다는 것입니다.
Qt는 활성 창을 설정합니다
Qt 창 문제가 발생하여 표시된 창이 다른 창에 의해 차단되었다고 기록했습니다. 쇼를 다시 호출하면 창을 전면으로 활성화할 수 없습니다. 해결책은 다음과 같습니다.
if(!this->isActiveWindow()) //判断是否是活动窗口
{
this->activateWindow(); //设置成活动窗口
}
창이 닫혔는지 확인하는 방법
bool QWidget::isVisible(); // 窗口显示返回true
bool QWidget::isHidden(); // 窗口隐藏返回true
위젯이 Qt::WA_DeleteOnClose로 설정되어 있으면 close() 호출 시 위젯이 삭제되는데, 이 경우 플래그를 사용하여 외부에서 기록 및 판단할 수 있습니다.
창이 닫힐 때 여유 메모리
사용자가 창을 닫을 때 기본 동작은 숨김이므로 메모리에 남아 있게 됩니다. 해결 방법은 다음 문장을 생성자에 추가하는 것입니다.
setAttribute(Qt::WA_DeleteOnClose);
t::WA_DeleteOnClose 속성은 QWidget에 설정할 수 있고 위젯의 동작에 영향을 줄 수 있는 플래그 중 하나입니다.
Qt 캡처 창 닫기 이벤트
때때로 우리는 창을 닫기 전에 캐싱된 데이터를 저장하거나 사용자에게 창을 닫을지 여부를 묻는 등의 일부 작업을 수행하려고 합니다. 일반 창은 QWidget에서 상속되므로 QWidget에서 가상 함수 closeEvent(QCloseEvent* event);를 재정의하여 이를 달성할 수 있습니다.
void MainWindow::closeEvent(QCloseEvent *event)
{
QMessageBox::StandardButton button;
button=QMessageBox::question(this,tr("退出程序"),QString(tr("确认退出程序")),QMessageBox::Yes|QMessageBox::No);
if(button==QMessageBox::No)
{
event->ignore(); // 忽略退出信号,程序继续进行
}
else if(button==QMessageBox::Yes)
{
event->accept(); // 接受退出信号,程序退出
}
// TODO: 在退出窗口之前,实现希望做的操作
}
Qt5는 마우스가 창 외부를 클릭하여 창을 닫는다는 것을 인식합니다.
방법 1: 창을 다시 작성합니다. 이 방법은 가장 간단하지만 이 기능을 구현해야 하는 창마다 이 기능을 다시 작성해야 하는 단점이 있습니다.
bool Form::event(QEvent *event)
{
if (event->type() == QEvent::ActivationChange)
{
if(QApplication::activeWindow() != this)
{
this->close();
}
}
return QWidget::event(event);
}
방법 2: 이벤트 필터 사용
1단계: 일반적으로 생성자에서 이 기능을 구현해야 하는 각 창에 대한 이벤트 필터를 설치합니다.
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//f和f1都是窗口类实例
f=new Form;
f1=new Form1;
f->installEventFilter(this);
f1->installEventFilter(this);
}
2단계: 이벤트 필터 함수를 다시 작성합니다.
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if (event->type() == QEvent::ActivationChange)
{
if(watched == f || watched == f1)//需要实现该功能的控件
{
if(QApplication::activeWindow() != watched)
{
QWidget *w=static_cast<QWidget *>(watched);
w->close();
}
}
}
return QWidget::eventFilter(watched, event);
}
질문을 종료하려면 입력하세요.
여러 개의 QLabels, QLineEdit 및 종료 버튼이 있는 새 QDialog 창을 만들었지만 QLineEdit를 편집한 후 Enter 키를 누르면 창이 즉시 종료됩니다.나중에 버튼이 기본적으로 StrongFocus로 설정되어 있음을 알게 되었습니다.
솔루션:
창에서 종료 버튼의 focusPolicy 속성을 NoFocus로 설정하십시오.
Esc 종료 문제
QDialog의 keyPressEvent()를 다시 작성해야 합니다.
#include <QKeyEvent>
void MyDialog::keyPressEvent(QKeyEvent *event)
{
switch (event->key())
{
case Qt::Key_Escape: // 按下的为Esc键
break; // 不做反应直接退出
default:
QDialog::keyPressEvent(event);
}
}
QWidget은 컨트롤의 계층적 관계를 설정합니다.
设置控件置于父窗口的顶部:widget->raise();
设置控件层次:widget->stackUnder(other_widget);
设置控件置于父窗口的底部:widget->lower();
Qt는 버튼과 같은 컨트롤의 점선 프레임을 제거합니다.
방법 1: ui->pushButton->setFocusPolicy(Qt::NoFocus) 코드를 통하거나 Qt Creator의 속성 목록에서 설정할 수 있습니다.
방법 2: 임베디드 장치의 버튼을 통해 컨트롤을 전환해야 하는 경우 가장 쉬운 방법은 컨트롤의 포커스를 사용하여 달성하는 것이며 방법 1은 사용할 수 없습니다. 이때 qss 스타일 시트를 통해 점선 상자를 제거할 수 있으며 코드는 다음과 같습니다.
ui->pushButton->setStyleSheet("outline: none");
방법 3: qss 스타일 시트를 통해서도 구현되며 코드는 다음과 같습니다.
ui->pushButton->setStyleSheet("padding: -1");