LinuxForum.Fans
Тема

Qt4 не работает mousePressEvent

Автор: u______9 8 сообщений 4785 просмотров
#41085
text
]хедер 

#include <QGraphicsScene>

#ifndef COLLECTION_H #define COLLECTION_H

#include <QMainWindow> #include <QCloseEvent>

class QAction; class QMenu; class QTextEdit;

class collection:public QMainWindow { Q_OBJECT

public: collection(); ~collection(); void closeEvent(QCloseEvent *event); protected:

void virtual mousePressEvent ( QMouseEvent * e ); private slots: void newFile(); void open(); bool save(); bool saveAs(); void about(); void documentWasModified();

private: void createActions(); void createMenus(); void createToolBars(); void createStatusBar(); void readSettings(); void writeSettings(); bool maybeSave(); void loadFile(const QString &fileName); bool saveFile(const QString &fileName); void setCurrentFile(const QString &fileName); QString strippedName(const QString &fullFileName);

QTextEdit *textEdit; QString curFile;

QMenu *fileMenu; QMenu *editMenu; QMenu *helpMenu; QToolBar *fileToolBar; QToolBar *editToolBar; QAction *newAct; QAction *openAct; QAction *saveAct; QAction *saveAsAct; QAction *exitAct; QAction *cutAct; QAction *copyAct; QAction *pasteAct; QAction *aboutAct; QAction *aboutQtAct; };

сишник

#include <QApplication> #include "collection.h"

#include <QGraphicsView> QGraphicsScene scene; int main(int argc, char *argv[]) { Q_INIT_RESOURCE(application); QApplication app(argc, argv); collection * mw = new collection(); mw->show();

//myPopulateScene(&scene); // извлечь прямоугольник(создать прямоугольник (параметры прямоугольника)) QGraphicsRectItem *rect = scene.addRect(QRectF (0, 0, 50, 100)); // извлечь линию () QGraphicsLineItem *fr = scene.addLine ( 30, 30, 200, 200, QPen(Qt::black) ); int x = 40, y = 40, shirina= 30, visota = 30;

