Qt 인터페이스 개발 문제 요약

창 최소화, 최대화 버튼 커스터마이징

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"); 

추천

출처blog.csdn.net/houxian1103/article/details/130141617