Qt学习笔记:2018年8月记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33559992/article/details/82011731

1. Qt 设置背景图片注意事项:

使用stylesheet设置背景图片还是有一些要注意的,如果是在mainwindow和dialog中,
直接右键change style sheet在add resource中选择background-image或者border-image,
选择资源文件中的图片就行了(前者是按像素显示图片,后者可根据窗体大小来自动缩放图片),

但在widget中就不行,你会发现,用同样的方法,背景并没有发生改变,而仅仅是它的子窗体背景图片发生了改变。

那么在widget中要如何做呢,我们在widget中放置一个frame,然后对frame通过stylesheet设置背景,后面窗体里所有的部件都放在这个frame里。

子窗体会继承父窗体的属性,也就是说,父窗体的背景,在子窗体中也会有,
那如何让子窗体不继承父窗体的背景呢,同样的,还是在Edit Style Sheet里,需下输入如下代码:

    QFrame *frame = new QFrame;
     frame->setObjectName("myframe");//1
     frame->resize(400,700);
     frame->setStyleSheet("QFrame#myframe{border-image:url(images/frame.png)}" );//2
     frame->show();

2. 自定义右键菜单:

1.widget对象设置 setContextMenuPolicy(Qt::CustomContextMenu)
2.创建一个QMenu对象, 指定好父类指针
3.关联widget的 customContextMenuRequested(QPoint) 信号到自定义的槽

connect(ui->tbvFileLog,SIGNAL(customContextMenuRequested(QPoint)),
        this, SLOT(FileLogTbvPopupMenu(QPoint)));

4.在槽函数里面执行Qmenu对象的exec方法
exec(QCursor::pos());

补充: QMenu菜单添加菜单项:
QMenu对象调用addAction方法, 通过信号槽关联这个QAction的点击事件

3. QT 焦点事件

设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。
这就是由于搜索框设置了焦点。

一个控件要先设置它焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、Tab键、不接受焦点事件等)

void setFocusPolicy ( Qt::FocusPolicy policy )

当前有焦点事件的窗口只能有一个,当一个窗口获取焦点事件或失去焦点事件时,可能需要相应的操作,或者如何判断一个才窗口有没有焦点事件。Qt中亦有相应的函数。

void QWidget::focusInEvent ( QFocusEvent * event ) [virtual protected]
void QWidget::focusOutEvent ( QFocusEvent * event ) [virtual protected]

这两个就是窗口获取或失去焦点事件的函数,需要我们重写(好多窗口都是从QWidget继承这两个函数的)

bool hasFocus () const
这个函数就是判断当前窗口有没有焦点事件的,返回布尔值。

void QWidget::setFocus ( Qt::FocusReason reason )
void QWidget::clearFocus ()
这两个函数就是设置或清除焦点事件的。

4. paintEvent ()使用和触发

当发生一下情况时会产生绘制事件并调用paintEvent()函数:

  1. 在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件。
  2. 当重新调整窗口部件的大小时,系统也会产生一个绘制事件。
  3. 当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一个绘制事件。
  4. 调用QWidget::update()或者QWidget::repaint()来强制产生一个绘制事件。二者的区别是:
    repaint()函数会强制产生一个即时的重绘事件,
    而update()函数只是在Qt下一次处理事件时才调用一次绘制事件。

如果多次调用update(),Qt会把连续多次的绘制事件压缩成一个单一的绘制事件,这样可避免闪烁现象。

5. installEventFilter 安装事件过滤器

void QObject::installEventFilter(QObject *filterObj);

filterObj参数表示要在其上实现事件过滤器函数的部件(widget)。
请注意,如果我们在一个部件安装了事件过滤器,一般在其父控件上实现事件过滤器函数。

给QObject对象安装事件过滤器:对象调用installEventFilter()后,所有到达目标控件的事件都首先到达监视对象的eventFilter()函数。

如果一个对象有多个事件过滤器,过滤器按顺序激活,先到达最近安装的监视对象,最后到达最先安装的监视对象。

eg:
monitoredObj-> installEventFilter(filterObj);
事件过滤器是一个接收发送到此对象的所有事件的对象。过滤器可以停止事件或将其转发到此对象。
事件过滤器filterObj通过其eventFilter()函数接收事件。
如果事件要过滤(或停止),eventFilter()函数必须返回true; 否则必须返回false。
如果在单个对象上安装了多个事件过滤器,则首先激活最后安装的过滤器。

6. 自定义QPushButton控件,重写鼠标事件后不发出clicked()信号。

自定义Button控件继承自QPushbutton,然后重写鼠标事件mousePressEvent。会发现在父类中调用该自定义的button,没有发出clicked()信号。
原因是:当重写完成以后,需要在每个事件中添加:

//保留原有QPushButton的点击事件
void QPushButton::mousePressEvent(e);

eg:

//重写鼠标释放事件
void myButton::mouseReleaseEvent(QMouseEvent*e)
{
    if(e->button()==Qt::RightButton)
    {
        m_menu.exec(QCursor::pos());//右键显示菜单
    }
    //保留原有QPushButton点击事件
    QPushButton::mouseReleaseEvent(e);//不添加该句会造成不释放clicked()信号。
}

7. 不改变ui ,移除QTabWidget中的一些tab不显示。

QTabWdiget中,需要不改变ui.通过代码移除一些tab不显示。
则可以通过:
先移除整张TabWidget 然后在添加需要显示的某一页。

    ui->m_tabWidget->clear();
    ui->m_tabWidget->addTab(ui->tab_7,"显示的tab");

8. QListWidget的item设置成只识别鼠标左键点击.

在QListWidget的使用中,不管是鼠标左键还是右键点击item项,都回响应 itemClicked()信号。
而有时候我们需要的是,只有鼠标左键才会选中item 右键不响应,
我们可以通过继承QListWidget类,重写:

void MyListWidget::mousePressEvent(QMouseEvent *e)
{
    //只有在鼠标左键按下的时候,才会保留原有的点击事件
        if(e->button()==Qt::LeftButton)
        {
            emit clicked(index);        
            //要继续保留QListWidget原有的点击事件. 
            QListWidget::mousePressEvent(e);//
        }
}

猜你喜欢

转载自blog.csdn.net/qq_33559992/article/details/82011731