Qt QTableView不能响应鼠标点击

PYB不开心 2016-04-08 05:14:44
首先经过测试,用QtDesigner加入一个Table Widget,它可以响应鼠标点击的事件,我可以选中里面的item。
然后如果我写这样的代码:
 
w.view->setModel(model);//view是主窗口w的一个private成员
w.view->setSelectionMode(QAbstractItemView::ExtendedSelection);//设置每次选中的个数(单个,多个)
w.view->setSelectionBehavior(QAbstractItemView::SelectItems);//设置选中的形式(行,列,单个)
// view->setColumnHidden(0, true);
w.view->verticalHeader()->setVisible(false);//隐藏表头
w.view->resizeColumnsToContents();//列的宽度自适应内容
w.view->setEditTriggers(QAbstractItemView::NoEditTriggers);
QHeaderView *header = w.view->horizontalHeader();
header->setStretchLastSection(true);
int width = w.geometry().width()/2;
int height =w.geometry().height()/2;


w.view->setGeometry(width,height,width,height);//这样控制位置就不能选中里面的item
// w.setCentralWidget(w.view);//如果这样控制view的位置,就可以选中view里面的item.

w.view->show();

搞了半天没弄明白原因,按理来说子窗口应该先于父窗口响应鼠标点击的,但是view就是不能选中,滚动条也不能动.我的问题:
[0]:为什么用.setCentralWidget我的view就可以选中,用setGeometry设置下view的位置就出现这样的情况?
//不能选中
//可以选中
...全文
1699 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
PYB不开心 2016-04-12
  • 打赏
  • 举报
回复
引用 6 楼 killerls 的回复:
楼主可以看一下,setupui的代码,好像这个代码里面做了很多布局相关的工作。是不是你的view实际上被mainwindow的centialwidget覆盖了,只不过centralwidget是透明的?
有可能哈,我是初学者,不知道mainwindow还有个centralwidget.....我再看看.
killerls 2016-04-11
  • 打赏
  • 举报
回复
楼主可以看一下,setupui的代码,好像这个代码里面做了很多布局相关的工作。是不是你的view实际上被mainwindow的centialwidget覆盖了,只不过centralwidget是透明的?
PYB不开心 2016-04-09
  • 打赏
  • 举报
回复
引用 3 楼 caoshangpa 的回复:
我试了一下,可以选中呀
我找到问题代码了:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),view(new QTableView(this)),//这样就可以
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
//view =  new QTableView(this);//这样就不行


}
我在函数体之前初始化view就不能选中,在函数体里面初始化就不行,然后我试了一下这样的代码
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),//view(new QTableView(this)),//这样就可以
    ui(new Ui::MainWindow)
{

view =  new QTableView(this);//这样就不行
 ui->setupUi(this);

}
发现是ui必须在view的初始化之前加载界面...我想请教一下ui加载顺序为什么会造成这种情况?
草上爬 2016-04-09
  • 打赏
  • 举报
