QT 鼠标右击点击事件 让QWidget等组件支持右键菜单 QSplitter-窗口分割器 - 拉伸控件 disable C4819 warning

前言

在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中引入。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值