1.使用信号槽发送结构体信息,使用 qRegisterMetaType 注册一下。 qRegisterMetaType("SParam"); 2.sendParamValue 尽管设置成了 const reference,但是还会有一次构造 因为 Qt 一下两个原因: 1.线程安全性:Qt 的信号槽机制支持多线程,在多线程环境中,如果参数是引用,可能会引发线程安全问题。 2.松耦合性:通过传值而不是引用,信号发送方和接收方可以更独立,不必担心在信号槽连接时传递的对象是否仍然有效。 1.Qt的三个窗口类的区别 (1)QMainWindow:包含菜单栏、工具栏、状态栏。 (2)QWidget:普通窗口、大部分窗口要做成无边框的,这个使用较多。 (3)QDialog:对话框,常用于做登录窗口、弹出窗口。 2.类似保存上次访问信息这存储 (1)使用QSettings 示例:ini, /LastPath/path (2)一些常用的位置在 QStandardPaths::writableLocation(enum); 3.信号 signals: void xxx(int value); --> emit xxx(nValue); private slots: void yyy(); 4.子线程无法直接修改UI,需要使用信号处理。 5.在VS中写QT时开启cmd窗口: 项目--属性--链接器--系统--子系统--控制台 (/SUBSYSTEM:CONSOLE) 6.信号重载: (1)使用 Qt4 的写法 (2)Qt5 的写法,参数二 => QOverlaod::of(xx) 7.moc全称是Meta-Object Compiler(元对象编译器) moc -> 分析C++(若有Q_OBJECT) -> moc_xx.cpp(包含QOBJECT实现) --> 进入编译(预处理器之前,与源文件一起编译而不是替换) 可以理解为:moc把Qt中不是C++的关键字解析让其认识。 8.界面布局 (1)设定min和max就是固定 (2)配合弹簧布局 (3)无边框:setWindowFlags(Qt::FramelessWindowHint) (4)任务栏单机隐藏显示 Qt::WindowMinMaxButtonsHint (5)Layout: setMargin: 与边界间隙。 setSpacing: 与相邻空间间隙(默认大概是7)。 addSpacing: 在 setSpacing 基础上加减。 addStretch: 添加一个 QSpacerItem (6)QSplitter分裂器布局 setOpaqueResize(false): 鼠标松开才变换。 (7)全局setLayout如果不清除的话仅第一次生效。 (8)清空布局内的所有元素: QLayoutItem* pChild; layout = this->layout(); while((pChild = layout->takeAt(0)) != 0) if (pChild->widget()) xx->setParent(nullptr) delete; (9)Widget也可以作为一个容器用于布局。 (10) resize 可以设定首次启动时的界面大小。 9.QSS相关 (1)给QPushButton设置背景图: QPushButton { background-image: url(:/resource/xx.png); border: none // 无边框; QPushButton::hover { background-color: rgb(192, 192, 192); // 鼠标悬浮时 } } (2)QTabWidget QTabWidget::pane { border-top: 1px solid #EAEAEA; // 上边框 position: absolute; top: -0.1px; } QTabBar::tab { width: 100px; height: 32px; font-size: 16px; font-family: Microsoft YaHei; font-weight: 400; background: #FFFFFF; border: 2px solid #FFFFFF; border-bottom-color: #FFFFFF; border-top-left-radius: 4px; border-top-right-radium: 4px; padding: 2px; } QTabBar::tab:selected { color: #333333; border-color: #FFFFFF; border-bottom-color: #4BA4F2; } QTabBar::tab:!selected { color: #B2B2B2; border-color: #FFFFFF; border-bottom-color: #4BA4F2; } 10.基本控件简记 (1)QToolButton可以图片文字一起显示 QToolButton->setIcon, setIconSize, setToolButtonStyle (2)QLineEidt setPlacceholderText: 未填写内容的提示信息 setEchoMode: 显示形式,比如密码形式。 (3)右键菜单, menu->exec(QCursor::pos()) setContextMenuPolicy(Qt::CustomContextMenu); void contextMenuEvent(QContextMenuEvent* event) override; (4)QMenu可以添加QAction (5)QTableWiget可以直接insert Wiget作为一个新的tab页。 setTabPostion: 位置 setTabShape: 形状 setMovable: 可移动 (6)QListWidget Item项也可以是一个widget。 ListeItem 怎么添加右键菜单: ①必须设置菜单策略 listWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(xxListwidget, &QListWidget::customContextMenuRequested, this, xxx); 图标模式:setViewMode 焦点:setFocusPolicy(Qt::NoFocus) (7)QScrollArea setFrameShape(QFrame::NoFrame) setHorizontalScrollBarPolicy() 11.无边框窗口 Qt很多问题都可以从QWidget中找到答案,学习Qt大部分就是在与QWidget打交道。 (1)无边框界面移动和拉伸、大小改变 重写 mousePressEvent mouseMoveEvent this->pos() 窗口左上角相对桌面位置 event->pos() 鼠标相对exe位置 event->globalPos() 鼠标相对桌面位置 使用 this->move(pos) 重写nativeEvent() setAttributte(Qt::WA_Hover)防止鼠标边无法选中。 (2)自定义标题栏(自己布局) setAttribute(Qt::WA_StyleBackground)禁止父窗口影响子窗口样式。 qobject_cast(sender())可以获取发送者。 (3)实现窗口阴影 需要两层窗口 $设置窗口透明 this->setAttribute(Qt::WA_TranslucentBackground, true); $设置无边框 Qt::Windows $给顶层widget设置背景颜色,不然看不见。 Qt窗口阴影类:QGraphicsDropShadowEffect -> shadow 设置阴影距离: setOffset 设置阴影颜色: setColor 设置区域: setBlurRadius 给顶层widget设置阴影:setGraphicsEffect(shadow); 相当于是:将实际窗口外包了一层,外面层用于透明。 (4)圆角窗口(也要透明,无边框) $1: 重写paintEvent QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿 painter.setBrush(QBrush(QColor(255, 255, 255)); painter.setPen(Qt::transparent); auto rect = this->rect(); painter.drawRoundedRect(rect, 15, 15); // 可以画圆 $2: 使用 qss this->setStyleSheet("QWidget{background-color:gray; border-radius: 30px}"); // 窗口透明后,需要重写该方法 void paintEvent(xxx) { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); QWidget::paintEvent(event); } 12.QSS样式表(Qt Style Sheet) 类似css,但是没有css强大。 13.Qt CEF, QCefView