QGraphicsEllipseItem * krug[30]; for(int i = 0; i < 30; i++){ x+=50; if ( x + 30 >= scene.sceneRect().width()) x = 0, y +=40; // конструируем прямоугольник const QRectF kvadrat4ellipse(x, y, shirina, visota); // Qt:: - глобобьное пространство имен Qt // извлечь эллипс (очерченный вокруг, Qt::зеленого цвета,заполнение - плотная кисть ) krug [ i ] = scene.addEllipse (kvadrat4ellipse , QPen(Qt::darkGreen), QBrush(Qt::darkGreen, Qt::Dense2Pattern) ) ; //QGraphicsLineItem *fr = scene.addItem(); } QGraphicsView view(&scene); view.show(); return app.exec(); }

void collection::mousePressEvent ( QMouseEvent * e ){ //QGraphicsScene scene; //myPopulateScene(&scene); // извлечь прямоугольник(создать прямоугольник (параметры прямоугольника)) QGraphicsRectItem *rect = scene.addRect(QRectF (0, 0, 50, 100)); // извлечь линию () QGraphicsLineItem *fr = scene.addLine ( 30, 30, 200, 200, QPen(Qt::black) ); int x = 40, y = 40, shirina= 30, visota = 30;

QGraphicsEllipseItem * krug[300]; for(int i = 0; i < 300; i++){ x+=50; if ( x + 30 >= scene.sceneRect().width()) x = 0, y +=40; // конструируем прямоугольник const QRectF kvadrat4ellipse(x, y, shirina, visota); // Qt:: - глобобьное пространство имен Qt // извлечь эллипс (очерченный вокруг, Qt::зеленого цвета,заполнение - плотная кисть ) krug[i] = scene.addEllipse (kvadrat4ellipse , QPen(Qt::darkGreen), QBrush(Qt::darkGreen, Qt::Dense2Pattern) ) ; //QGraphicsLineItem *fr = scene.addItem(); } QGraphicsView view(&scene); view.show(); }

Объясните, что не так, ставлю точку останова на void collection::mousePressEvent ( QMouseEvent * e ){ .....
, а он туда не попадает.
Спасибо.

#41104

Хомяк,
Сложно сказать, информации недостаточно. В смысле, по приведенным кускам кода не проверишь

#41115

Сказать несложно, т.к. в mousePressEvent не анализируется QMouseEvent.

Пётр.

#42218

Тогда выкладываю все:
collection.h

text

 #include <QGraphicsScene>

#ifndef COLLECTION_H #define COLLECTION_H

#include <QMainWindow> #include <QCloseEvent>

class QAction; class QMenu; class QTextEdit;

class collection:public QMainWindow { Q_OBJECT

public: collection(); ~collection(); void closeEvent(QCloseEvent *event); protected:

void virtual mousePressEvent ( QMouseEvent * e ); private slots: void newFile(); void open(); bool save(); bool saveAs(); void about(); void documentWasModified();

private: void createActions(); void createMenus(); void createToolBars(); void createStatusBar(); void readSettings(); void writeSettings(); bool maybeSave(); void loadFile(const QString &fileName); bool saveFile(const QString &fileName); void setCurrentFile(const QString &fileName); QString strippedName(const QString &fullFileName);

QTextEdit *textEdit; QString curFile;

QMenu *fileMenu; QMenu *editMenu; QMenu *helpMenu; QToolBar *fileToolBar; QToolBar *editToolBar; QAction *newAct; QAction *openAct; QAction *saveAct; QAction *saveAsAct; QAction *exitAct; QAction *cutAct; QAction *copyAct; QAction *pasteAct; QAction *aboutAct; QAction *aboutQtAct; };

#endif extern QGraphicsScene scene;

collection.cpp

text

#include <QtGui> #include "collection.h"

#include <QTextEdit> #include <QTextStream> #include <QCloseEvent> #include <QFileDialog>

#include <QApplication>

// #include <QGraphicsScene> #include <QGraphicsView> collection::collection() { textEdit = new QTextEdit; setCentralWidget(textEdit); createActions(); createMenus(); createToolBars(); createStatusBar(); readSettings(); connect(textEdit->document(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified())); //mousePressEvent ( ) setCurrentFile(""); }

void collection::closeEvent(QCloseEvent *event) { if (maybeSave()) { writeSettings(); event->accept(); } else { event->ignore(); } }

void collection::newFile() { if (maybeSave()) { textEdit->clear(); setCurrentFile(""); } }

void collection::open() { if (maybeSave()) { QString fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) loadFile(fileName); } }

bool collection::save() { if (curFile.isEmpty()) { return saveAs(); } else { return saveFile(curFile); } }

bool collection::saveAs() { QString fileName = QFileDialog::getSaveFileName(this); if (fileName.isEmpty()) return false;

return saveFile(fileName); }

void collection::about() { QMessageBox::about(this, tr("About Application"), tr("The <b>Application</b> example demonstrates how to " "write modern GUI applications using Qt, with a menu bar, " "toolbars, and a status bar.")); }

void collection::documentWasModified() { setWindowModified(true); }

void collection::createActions() { newAct = new QAction(QIcon(":/filenew.xpm"), tr("&New"), this); newAct->setShortcut(tr("Ctrl+N")); newAct->setStatusTip(tr("Create a new file")); connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

openAct = new QAction(QIcon(":/fileopen.xpm"), tr("&Open..."), this); openAct->setShortcut(tr("Ctrl+O")); openAct->setStatusTip(tr("Open an existing file")); connect(openAct, SIGNAL(triggered()), this, SLOT(open()));

saveAct = new QAction(QIcon(":/filesave.xpm"), tr("&Save"), this); saveAct->setShortcut(tr("Ctrl+S")); saveAct->setStatusTip(tr("Save the document to disk")); connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));

saveAsAct = new QAction(tr("Save &As..."), this); saveAsAct->setStatusTip(tr("Save the document under a new name")); connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));

exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcut(tr("Ctrl+Q")); exitAct->setStatusTip(tr("Exit the application")); connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));

cutAct = new QAction(QIcon(":/editcut.xpm"), tr("Cu&t"), this); cutAct->setShortcut(tr("Ctrl+X")); cutAct->setStatusTip(tr("Cut the current selection's contents to the " "clipboard")); connect(cutAct, SIGNAL(triggered()), textEdit, SLOT(cut()));

copyAct = new QAction(QIcon(":/editcopy.xpm"), tr("&Copy"), this); copyAct->setShortcut(tr("Ctrl+C")); copyAct->setStatusTip(tr("Copy the current selection's contents to the " "clipboard")); connect(copyAct, SIGNAL(triggered()), textEdit, SLOT(copy()));