回复
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTableView> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QTableView *view; private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); view=new QTableView(this); } MainWindow::~MainWindow() { delete ui; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include "mainwindow.h" #include <QApplication> #include <QHeaderView> #include <QStandardItemModel> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; QStandardItemModel *model = new QStandardItemModel(); model->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr("ID"))); model->setHorizontalHeaderItem(1, new QStandardItem(QObject::tr("Name"))); model->setHorizontalHeaderItem(2, new QStandardItem(QObject::tr("Age"))); model->setItem(0, 0, new QStandardItem("1")); model->setItem(0, 1, new QStandardItem("cheng")); model->setItem(0, 2, new QStandardItem("24")); model->setItem(1, 0, new QStandardItem("2")); model->setItem(1, 1, new QStandardItem("jack")); model->setItem(1, 2, new QStandardItem("23")); w.view->setModel(model);//view是主窗口w的一个private成员 w.view->setSelectionMode(QAbstractItemView::ExtendedSelection);//设置每次选中的个数(单个,多个) w.view->setSelectionBehavior(QAbstractItemView::SelectItems);//设置选中的形式(行,列,单个) // view->setColumnHidden(0, true); w.view->verticalHeader()->setVisible(false);//隐藏表头 w.view->resizeColumnsToContents();//列的宽度自适应内容 w.view->setEditTriggers(QAbstractItemView::NoEditTriggers); QHeaderView *header = w.view->horizontalHeader(); header->setStretchLastSection(true); int width = w.geometry().width()/2; int height =w.geometry().height()/2; w.view->setGeometry(width,height,width,height);//这样控制位置就不能选中里面的item // w.setCentralWidget(w.view);//如果这样控制view的位置,就可以选中view里面的item. w.show(); return a.exec(); } 我尽量按照你的方法写的代码
草上爬 2016-04-09
  • 打赏
  • 举报
回复
我试了一下,可以选中呀
PYB不开心 2016-04-09
  • 打赏
  • 举报
回复
引用 1 楼 caoshangpa 的回复:
w是个什么类型的变量
是一个继承自QMainwindow的类的实例.
草上爬 2016-04-09
  • 打赏
  • 举报
回复
w是个什么类型的变量
采用C/S模式,完成一前台(服务器)对多客服端通讯,用Mysql数据库保存信息; 主要技术: 1.采用TCP/IP协议,容器完成服务端与多客户端的链接 服务端: server=new QTcpServer(this);建立端口 server->listen(QHostAddress::Any,PORT);监听端口 connect(server,SIGNAL(newConnection()),this,SLOT(accpetConnection()));等待用户链接 QTcpSocket* temp = server->nextPendingConnection();建立链接 client.push_back(temp);用户压栈 connect(temp,SIGNAL(readyRead()),this,SLOT(readData()));当端口有数据就读 读数据时先用迭代器遍历容器找到发送信息的客户端,再解析数据并响应 客户端: client=new QTcpSocket(this);建立端口 client->connectToHost(IP,PORT);链接主机 connect(client,SIGNAL(readyRead()),this,SLOT(readData()));端口有数据就读 2.界面布局 服务器 a.主菜单,预订,开台,换台,电子账单功能项采用QToolButton文字置于图片下面,水平布局 b.当前餐台信息与总餐台状态信息用QLabel垂直布局放于主窗体左侧 c.餐台信息采用QGraphicsView+QGraphicsScene+QGraphicsItem布局,view与item需要重写自己的类,Item包括图片与文本信息;将Item放入墙纸scene中,墙纸scene贴到墙view上完成显示。 客户端 a.选择桌号与人数用QLabel,对应的下拉选项用QComboBox,确认,呼叫与结账功能用QToolButton,这些控件水平布局放置于窗体最上方 b.左侧用QTabWidget其中加入特价菜单与我的菜单两个子窗体 c.中间为QGraphicsView+QGraphicsScene+QGraphicsItem布局,布局菜单图片与价格名称,菜单信息服务器发送至客户端与客户端的图片匹配起来。 d.右侧为菜单类型分类按键,采用垂直布局 3.信号与槽机制的运用 a.预订,开台,换台功能的实现:点击对应的按钮触发clicked()信号,与之对应的槽函数中QToolButton *btn = (QToolButton *)sender();区分信号源,弹出对应的子窗体让用户输入相应信息,按确定按钮修改SQL对应Table内容然后发送输入信息信号,主窗体接受到信号调用槽函数(相应窗体成员调用其布局函数重布局)重新布局整个界面(餐台信息与左侧总餐台状态同时更新) b.鼠标悬浮于餐台信息Item时图片放大:改写了QGraphicsSceneMouseEvent事件实现 c.主菜单与电子账单的显示采用QSqlTableModel+QTableView加载整个SQL中相应的Table显示Table内容

16,228

社区成员

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

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