QT 鼠标右击点击事件 让QWidget等组件支持右键菜单 QSplitter-窗口分割器 - 拉伸控件 disable C4819 warning 原创
QT 鼠标右击点击事件 让QWidget等组件支持右键菜单
前言
在Qt中,如何为自己创建的按钮添加鼠标右键点击功能,这里以QWidget为例子,添加右键菜单
重写右击事件
protected:
//重写右击事件
virtual void mousePressEvent(QMouseEvent *event) //右键事件
{
switch (event->button()) {
case Qt::RightButton:
emit clicked_right(); //发送右键单击信号
break;
}
//将该事件传给父类处理
QWidget::mousePressEvent(event);
}
槽函数
void MainWindow::RightClick() //重绘鼠标右键事件处理函数(增加菜单选项)
{
QMenu* menu = new QMenu();
QCursor cur = this->cursor();
menu->addAction("动作1");
menu->addAction("动作2");
menu->addAction("动作3");
menu->exec(cur.pos()); //关联到光标
menu->show();
}
信号和槽
connect(this,SIGNAL(clicked_right()),this,SLOT(RightClick())); //连接label标签点击事件,此处不连接就不会弹出右键菜单
QSplitter-窗口分割器 - 拉伸控件
想要实现主窗口内的控件可以跟随鼠标随意拉伸缩放,可以通过该控件实现。
/***3.先水平,后垂直****/
QHBoxLayout *pHBox = new QHBoxLayout(this);
QSplitter *pSplitter = new QSplitter(Qt::Orientation::Horizontal, this);//水平
pSplitter->setStyleSheet("QSplitter:handle{background-color:grey}");
QLabel* labelFile = new QLabel("文件目录:");
QLineEdit* lineFile = new QLineEdit("路径");
labelFile->setFixedSize(60,30);
lineFile->setFixedHeight(30);
pSplitter->addWidget(labelFile);
pSplitter->addWidget(lineFile);
QSplitter *pSplitter1 = new QSplitter(Qt::Orientation::Horizontal, this);//水平
pSplitter1->addWidget(new QTreeWidget());
pSplitter1->addWidget(new QTreeWidget());
pSplitter1->setStretchFactor(0,2);
pSplitter1->setStretchFactor(1,4);
QSplitter *pSplitter2 = new QSplitter(Qt::Orientation::Horizontal, this);//水平
QLabel* labelFileName = new QLabel("文件名字:");
QLineEdit* lineFileName = new QLineEdit("路径1");
labelFileName->setFixedSize(60,30);
lineFileName->setFixedHeight(30);
pSplitter2->addWidget(labelFileName);
pSplitter2->addWidget(lineFileName);
QSplitter *pSplitter3 = new QSplitter(Qt::Orientation::Horizontal, this);//水平
QLabel* labelFileType = new QLabel("文件类型:");
QLineEdit* lineFileType = new QLineEdit("路径2");
labelFileType->setFixedSize(60,30);
labelFileType->setFixedHeight(30);
pSplitter3->addWidget(labelFileType);
pSplitter3->addWidget(lineFileType);
QSplitter *pSplitterV = new QSplitter(Qt::Orientation::Vertical, this);//垂直
pSplitterV->addWidget(pSplitter);
pSplitterV->addWidget(pSplitter1);
pSplitterV->addWidget(pSplitter2);
pSplitterV->addWidget(pSplitter3);
pHBox->addWidget(pSplitterV);
效果图
其中可以设置比例:setStretchFactor方法
`
QSplitter *pSplitter1 = new QSplitter(Qt::Orientation::Horizontal, this);//水平
pSplitter1->addWidget(new QTreeWidget());
pSplitter1->addWidget(new QTreeWidget());
pSplitter1->setStretchFactor(0,2);
pSplitter1->setStretchFactor(1,4);
Qt使用MSVC编译器关闭“C4100:未引用的形参”警告的方法
出现的问题:
在C++中,定义函数中出现没有引用过的形参发出警告:“C4100:未引用的形参”。
Qt如果配置使用MSVC编译器,qmake生成makefile文件时,会默认打开C4100的编译告警开关。
解决方法一:
1:打开文件
”C:\Qt\Qt5.13.2\5.13.2\msvc2017_64\mkspecs\common\msvc-based-version.conf“
2. 找到“QMAKE_CXXFLAGS_WARN_ON”项,删除后面的“-w34100”,保存,关闭。
3. QtCreator中:右键-清除-构建-重新构建项目。
解决方法二:(屏蔽单个警告)
在工程文件.pro里面添加
disable C4819 warning
QMAKE_CXXFLAGS_WARN_ON += -wd4819
解决方法三:
预编译代码到公共头文件里
#pragma warning( disable : 4819 )
解决方法四:(屏蔽所有警告)
在工程文件.pro里面添加,然后clear项目重新编译即可
disable all warning and debug
DEFINES += QT_NO_WARNING_OUTPUT
QT_NO_DEBUG_OUTPUT
放在左下角
LabDispCoordVal->resize(200,50);
LabDispCoordVal->move(QWidget::rect().width()-200,QWidget::rect().height()-50 );
connect的第五个参数
enum Qt::ConnectionType
此枚举描述了可以在信号和槽之间使用的连接类型。特别地,它确定特定信号是立即传送到槽还是排队等待稍后传送。
AutoConnection
(默认值)如果接收器位于发出信号的线程中,则使用Qt::DirectConnection。否则,将使用Qt::QueuedConnection。连接类型是在发出信号时确定的。
##DirectConnection
发出信号时会立即调用槽。槽在信号线程中执行。
QueuedConnection
当控制返回到接收器线程的事件循环时,将调用slot。槽在接收器的线程中执行。
BlockingQueuedConnection
与Qt::QueuedConnection相同,只是信号线程会阻塞直到槽返回。如果接收器位于信令线程中,则不得使用此连接,否则应用程序将死锁。
UniqueConnection = 0x80
这是一个标志,可以使用逐位OR与上述任何一种连接类型组合。设置Qt::UniqueConnection时,如果连接已存在(即,如果同一信号已连接到同一对对象的同一插槽),则QObject::connect()将失败。此标志在问题4.6中引入。