pasteAct = new QAction(QIcon(":/editpaste.xpm"), tr("&Paste"), this); pasteAct->setShortcut(tr("Ctrl+V")); pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current " "selection")); connect(pasteAct, SIGNAL(triggered()), textEdit, SLOT(paste()));

aboutAct = new QAction(tr("&About"), this); aboutAct->setStatusTip(tr("Show the application's About box")); connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));

aboutQtAct = new QAction(tr("About &Qt"), this); aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));

cutAct->setEnabled(false); copyAct->setEnabled(false); connect(textEdit, SIGNAL(copyAvailable(bool)), cutAct, SLOT(setEnabled(bool))); connect(textEdit, SIGNAL(copyAvailable(bool)), copyAct, SLOT(setEnabled(bool))); }

void collection::createMenus() { fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(newAct); fileMenu->addAction(openAct); fileMenu->addAction(saveAct); fileMenu->addAction(saveAsAct); fileMenu->addSeparator(); fileMenu->addAction(exitAct);

editMenu = menuBar()->addMenu(tr("&Edit")); editMenu->addAction(cutAct); editMenu->addAction(copyAct); editMenu->addAction(pasteAct);

menuBar()->addSeparator();

helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAct); helpMenu->addAction(aboutQtAct); }

void collection::createToolBars() { fileToolBar = addToolBar(tr("File")); fileToolBar->addAction(newAct); fileToolBar->addAction(openAct); fileToolBar->addAction(saveAct);

editToolBar = addToolBar(tr("Edit")); editToolBar->addAction(cutAct); editToolBar->addAction(copyAct); editToolBar->addAction(pasteAct); }

void collection::createStatusBar() { statusBar()->showMessage(tr("Ready")); }

void collection::readSettings() { QSettings settings("Trolltech", "Application Example"); QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); QSize size = settings.value("size", QSize(400, 400)).toSize(); resize(size); move(pos); }

void collection::writeSettings() { QSettings settings("Trolltech", "Application Example"); settings.setValue("pos", pos()); settings.setValue("size", size()); }

