Qt GUI 初体验

QWidget 设置

Widget w;
w.resize(250, 150);
w.setWindowTitle("一个简单的例子");
w.setToolTip("这是一个 qt 程序");
w.setWindowIcon(QIcon(":/resources/icon.jpg"));
w.show();

使用 Qt 中的标准图标

注意,需要包含 QStyle!

QStyle* style = a.style();
w.setWindowIcon(style->standardIcon(QStyle::SP_DesktopIcon));

QFrame 和 QGridLayout 设置

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QFrame* frame1 = new QFrame(this);
    frame1->setFrameStyle(QFrame::Box);
    frame1->setCursor(Qt::SizeAllCursor);

    QFrame* frame2 = new QFrame(this);
    frame2->setFrameStyle(QFrame::Box);
    frame2->setCursor(Qt::WaitCursor);

    QFrame* frame3 = new QFrame(this);
    frame3->setFrameStyle(QFrame::Box);
    frame3->setCursor(Qt::PointingHandCursor);

    QGridLayout* grid1 = new QGridLayout(this);
    setLayout(grid1);
    grid1->addWidget(frame1, 0, 0, 1, 1);
    grid1->addWidget(frame2, 0, 1, 1, 1);
    grid1->addWidget(frame3, 0, 2, 1, 1);

    QPushButton* button = new QPushButton("quit", this);
    connect(button, &QPushButton::clicked, qApp, &QApplication::quit);

    QGridLayout* grid2 = new QGridLayout(frame2);
    grid2->addWidget(button);

    QSpinBox* spinbox = new QSpinBox(this);
    grid2->addWidget(spinbox);
}

qss 设置样式

qss 选择器

  • * 所有组件
  • QPushButton 类选择器
  • QPushButton[flat=”false”] 属性选择器
  • . QPushButton 非子类选择器
  • QPushButton#btnOk ID 选择器
  • QDialog QPushButton 从属选择器
  • QDialog>QPushButton 子类选择器

qss 案例

QWidget{
    background-color:rgb(79, 79, 79);
    color:rgb(235, 235, 235);
    font:15px arial,sans-serif;
}

QSpinBox::down-button{
    image:url(:/resources/down.png);
    width: 25%;
}

QSpinBox::up-button{
    image:url(:/resources/up.png);
    width: 25%;
}

QPushButton{
    min-width: 60px;
    min-height: 60px;
    padding: 0px 10px 0px 10 px;
    border: 2px groove red;
    border-radius: 30px;
}

QPushButton:hover{
    background-color: black;
    color:yellow;
}

导入外部 qss 文件

QFile file(":/resources/style.qss");
file.open(QIODevice::ReadOnly);
QString styleString = QString::fromLatin1(file.readAll());
w.setStyleSheet(styleString);

使用按照名称链接的槽

  • 右键 -> Go to slot

设置无边框和透明背景

setWindowFlag(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground, true);

窗口拖拽案例

void Widget::mousePressEvent(QMouseEvent *event)
{
    // 鼠标全局坐标
    QPoint mouseInGlobalPos = event->globalPosition().toPoint();
    // 窗口全局坐标
    QPoint winInGlobalPos = this->pos();
    // 鼠标在窗口中的坐标
    mouseInWinPos = mouseInGlobalPos - winInGlobalPos;
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    // 鼠标全局坐标
    QPoint mouseInGlobalPos = event->globalPosition().toPoint();
    // 计算窗口新的全局坐标
    QPoint winInGlobalPos  = mouseInGlobalPos - mouseInWinPos;
    // 按照窗口全局坐标移动
    this->move(winInGlobalPos);
}