qt如何给qt控件介绍手动添加事件

QT中TextEdit控件怎么添加,要在头文件里加什么_qt吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:9,974贴子:
QT中TextEdit控件怎么添加,要在头文件里加什么收藏
QT中TextEdit控件怎么添加,要在头文件里加什么?
让这个世界因为有了我 而有一点点的不一样 而我的世界 不过就是你的心。 专业顶楼党。
学会用QT助手呀,一搜就出来了,就是QTextEdit
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
使用签名档&&
为兴趣而生,贴吧更懂你。或QT多线程有关问题_windows上,用QT设计师设计好框架后如何写代码_可以用复制的步骤动态生成控件吗__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
QT多线程有关问题
windows上,用QT设计师设计好框架后如何写代码
可以用复制的步骤动态生成控件吗
QT多线程有关问题
QT多线程问题qt怎么能把一个线程完全杀死?就是连所占用的空间都回收掉
调用terminate()方法好像不能回收空间啊
------解决方案--------------------C++ GUI Qt4书里有例子,run里检测一个bool变量的值,自己停止,不要外部强制停止。
难道是变成线程指针数组QList&MyThread*& thread_poll,然后qDeleteAll(thread_poll)?
windows上,用QT设计师设计好框架后如何写代码
windows下,用QT设计师设计好框架后怎么写代码?windows下,用QT设计师设计好框架后怎么写代码?
刚学QT,不会整呀
------解决方案--------------------建议从Qt Creator开始,不要从Designer开始。
在Creator里新建Gui工程会生成ui文件让你编辑的,也可以自己添加。
Creator是集成了Designer的,也就是说用Qt Creator既可以写代码又可以编辑ui界面文件。
如果楼主不是非常熟悉VS的话,建议就用Qt Creator吧。
可以用复制的步骤动态生成控件吗
可以用复制的方法动态生成控件吗?如果在Layout布局文件中已经定义好某控件的格式及子控件,能否在代码中直接用复制的方法动态生成同样的控件追加到界面中?
------解决方案--------------------1、LayoutInflator.inflator(layout id, null);//layout id传你的xml文件R.layout.xxx, 返回的view就是那个xml里面定义的东西了,这不就动态生成了
2、直接new出控件进行布局
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:1965人阅读
在我的前一篇文章中,我实现了QLineEdit获得焦点高亮显示与失去焦点恢复原样的操作,是通过重新继承该类,再重构该事件函数的方式。这篇文章紧跟那篇文章,这里要实现的功能也是一样的,而是通过另外不同的方式——事件过滤器(eventFilter)。
Qt的事件模型中提供的事件过滤功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器可以在事件到达该对象前捕获事件,从而起到监视该对象事件的效果。
实现类似功能的另一种方式是通过分别继承不同的控件类,并重构各控件的事件响应函数,但若窗体中包含大量不同的控件时,每一个控件都必须重新继承,然后分别重构不同的事件函数,实现比较复杂。事件过滤器可以实现在窗体中监视全部控件的不同事件,方便实现功能扩展。
#ifndef WIDGET_H
#define WIDGET_H
#include &QWidget&
namespace Ui {
class Widget : public QWidget
explicit Widget(QWidget *parent = 0);
~Widget();
public slots:
bool eventFilter(QObject *,QEvent *);
//注意这里
Ui::Widget *
#endif // WIDGET_H
#include &widget.h&
#include &ui_widget.h&
#include &QPalette&
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
ui-&setupUi(this);
ui-&lineEdit1-&installEventFilter(this);
//在窗体上为lineEdit1安装过滤器
ui-&lineEdit2-&installEventFilter(this);
//在窗体上为lineEdit2安装过滤器
Widget::~Widget()
bool Widget::eventFilter(QObject *watched, QEvent *event)
if (watched==ui-&lineEdit1)
//首先判断控件(这里指 lineEdit1)
if (event-&type()==QEvent::FocusIn)
//然后再判断控件的具体事件 (这里指获得焦点事件)
QPalette p=QPalette();
p.setColor(QPalette::Base,Qt::green);
ui-&lineEdit1-&setPalette(p);
else if (event-&type()==QEvent::FocusOut)
// 这里指 lineEdit1 控件的失去焦点事件
QPalette p=QPalette();
p.setColor(QPalette::Base,Qt::white);
ui-&lineEdit1-&setPalette(p);
if (watched==ui-&lineEdit2)
//这里来处理 lineEdit2 , 和处理lineEdit1 是一样的
if (event-&type()==QEvent::FocusIn)
QPalette p=QPalette();
p.setColor(QPalette::Base,Qt::green);
ui-&lineEdit2-&setPalette(p);
else if (event-&type()==QEvent::FocusOut)
QPalette p=QPalette();
p.setColor(QPalette::Base,Qt::white);
ui-&lineEdit2-&setPalette(p);
return QWidget::eventFilter(watched,event);
// 最后将事件交给上层对话框
另外,我在一本书上看到作者有一个例子是关于动态按钮的:鼠标未按下时没有任何反应,当鼠标左键按下时图片变大,松开鼠标后又恢复原来的状态。其实这个效果和我这个例子是一个道理,也就是监听按钮的按下事件(QEvent::MouseButtonPress)和释放事件(QEvent::MouseButtonRelease)
bool EventFilter::eventFilter(QObject *watched,QEvent *event)
if (watched==Label1)
if (event-&type()==QEvent::MouseButtonPress)
QMouseEvent *mouseEvent=static_cast&QMouseEvent *&
if (mouseEvent-&buttons() && Qt::LeftButton)
// 更换一张大一点的图片
..........
if (event-&type()==QEvent::MouseButtonRelease)
// 重新换回最初那张图片 ...........
return QWidget::eventFilter(watched,event);
— mingw32 @ 1:47 上午
哈哈,这个暑假在家里学习Qt,有了一些理论知识后,就想动手搞个什么小东西,在Qt Demo中看到了一个简单的文本编辑器,我就研究它了,当然Qt带的这个例子功能十分简单,经过几天不断的摸索和实践我也搞了一个类似的,不过功能要强大,而且比Windows 默认带的那个记事本也要强,呵呵,后来就想继续扩充功能,时下十分流行的那个功能“一个窗口多个标签页显示”就如IE8那种,可以在一个窗口打开多个网页,在Qt中当然要用QTabWidget,但是据我所知这个控件并没有提供关闭按钮,这个很麻烦了,google一晚上,在国外某个论坛上看到了解决方案:在Qt
4.5 中 QTabWidget 多了一个属性 tabsClosable ,将其设置为True即可出现关闭按钮。先来张截图吧:
默认情况下,每个标签上的关闭按钮是没有任何响应的,我们需要自己动手为他添加关闭响应。
关闭信号为 & void tabCloseRequested(int index)
关闭函数为 & &void removeTab(int index)
注意关闭标签的是一个普通公共函数,不是槽函数,不可以直接与信号相连,我们需要自己手动定义个接受 int类型的槽函数,然后把参数再传递给关闭函数。
#include &mainwindow.h&
#include &ui_mainwindow.h&
#include &QTabWidget&
#include &QTextEdit&
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
connect(ui-&tabWidget,SIGNAL(tabCloseRequested(int)),this,SLOT(removeSubTab(int)));
MainWindow::~MainWindow()
void MainWindow::removeSubTab(int index)
ui-&tabWidget-&removeTab(index);
void MainWindow::on_pushButton_clicked()
QTextEdit *edit=new QTextE
ui-&tabWidget-&addTab(edit,&hitemp 1&);
— mingw32 @ 1:05 上午
描述:一开始我要实现的目的就是,在一个窗体上有多个可编辑控件(比如QLineEdit、QTextEdit等),当哪个控件获得焦点,哪个控件的背景就高亮用来起提示作用,查了下文档应该用focusInEvent()和focusOutEvent(), 在实际过程中,我犯了十分严重的错误,最开始的时候我是这样做的:我重写了窗体QWidget的这两个函数,然后再在函数体中把QFocusEvent事件传递给窗体上的QLineEdit控件:
void Widget::focusInEvent(QFocusEvent *event)
QLineEdit::focusInEvent(event);
编译的时候报错,说是没有调用对象什么的,后来问了下朋友才得到了完美的答案:
既然是要控件得到焦点改变动作,则应该重写该控件的focusInEvent()和focusOutEvent(),即重写QLineEdit类,再重新定义这两个处理函数,然后再在主程序中,include 我们自己重写的QLineEdit头文件,具体代码如下:
// MYLINEEDIT_H
#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H
#include &QLineEdit&
class MyLineEdit : public QLineEdit
MyLineEdit(QWidget *parent=0);
~MyLineEdit();
protected:
virtual void focusInEvent(QFocusEvent *e);
virtual void focusOutEvent(QFocusEvent *e);
#endif // MYLINEEDIT_H
//myLineEdit.cpp
#include &myLineEdit.h&
MyLineEdit::MyLineEdit(QWidget *parent):QLineEdit(parent)
MyLineEdit::~MyLineEdit()
void MyLineEdit::focusInEvent(QFocusEvent *e)
QPalette p=QPalette();
p.setColor(QPalette::Base,Qt::green);
//QPalette::Base 对可编辑输入框有效,还有其他类型,具体的查看文档
setPalette(p);
void MyLineEdit::focusOutEvent(QFocusEvent *e)
QPalette p1=QPalette();
p1.setColor(QPalette::Base,Qt::white);
setPalette(p1);
//widget.cpp
#include &widget.h&
#include &ui_widget.h&
#include &MyLineEdit.h&
#include &QGridLayout&
#include &QMessageBox&
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
ui-&setupUi(this);
Widget::~Widget()
void Widget::init()
lineEdit1=new MyLineEdit(this);
lineEdit2=new MyLineEdit(this);
gridLayout=new QGridL
gridLayout-&addWidget(lineEdit1,0,0);
gridLayout-&addWidget(lineEdit2,1,0);
setLayout(gridLayout);
上图为程序范例,当某个文本框获得焦点后背景自动填充为绿色,失去焦点后背景恢复白色,这样就达到了我想要的焦点高亮背景提醒功能,但是实际分析想来还是很复杂的,假如我的程序还有QTextEdit、QSpinBox等等控件,那我还要全部都重写这些类,麻烦…我原本以为Qt提供了这种获得与失去焦点的信号,可惜没有,期待以后版本加上,就更加方便了…
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:113099次
积分:1538
积分:1538
排名:第10322名
原创:32篇
转载:83篇
评论:19条
(3)(2)(3)(1)(1)(2)(4)(2)(1)(1)(4)(13)(3)(8)(8)(9)(4)(6)(13)(13)(14)Qt入门:在QMainWindow中动态增加控件 - 推酷
Qt入门:在QMainWindow中动态增加控件
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
原来都是直接在QtDesigner里面拖拖拽拽,今天发现竟然不能将创建的控件添加到主界面上。
QListView *list = new QListView;
QTableView *table = new QTableView;
QSplitter *splitter = new QSplitter;
splitter-&addWidget( tree );
splitter-&addWidget( list );
splitter-&addWidget( table );
1、怎么把splitter放到主界面上呢,碰运气,使用:
&&&&&&& setWidget(splitter);
发现没反应,看类类声明也没啥效果,于是赶快百度一下。
QVBoxLayout
mainLayout
QVBoxLayout
mainLayout-&addWidget(splitter);
&&&&&&& setLayout
mainLayout
发现也没反应。
3、终于找到一个QMainWindows的说明:
Note: Creating a main window without a central widget is not supported. You must
have a central widget even if it is just a placeholder.
centerWindow
this-&setCentralWidget(centerWindow);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout-&addWidget(splitter);
centerWindow-&setLayout(mainLayout);
居然可以了,挺高兴。
4、刚开始测试的时候,使用的不是new出来的指针,而是临时对象,结果没东西。
QStandardItem
时也遇到了这样的问题。
后来突然想到可能是临时释放了,改为new出的指针就可以了。
5、贴一下修改后的一段代码:
QTreeView *tree = new QTreeView;
QListView *list = new QListView;
QTableView *table = new QTableView;
QSplitter *splitter = new QSplitter;
splitter-&addWidget( tree );
splitter-&addWidget( list );
splitter-&addWidget( table );
QWidget *centerWindow = new QWidget;
this-&setCentralWidget(centerWindow);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout-&addWidget(splitter);
centerWindow-&setLayout(mainLayout);
QStandardItemModel *model = new QStandardItemModel( <span style="color:#, <span style="color:# );
for( int r=<span style="color:#; r&<span style="color:#; r++ )
for( int c=<span style="color:#; c&<span style="color:#; c++)
QStandardItem *item =
new QStandardItem( QString(&Row:%1, Column:%2&).arg(r).arg(c) );
if( c == <span style="color:# )
for( int i=<span style="color:#; i&<span style="color:#; i++ )
//item-&appendRow( new QStandardItem( QString(&Item %1&).arg(i) ) );
QStandardItem *child = new QStandardItem( QString(&Item %1&).arg(i) );
child-&setEditable( false );
item-&appendRow( child);
model-&setItem(r, c, item);
tree-&setModel( model );
list-&setModel( model );
table-&setModel( model );
list-&setSelectionMode(QAbstractItemView::SingleSelection);
list-&setAutoFillBackground(true);
table-&setSelectionBehavior( QAbstractItemView::SelectRows );
table-&setSelectionMode( QAbstractItemView::SingleSelection );
6、下一步需要对tree、list进一步设置风格、定制。继续努力。
已发表评论数()
&&登&&&陆&&}

我要回帖

更多关于 qt 自定义控件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信