自定义控件改如何支持鼠标框选。

void_main_void 2015-11-17 05:37:08
目前我的一个自定义控件为:

void CGrid::Mode1()
{
m_ScrollArea = new QScrollArea;
m_Image = new CImageView();
m_Main = new QHBoxLayout(this);

if (m_ScrollArea == nullptr || m_Image == nullptr || m_Main == nullptr)
{
::MessageBox(nullptr, L"系统内存不足,无法启动程序", nullptr, MB_OK);
::ExitProcess(0);
}

m_Main->setMargin(0);
m_Main->setSpacing(0);

m_ScrollArea->setWidget(m_Image);
m_ScrollArea->setFrameShape(QFrame::NoFrame);
m_ScrollArea->setWidgetResizable(true);

m_Main->addWidget(m_ScrollArea);

setLayout(m_Main);
}


其中 CImageView类似我的电脑窗口那种样子


我想实现下面的样子


已近做了,鼠标点击,键盘上下左右的控制。但是最后一个鼠标框选给搞死了。。。。

一开始在
然后CImageView实现paintEvent(); 可以实现,但是鼠标移动到贴图(图片有个CControlImage控件显示图片(相当于一个文件夹)CImageView相当于我的电脑框子)上,
被CControlImage给遮住了 然后。。蛋疼了。

然后到的方案是
在CGrid这个类中实现,鼠标框选,但是不来paintEvent()。。。
然后想自定义一个QHBoxLayout ,自定义后并没有什么卵用。
然后项自定义一个QScrollArea,自定义后并没有什么卵用。
然后自定义QHBoxLayout和QScrollArea,自定义后并没有什么卵用

。。然后我就时在没想法了。求思路。。。。
...全文
266 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
冷静忍耐 2015-11-19
  • 打赏
  • 举报
回复
引用 14 楼 void_main_void 的回复:
[quote=引用 13 楼 u013466477 的回复:] [quote=引用 12 楼 void_main_void 的回复:] [quote=引用 10 楼 u013466477 的回复:] setViewMode(QListView::IconMode);
好吧,ListWidget 自带多选。 还有一个问题是 ,如何才能让图片底部对齐。。 ListWidget 貌似并没有 setAlignment(Qt::AlignHCenter); 的函数。。 setFlow(QListView::TopToBottom); 对ICON没用。。。[/quote] 好像不能对齐,是根据图片大小来的,除非你都缩放成一个大小[/quote] 哎,我ICON设置就是300X300的。。,但是如果图片小雨300X300就变成上图了。。感谢抽空回复。。[/quote] 尺寸不对,可以QPixmap缩放一下,再setIcon(QPixmap)
void_main_void 2015-11-19
  • 打赏
  • 举报
回复
引用 13 楼 u013466477 的回复:
[quote=引用 12 楼 void_main_void 的回复:] [quote=引用 10 楼 u013466477 的回复:] setViewMode(QListView::IconMode);
好吧,ListWidget 自带多选。 还有一个问题是 ,如何才能让图片底部对齐。。 ListWidget 貌似并没有 setAlignment(Qt::AlignHCenter); 的函数。。 setFlow(QListView::TopToBottom); 对ICON没用。。。[/quote] 好像不能对齐,是根据图片大小来的,除非你都缩放成一个大小[/quote] 哎,我ICON设置就是300X300的。。,但是如果图片小雨300X300就变成上图了。。感谢抽空回复。。
冷静忍耐 2015-11-19
  • 打赏
  • 举报
回复
引用 12 楼 void_main_void 的回复:
[quote=引用 10 楼 u013466477 的回复:] setViewMode(QListView::IconMode);
好吧,ListWidget 自带多选。 还有一个问题是 ,如何才能让图片底部对齐。。 ListWidget 貌似并没有 setAlignment(Qt::AlignHCenter); 的函数。。 setFlow(QListView::TopToBottom); 对ICON没用。。。[/quote] 好像不能对齐,是根据图片大小来的,除非你都缩放成一个大小
void_main_void 2015-11-19
  • 打赏
  • 举报
回复
引用 10 楼 u013466477 的回复:
setViewMode(QListView::IconMode);



好吧,ListWidget 自带多选。 还有一个问题是 ,如何才能让图片底部对齐。。

ListWidget 貌似并没有 setAlignment(Qt::AlignHCenter); 的函数。。
setFlow(QListView::TopToBottom); 对ICON没用。。。
void_main_void 2015-11-19
  • 打赏
  • 举报