bool collection::maybeSave() { if (textEdit->document()->isModified()) { int ret = QMessageBox::warning(this, tr("Application"), tr("The document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); if (ret == QMessageBox::Yes) return save(); else if (ret == QMessageBox::Cancel) return false; } return true; }

void collection::loadFile(const QString &fileName) { QFile file(fileName); if (!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this, tr("Application"), tr("Cannot read file %1:\n%2.") .arg(fileName) .arg(file.errorString())); return; }

QTextStream in(&file); QApplication::setOverrideCursor(Qt::WaitCursor); textEdit->setPlainText(in.readAll()); QApplication::restoreOverrideCursor();

setCurrentFile(fileName); statusBar()->showMessage(tr("File loaded"), 2000); }

bool collection::saveFile(const QString &fileName) { QFile file(fileName); if (!file.open(QFile::WriteOnly | QFile::Text)) { QMessageBox::warning(this, tr("Application"), tr("Cannot write file %1:\n%2.") .arg(fileName) .arg(file.errorString())); return false; }

QTextStream out(&file); QApplication::setOverrideCursor(Qt::WaitCursor); out << textEdit->toPlainText(); QApplication::restoreOverrideCursor();

setCurrentFile(fileName); statusBar()->showMessage(tr("File saved"), 2000); return true; }

void collection::setCurrentFile(const QString &fileName) { curFile = fileName; textEdit->document()->setModified(false); setWindowModified(false);

QString shownName; if (curFile.isEmpty()) shownName = "untitled.txt"; else shownName = strippedName(curFile);

setWindowTitle(tr("%1[*] - %2").arg(shownName).arg(tr("Application"))); }

QString collection::strippedName(const QString &fullFileName) { return QFileInfo(fullFileName).fileName(); }

collection::~collection() {

}

void collection::mousePressEvent ( QMouseEvent * e ){ //QGraphicsScene scene; //myPopulateScene(&scene); // извлечь прямоугольник(создать прямоугольник (параметры прямоугольника)) QGraphicsRectItem *rect = scene.addRect(QRectF (0, 0, 50, 100)); // извлечь линию () QGraphicsLineItem *fr = scene.addLine ( 30, 30, 200, 200, QPen(Qt::black) ); int x = 40, y = 40, shirina= 30, visota = 30;

QGraphicsEllipseItem * krug[300]; for(int i = 0; i < 300; i++){ x+=50; if ( x + 30 >= scene.sceneRect().width()) x = 0, y +=40; // конструируем прямоугольник const QRectF kvadrat4ellipse(x, y, shirina, visota); // Qt:: - глобобьное пространство имен Qt // извлечь эллипс (очерченный вокруг, Qt::зеленого цвета,заполнение - плотная кисть ) krug[i] = scene.addEllipse (kvadrat4ellipse , QPen(Qt::darkGreen), QBrush(Qt::darkGreen, Qt::Dense2Pattern) ) ; //QGraphicsLineItem *fr = scene.addItem(); } QGraphicsView view(&scene); view.show(); }

main.cpp

text

#include <QApplication> #include "collection.h"

#include <QGraphicsView> QGraphicsScene scene; int main(int argc, char *argv[]) { Q_INIT_RESOURCE(application); QApplication app(argc, argv); collection * mw = new collection(); mw->show();

//myPopulateScene(&scene); // извлечь прямоугольник(создать прямоугольник (параметры прямоугольника)) QGraphicsRectItem *rect = scene.addRect(QRectF (0, 0, 50, 100)); // извлечь линию () QGraphicsLineItem *fr = scene.addLine ( 30, 30, 200, 200, QPen(Qt::black) ); int x = 40, y = 40, shirina= 30, visota = 30;

QGraphicsEllipseItem * krug[30]; for(int i = 0; i < 30; i++){ x+=50; if ( x + 30 >= scene.sceneRect().width()) x = 0, y +=40; // конструируем прямоугольник const QRectF kvadrat4ellipse(x, y, shirina, visota); // Qt:: - глобобьное пространство имен Qt // извлечь эллипс (очерченный вокруг, Qt::зеленого цвета,заполнение - плотная кисть ) krug[i] = scene.addEllipse (kvadrat4ellipse , QPen(Qt::darkGreen), QBrush(Qt::darkGreen, Qt::Dense2Pattern) ) ; //QGraphicsLineItem *fr = scene.addItem(); } QGraphicsView view(&scene); view.show(); return app.exec(); }

И еще, коллеги, подскажите как добавить кнопки Button и строчку Edit в билдере. Заранее спасибо.

#42267

Петр прав, нужно добавить обработчик мышиных событий. Типа,

e->accept();
if(e->button()==Qt::LeftButton)
{
<blah-blah...>
}

#42361

Я при написании программ на Qt не использовал IDE, набирал текст
в редакторе и у меня не было трудностей ни с кнопками, ни с полями
ввода. Это в 1-й раз дольше, зато даёт полный контроль над программой.

Пётр.

#43632

В продолжении проблемы. Предистория такая, что отдыхая от основной задачи пытаюсь осваивать QT4, нарисовал картинку, после чего решил что надо бы реализовать реакцию на событие, и тут обнаружил что не работает дебаг. Вот что творится :

text

$:  ~/programming/projects/ssss/src$ make
g++ -c -pipe -O2 -D_REENTRANT -Wall -W -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o ssss.o ssss.cpp
g++ -c -pipe -O2 -D_REENTRANT -Wall -W -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o main.o main.cpp
/usr/bin/moc-qt4 -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. ssss.h -o moc_ssss.cpp
g++ -c -pipe -O2 -D_REENTRANT -Wall -W -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o moc_ssss.o moc_ssss.cpp
/usr/bin/rcc -name application application.qrc -o qrc_application.cpp
g++ -c -pipe -O2 -D_REENTRANT -Wall -W -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o qrc_application.o qrc_application.cpp
g++  -o ../bin/ssss ssss.o main.o moc_ssss.o qrc_application.o    -L/usr/lib -lQtGui -lQtCore -lpthread
$: ~/programming/projects/ssss/src$ gdb ../bin/ssss
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
(gdb) list main
No line number known for main.
(gdb) symbol-file /home/gor/programming/projects/ssss/src/main.cpp
"/home/gor/programming/projects/ssss/src/main.cpp": can't read symbols: File format not recognized.
(gdb) file /home/gor/programming/projects/ssss/src/main.cpp

Спасибо.

#43653

-DQT_NO_DEBUG
Вот почему

Войдите или зарегистрируйтесь, чтобы ответить.