回复
引用 10 楼 u013466477 的回复:
setViewMode(QListView::IconMode);
你好,为什么我通过继承 QListWidget 来重写 paintEvent() 却无法画出矩形来??重新修改QWidget却可以画出矩形?? QListWidget::paintEvent(e); 我是在一开始进去paintEvent() 时调用的,出来后才执行我的画图,如果去掉QListWidget::paintEvent(e); 也还是不能画图。这是为何??
冷静忍耐 2015-11-18
  • 打赏
  • 举报
回复
引用 9 楼 void_main_void 的回复:
[quote=引用 7 楼 u013466477 的回复:] [quote=引用 5 楼 void_main_void 的回复:] [quote=引用 4 楼 u013466477 的回复:]
这个是你写的?二、QListWidget 我做过,那就是重写paintevent。 ????[/quote] 恩,是偶写的,要选择就是重写paintevent,不过上面的这样还不需要重写。 p = new QLabel 把this加上就可以显示了,而且label要加个背景才看的出 [/quote] QListWidget 不是不能多行吗?我也试过了。只能一列显示。。[/quote] setViewMode(QListView::IconMode);
void_main_void 2015-11-17
  • 打赏
  • 举报
回复
引用 7 楼 u013466477 的回复:
[quote=引用 5 楼 void_main_void 的回复:] [quote=引用 4 楼 u013466477 的回复:]
这个是你写的?二、QListWidget 我做过,那就是重写paintevent。 ????[/quote] 恩,是偶写的,要选择就是重写paintevent,不过上面的这样还不需要重写。 p = new QLabel 把this加上就可以显示了,而且label要加个背景才看的出 [/quote] QListWidget 不是不能多行吗?我也试过了。只能一列显示。。
冷静忍耐 2015-11-17
  • 打赏
  • 举报
回复
p->resize(m_b.rx(), m_e.ry());这个是当前的点,你得减掉preese时的点,才是resize的尺寸
冷静忍耐 2015-11-17
  • 打赏
  • 举报
回复
引用 5 楼 void_main_void 的回复:
[quote=引用 4 楼 u013466477 的回复:]
这个是你写的?二、QListWidget 我做过,那就是重写paintevent。 ????[/quote] 恩,是偶写的,要选择就是重写paintevent,不过上面的这样还不需要重写。 p = new QLabel 把this加上就可以显示了,而且label要加个背景才看的出
void_main_void 2015-11-17
  • 打赏
  • 举报
回复
引用 4 楼 u013466477 的回复:
我在mousePressEvent里面new,但是框子都没出来啊。。。。 我写的有问题还是怎么的啊。。。。
void CImageView::mouseMoveEvent(QMouseEvent * event)
{
    m_e = event->pos();
    p->resize(m_b.rx(), m_e.ry());
}

void CImageView::mousePressEvent(QMouseEvent * event)
{
    m_b = event->pos();

    p = new QLabel;
    p->setGeometry(m_b.rx(), m_b.ry(), m_e.rx(), m_e.ry());
}
void_main_void 2015-11-17
  • 打赏
  • 举报
回复
引用 4 楼 u013466477 的回复:
这个是你写的?二、QListWidget 我做过,那就是重写paintevent。 ????
冷静忍耐 2015-11-17
  • 打赏
  • 举报
回复
冷静忍耐 2015-11-17
  • 打赏
  • 举报
回复
引用 2 楼 void_main_void 的回复:
[quote=引用 1 楼 u013466477 的回复:] 你里面是个QListWidget吧 被CControlImage给遮住了,那你先让listWidget画item,然后画你的选择框就好了。
没有使用QListWidget。。 直接是自己动态new QHBoxLayout 和add到 QVBoxLayout 刚在我就在找 QListWidget 的资料。这东西貌似不能 显示多行,只能显示最左边一列啊。。[/quote] 一、自己加的add到QVBoxLayout,那你要做选择框,只能根据mouseMove事件 然后不是重写paintevent而是新建一个label或其他控件然后resize控件就好了,要选择框消失则删除控件。 二、QListWidget 我做过,那就是重写paintevent。 两种方法都可以。
void_main_void 2015-11-17
  • 打赏
  • 举报
回复
引用 1 楼 u013466477 的回复:
你里面是个QListWidget吧 被CControlImage给遮住了,那你先让listWidget画item,然后画你的选择框就好了。
没有使用QListWidget。。 直接是自己动态new QHBoxLayout 和add到 QVBoxLayout 刚在我就在找 QListWidget 的资料。这东西貌似不能 显示多行,只能显示最左边一列啊。。
冷静忍耐 2015-11-17
  • 打赏
  • 举报
回复
你里面是个QListWidget吧 被CControlImage给遮住了,那你先让listWidget画item,然后画你的选择框就好了。

16,201

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